@expressive/dom

中文文档
0.12.1发布于 2026/11/12MITTypeScriptES Module零依赖构建来源已验证近 30 天下载 2501

MVC-内置 DOM 渲染器.

中文使用文档

@ 表达/ dom

MVC-本土JSX为浏览器DOM渲染.


@expressive/dom 使表达式MVC不作回放或Preact. 函数组件是渲染器无状态:它们将道具和MVC快照投射到DOM中,同时 Model.get() 用品依赖跟踪。 所属国家生活在班级中----一个构成部分领域或 <Component for>。 。 。 .

npm install @expressive/mvc @expressive/dom
{
  "compilerOptions": {
    "jsx": "react-jsx",
    "jsxImportSource": "@expressive/dom"
  }
}
import { Model, Component } from '@expressive/mvc';
import { render } from '@expressive/dom';

class Counter extends Model {
  count = 0;
  increment() {
    this.count++;
  }
}

function Count() {
  const { count, increment } = Counter.get();
  return <button onClick={increment}>{count}</button>;
}

const unmount = render(
  <Component for={Counter}><Count /></Component>,
  document.getElementById('app')!
);

style 递归地构成有条件的类符号和内含声明. 字符串成为类;对象将从左到右并渲染入内. 使用 className 用于构成以外的浏览器特定类。 这个 class 不支持属性拼写和 CSS 声明字符串.

<button
  className="external-widget"
  style={[styles.button, active && 'active', { width }]}
/>

style 自动到达其主机根,包括通过组件、碎片、提供者、门户和收集边界。 一个片段应用到每个主机根上. 前进的样式超越了根本身,最外层的呼叫者获胜. 读取其 style prop在渲染时拥有放置,没有转发. 它接收一个被冻结的呼叫者内在声明的对象—— 传播,取出或自由合并; 呼叫者的班级与它一起旅行. className 仅适用于要件.

组件可登记不可变的地图 style(Component, map)A级 _name 条目是一条规则,由真理应用 _name 属性或匹配的主机标签,并作为以源命名的类释放; 嵌入在规则内,它打开了后人范围。 组件名称与时俱进 - 它们无法幸存。 赤色密钥是声明,或宏调用,一个宏拥有名称,而位于地图上方的那些则构成适用于每个组件主机根的基规则. macros是一种方法 Style 子类,其 use() 返回时 style 解析它们; 将地图传给 use() 对它样式的每个组件,在每一个组件本身的下方,都持有规则;地图内的一个函数是一个值,而不是一个定义. $name 键应用一个由 $1 命名的条件 $name 字段,或设置 CSS 变量 $name 字段声明 - 其价值为 :root 默认,或 a --name ; 地图可能是接收到的函数 var() 提到他们. _ 属性永远不会到达 DOM,以及 0 或者说 '' 留下一条规则。 地图从未到达子组件内;只有类链继承.

function Button({ active }: { active: boolean }) {
  return <button _active={active}>Save</button>;
}

style(Button, {
  padding: '8px',
  _active: { fontWeight: 700 }
});

组件第一次渲染前的注册样式 。 一个密钥在最顶端定义, 子类中先解决; 一个宏返回自己的名字会降入下一个定义, 然后通过任意 default(value, key) 方法。 未处理的密钥到达主机, 主机会加入数组并拒绝函数和对象—— 单位属于宏, 永远不会猜测 .

内线风格总是比班级好;在班级中,呼叫者的规则比被呼叫者的规则好,而规则则通过更多的组件来传递 style 道具胜出 - 独立于渲染顺序. false, (中文(简体) ), null,以及 undefined 省略条目; 0 仍然是宏观的争论.

Component 保留适配器的语义: 字段读取 render() 是由依赖关系、自有实例挂起并用 DOM 范围清理,外部激活实例可以直接放置而不转移所有权.

第一次发布包括密钥调和,本土事件,裁判,SVG, <Component for> 供应商,直接 has 编号 : map 收集渲染、门户、懒惰组件、错误和悬念倒置、生成组件外观规则、保留承诺内容,同时 pending() 工作暂停。 它刻意排除了独立的钩子,合成事件,备忘录包装,SSR,水合,和建筑时态取出.

见 dOM 渲染器指南 对于API和制约。 这个软件包目前针对浏览器DOM;本土渲染和构建时的表达-jsx提取不包括在内.

许可证

麻省理工学院

版本与发布记录

@expressive/dom 共发布 17 个版本,首次发布于 2026/09/28;过去 12 个月发布了 17 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.12.1latest2026/11/122 天前
0.12.02026/11/113 天前
0.11.02026/11/103 天前
0.10.12026/11/095 天前
0.10.02026/11/059 天前
0.9.02026/11/0311 天前

关于 @expressive/dom 的常见问题

@expressive/dom 是什么?

MVC-内置 DOM 渲染器.

如何安装 @expressive/dom?

在项目目录运行 npm install @expressive/dom,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:@expressive/mvc(^0.94.3)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@expressive/dom 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@expressive/dom 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@expressive/dom 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=20。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@expressive/dom 可以商用吗?

@expressive/dom 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@expressive/dom 的下载量有多少?

根据 npm 官方下载统计,@expressive/dom 在 2026/10/14 – 2026/11/12 这 30 天内被下载 2,501 次,日均约 83 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@expressive/dom 还在维护吗?

最新版本 0.12.1 发布于 2026/11/12(2 天前);至今共发布 17 个版本,其中过去 12 个月发布了 17 个;首次发布于 2026/09/28。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。