# @expressive/mvc 中文文档

规范地址：https://npmcn.com/package/%40expressive/mvc/

版本：0\.94\.5
npm 元数据更新时间：2026-11-14T05:08:41.206Z
中文译文更新时间：2026-11-14T06:08:47.618Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40expressive/mvc
原文对照：https://npmcn.com/package/%40expressive/mvc/?lang=original
项目主页：https://github.com/gabeklein/expressive#readme
源码仓库：https://github.com/gabeklein/expressive

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：571 kB，71 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- Node.js 要求：\>=20
- 运行依赖：0 个
- 首次发布：2021-06-21T22:11:34.045Z
- 最新版本发布：2026-11-14T05:08:40.857Z
- 近 30 天下载量：3022（2026-10-14 至 2026-11-12，npm 官方下载统计）
- 已发布版本数：236（近 12 个月 32 个）

## 中文简介

基于阶级的反应状态管理 - Expressive MVC的框架-不可知性核心.

## 安装

```sh
npm install @expressive/mvc
```

也可以使用：`pnpm add @expressive/mvc`、`yarn add @expressive/mvc`、`bun add @expressive/mvc`

## README

# @ 表达/ mvc

基于阶级的被动状态管理——框架-不可知性核心.

[![NPM](https://badge.fury.io/js/%40expressive%2Fmvc.svg)](https://www.npmjs.com/package/@expressive/mvc) [![Coverage](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fgabeklein%2Fexpressive%2Fbadges%2Fcoverage.json)](https://github.com/gabeklein/expressive/actions/workflows/coverage.yml)

* * *

核心内容 [表达式 MVC](https://github.com/gabeklein/expressive):反应性原始人围绕平原阶级而建,没有框架依赖. 规定 `Model` 类、 指令、 上下文, 以及 渲染器 - 不可知 `Component` 适配器喜欢 [`@expressive/react`](https://www.npmjs.com/package/@expressive/react) 继续前进.

> **建立反应应用程序?** 安装 [`@expressive/react`](https://www.npmjs.com/package/@expressive/react) 与此软件包并列 - 适配器声明 `@expressive/mvc` 作为同伴的依赖, 所以两者都属于你的 `package.json`导入 `Model`, (中文(简体) ), `Component`,然后从此软件包中导入适配器一次,然后主机注册。 也一样 [`@expressive/dom`](https://www.npmjs.com/package/@expressive/dom),没有反应的渲染器.

它单独安装,为主机不可知码服务——共享域包,节点服务,或新适配器:

```bash
npm install @expressive/mvc
```

## 型号

A 类 `Model` 是一个类,其字段是被动的 - 读取以订阅,指定以更新。 获取器是缓存计算值 .

```ts
import { Model } from '@expressive/mvc';

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

  get doubled() {
    return this.count * 2;     // recomputes only when count changes
  }
}

const counter = Counter.new();

// effect runs now, then again whenever read values change
counter.get(({ count }) => {
  console.log(`count is ${count}`);
});

counter.increment();           // -> "count is 1"
```

任何地点都进行试验,不需要制造器.

## 说明

改变属性行为方式的字段初始化器 :

|  |  |
| --- | --- |
| `ref()` | 仍然具有反应性的可变参照物(例如DOM节点) |
| `set()` | 计算值、 智能设置器、 任务副作用 |
| `get()` | 依赖性注射-再拉一拉 `Model` 从上下文 |
| `map()` | 浅反应映射 |
| `has()` | 自有反应收集 -- -- 命令列表或产卵池 |

```ts
import { Model, set, has, map } from '@expressive/mvc';

class Cart extends Model {
  items = has<Item>();                      // reactive collection
  products = map<string, Product>();        // reactive keyed collection
  coupon = set('', code => apply(code));    // side-effect on assignment
}
```

## 生命周期

```ts
class Timer extends Model {
  seconds = 0;

  new() {                              // runs once on activation
    const id = setInterval(() => this.seconds++, 1000);
    return () => clearInterval(id);    // returned cleanup runs on destroy
  }
}

const timer = Timer.new();   // construct + activate
timer.set(null);             // destroy - runs cleanup, freezes state
```

在服务器上制作的主机下, `new()` 仍然运行在那里,但它的清理从来没有做 - 所以这样的客户端资源会进入 `mount()` 相反, 它只运行在客户端上; 见主机的文档 .

## 背景组成

案例通过上下文互相发现,通过互相持有来作曲:

```ts
import { Model, get } from '@expressive/mvc';

class Session extends Model {
  user = 'guest';
}

class Profile extends Model {
  session = get(Session);    // injected from the nearest provider
  address = new Address();   // nested instance - its changes bubble up
}
```

`<Component for={Model}>` - 这个包裹的一部分 - 放置一个 `Model` 在一棵树上,有如 [`@expressive/react`](https://www.npmjs.com/package/@expressive/react) 让它,和 `get()` 把箱子拉出来.

## 活动

任何财产或任意的密钥都可以发送和监听:

```ts
const off = counter.set('refresh', () => reload());   // listen
counter.set('refresh');                               // dispatch
off();                                                // stop listening
```

## 框架不可知性组成部分

`@expressive/mvc` 舰载自己的JSX运行时间,因此您可以针对核心编写组件——包括可再使用的库——并让任何主机提供:

```jsonc
// tsconfig.json
{
  "compilerOptions": {
    "jsx": "react-jsx",
    "jsxImportSource": "@expressive/mvc"
  }
}
```

`Component` - 一个 `Model` 可以在JSX中使用 - 住在这里,与 `<Component for>`:道具,子组件,悬浮和上下文定位都是核心. 一个主机只能制作它们; 应用程序中的表情, 你看 **[`@expressive/react`](https://www.npmjs.com/package/@expressive/react)**。 。 。 .

* * *

要在用户界面中渲染状态,请添加一个主机: [`@expressive/react`](https://www.npmjs.com/package/@expressive/react) 或者说 [`@expressive/dom`](https://www.npmjs.com/package/@expressive/dom)。 。 。 .

完整指南和 API 参考 **[github.com/gabeklein/表达式](https://github.com/gabeklein/expressive)**

## 许可证

麻省理工学院

## 常见问题

### @expressive/mvc 是什么？

基于阶级的反应状态管理 - Expressive MVC的框架-不可知性核心\.

### 如何安装 @expressive/mvc？

在项目目录运行 npm install @expressive/mvc，或使用 pnpm add / yarn add / bun add。

### @expressive/mvc 支持 TypeScript 吗？

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

### @expressive/mvc 支持 ESM 还是 CommonJS？

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

### @expressive/mvc 需要什么版本的 Node\.js？

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

### @expressive/mvc 可以商用吗？

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

### @expressive/mvc 的下载量有多少？

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

### @expressive/mvc 还在维护吗？

最新版本 0\.94\.5 发布于 2026/11/14（今天）；至今共发布 236 个版本，其中过去 12 个月发布了 32 个；首次发布于 2021/06/22。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

