@brust/core

中文文档
2.0.0-alpha.38发布于 2026/11/05MITES Module近 30 天下载 5525

brust v2 — 将组件编译为 Rust 模板

中文使用文档
文档目录5 节
  1. 路线 routes.tsx (中文(简体) )
  2. brust build [entry=routes.tsx] [--out-dir dist]
  3. brust dev [entry=routes.tsx] [--port N] [--workers N]
  4. brust start [--port N] [--workers N] [--dist-dir dist] [--e…
  5. 工人电线(合同7), crates/brust-server/src/protocol.rs (中文(简体) )

@ brust/ 核心

Rust为网页服务;N Bun工人只回答 loader 财务报告和审定财务报表 jobs 打电话 一个尼基加通 (单位:千美元)crates/brust-napi,加载器生成到 native/ 以 napi build绑定 brust-server 财务报告和审定财务报表 brust-compiler. 工作空间 -- -- 私人(0.0.0),直至 m2e 出版;同龄人 react编号 :react-dom 19.

路线routes.tsx(中文(简体) )

import { defineRoutes, notFound } from '@brust/core/routes'
export const routes = defineRoutes([
  { Component: AppLayout, children: [                     // layout renders <Outlet />
    { path: '/', Component: HomePage },                   // static: never calls Bun
    { path: '/items/{id}', Component: ItemPage,
      loader: async ({ params }) => (params.id === 'x' ? notFound({}) : { item: await load(params.id) }),
      cache: { ttl_seconds: 60, tags: ['items'] } },      // a HIT never calls Bun
  ] },
])

路线字段正是 path, (中文(简体) ), Component, (中文(简体) ), loader, (中文(简体) ), cache, (中文(简体) ), ssg, (中文(简体) ), children (单位:千美元)ssg 仅涉及事项 改为 --target static,参见 文件/静态数据); 其他任何失败 与 <field> is not supported in M2 (M3)加载器运行根-叶子,结果平并 (后键胜出);返回 notFound(data) 编号 : redirect(location, status) 或抛出 httpError(status, body) 为了判决. cache(Comp, opts) 财务报告和审定财务报表 cache.invalidate(…) 船也一样.

brust build [entry=routes.tsx] [--out-dir dist]

--target static [--strict] 并让每页 dist/static/ 用于 Cloudflare 页面或工人 静态资产:见 文件/静态数据。 。 。 .

通过降低来编译每个路由组件,然后写出(总是从零开始):

dist/manifest.json        the only build → server contract (spec S6)
dist/jinja/<id>.jinja     templates          dist/jobs.js + jobs/*.server.ts   worker jobs
dist/client/*-<hex>.js    runtime, native chunks, react-<id> island chunks (served immutable)
dist/client/*-<hex>.css   one minified stylesheet per imported .css / .module.css (see docs/css.md)
dist/public/              copied from ./public          dist/index.js   `bun dist/index.js` = start

每个路由组件的 children[] 并且每个本地后裔(在任何深度)都有一个静态的输入, 拥有一个客户块, 所以它的 <script> 每页链接一次.

诊断(nested-instance, (中文(简体) ), outlet-in-react, (中文(简体) ), outlet-outside-layout不支持的路由 字段,无法解析的组件)打印 error <rule> <message> 和出入口 1. 路线树是 是否使用条目验证 defineRoutes (单位:千美元)route-config, (中文(简体) ), duplicate-route 两人 模式 路由器无法连接,例如. /a 财务报告和审定财务报表 /a/) (中文(简体) ).

只有服务器的代码从未到达浏览器捆绑(error server-only-in-client <importer> imports <spec>在任何进口深度,反应岛屿包括: node:* 编号 : bun:* / 裸露的节点内建 (除非安装了该名称的 npm 包),, @brust/core/server|native,任意 *.server.* 文件,以及列出的路径/前缀 brust.toml数字 :

[build]
server_only = ["lib/server", "@acme/db"]   # import prefixes, or paths relative to the app root

这个 server-only 标记软件包同样被尊重: 浏览器构建到 import 'server-only' (任何深度,包括岛屿在内)失败 server-only-in-client 软件包是否丢出,在服务器侧(路由扫描,任务,动作,工作人),它会解决到一个空模块,所以加载器可能会导入一个由其守护的模块.

装入器和预计算的工作可能全部使用(用Bun运行). 在浏览器中 @brust/core 确定一个无副作用的条目(cache路线助手、判决; cache.invalidate - 扔下来).

出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出 上一个未激活; 输出目录, 即文件系统根、 主目录、 app根或 其祖先,或持有条目/路由组件 / public/,被拒绝 (单位:千美元)out-dir-unsafe) (中文(简体) ). 相对进口 生成的文件解析了组件的源目录, 赤裸地导入了应用程序根, 所以 --out-dir 可能指向任何地方; 运行时 dist/ 仍须决断 react 财务报告和审定财务报表 @brust/core (放在应用程序里,或者放在一个 node_modules 有了他们.

brust dev [entry=routes.tsx] [--port N] [--workers N]

Bun-target Dev 服务器 。 长寿的家长拥有您的端口 和最新的建筑的代理 成功建造作为新孩子启动(brust start 在回转端口, --workers 1 除非你通过 --workers),代理开关结束,浏览器被告知 reload,而这个老孩子被阻止。 失败 构建 或失败的靴子 保留老孩子的服务, 并显示错误, 将其覆盖在 stale 页面上方 (一个在构建失败时打开的页面也显示它);下一个良好的构建清除它并重新加载.

  • 源更改要进行全重载( 已取消 ~ 150 ms; 重建过程中所做的编辑不会被放弃) .
  • 更改为 public/*.css 跳过构建:文件被复制到运行中的 ditst 和 <link> 实值 已交换( e)?v=),页面保持了状态. 其它 public/ 文件重新装入.
  • 每个 text/html 响应,包括错误页面,获取 /_brust/dev/client.js (a) 网上搜索器 /_brust/dev/ws答复是: cache-control: no-store。 。 。 . Host 财务报告和审定财务报表 Origin 使孩子得到无变的帮助, 因此,行动跨地点警卫 行为像生产.
  • Dev 构建使用 开发模式中的 React (NODE_ENV=development(三); brust build 编号 : brust start 不变.
  • 终端显示请求的行(method path status ms cache)和最多6行的状态块 下层(状态、 URL、 生成、 构建时间、 上次请求、 警告、 热键) r 重新装入, o 打开, w 警告者, c 没问题, q 放弃). 它从不使用替代屏幕. 没有TTY, CI 或者说 NO_COLOR: 仅限平线.
  • 追踪dev工具(L14). Dev 代理每个会话生成一个令牌并给每个孩子(BRUST_DEV_TOKEN, (中文(简体) ), 纳米 devToken)和每项上游要求(x-brust-dev-token) (中文(简体) ). 只有这样核心才能回答 x-brust-dev: base64(json) (流程、模式、链条、参数、缓存结果、加载器和制成 ms、有类型/键/tag/hit的工作、bun呼叫、组件 页由). 它被添加到L1商店后,所以它永远不会被缓存;一个没有符号(出产)的核心从不制造. 代理删除标题, 在页面中显示 <script type=application/json id=__brust_trace> 并保留 最后50项(包括行动) /_brust/dev/traces。 。 。 . brust build --dev (使用时间: brust dev) 也写作 dev.json (组件 id- 源文件、 层次、 反应原因、 诊断与规则/行/ col/补救; 服务于 /_brust/dev/meta(三); 生产大楼没有。 仅在 dev 中,每个链级都被包裹 <!--brust:<id>-->…<!--/brust--> (从不在内) <brust-island>),运行时间暴露其现场实例 globalThis.__brustDev.instances (单位:千美元)__BRUST_DEV__ 是一个 构建定义,即 false被修饰者清除.
  • <brust-devtools> (L15) (英语). Dev 代理服务 /_brust/dev/devtools.js 页:1 src/dev/devtools.ts (根据第一次请求)和 注入到每个 HTML 响应中, 所以 brust start 生产建筑中没有任何一处。 显示构建状态的角指标 和页的分级计数(ready · 2s 1n 1r(三); Alt+Shift+B 切换面板(真实的按钮和标签,箭头键, Esc 关闭和 恢复焦点,反之为光和暗中的 4.5:1)。 每个小组都来自追踪, dev.json,DOM或 __brustDev 仅限: 页次 (路线、参数、缓存、时间), 构成部分 (树有分层徽章;反应成分显示其理由和诊断位置; 徘徊在地上, 工作, (中文(简体) ), 存储 (种子来自 data-brust-store,挂载的本地商店活价值, 群岛 (水分或不水分), 构建 (诊断: file:line:col,当前构建错误), 请求 (后五十会. 终点站 状态块显示最后一页相同的分级计数.
  • 不是热模块替换:组件状态在编辑中无法幸存. brust dev --target cloudflare 保留 它的wrangler回路(现在在同一个手表回路上).

brust start [--port N] [--workers N] [--dist-dir dist] [--entry routes.tsx]

印刷品 [brust] listening on <addr> 接下来 [brust] ready (N workers)。 。 。 . --port 0 选择自由端口. 签字/签字排出优雅(BRUST_DRAIN_TIMEOUT_MS; 立即第二个信号出口. 配置优先级: env (BRUST_ADDR, (中文(简体) ), BRUST_PORT, (中文(简体) ), BRUST_WORKERS, (中文(简体) ), BRUST_RENDER_SLOTS, (中文(简体) ), BRUST_DRAIN_TIMEOUT_MS, (中文(简体) ), BRUST_BOOT_TIMEOUT_MS, (中文(简体) ), BRUST_CALL_TIMEOUT_MS, (中文(简体) ), BRUST_SLOT_BYTES, (中文(简体) ), BRUST_MAX_LOADER_RESPONSE_BYTES, (中文(简体) ), BRUST_DIST_DIR, (中文(简体) ), BRUST_APP_ENTRY> 旗帜 (单位:千美元)--port, (中文(简体) ), --workers, (中文(简体) ), --dist-dir, (中文(简体) ), --entry和 run({ config }) > 翻译: brust.toml (单位:千美元)[server] address/port/max_loader_response_bytes, (中文(简体) ), [workers] count/slot_bytes, (中文(简体) ), [cors]) > 默认(localhost:1337每个CPU一个工人, min(cores, 16) 每个工人的插槽(每个插槽是 slotBytes 共享响应缓冲器,默认为256 KiB,因此10个插槽=每个工人2.5 MiB,10 s排水管,30 s 工人靴子超时,30 s调用超时,8 MiB加载器响应限制. slotBytes (单位:千美元)[workers] slot_bytes环境 BRUST_SLOT_BYTES, (中文(简体) ), run({ config: { slotBytes } }))是64个KiB.16个MiB. 装入器、任务或计划的答复不符合其槽位不是错误:工人把它交给服务器 在堆积上,直到 maxLoaderResponseBytes (单位:千美元)[server] max_loader_response_bytes环境 BRUST_MAX_LOADER_RESPONSE_BYTES, (中文(简体) ), run({ config: { maxLoaderResponseBytes } }); 256 KiB.64 MiB,默认为8 MiB. 一个更大的回答 {"error":"response too large: <n> > <limit> (maxLoaderResponseBytes)"} (a 500) (中文(简体) ). 这个 限制适用于加载器和工作答复; [actions] 拥有自己的 max_response_bytes。 。 。 . [cors] 也可以作为 run({ config: { cors: { origins, methods, headers, exposeHeaders, credentials, maxAgeSeconds } } }) (骆驼Case,一个未知的密钥被拒绝). 它取代一个 brust.toml [cors] 作为一个整体, 不与它合并; cors: null 关闭磁盘表. 装货机或工作电话未在其中解决 BRUST_CALL_TIMEOUT_MS 答题 504 (中文(简体) );工人 在电话结算之前 插槽,从不冷冻工人。 等待自由槽是单独的503"所有工人都忙". GET /_brust/cache/stats l1/工作缓存计数器加 loader_calls 编号 : job_calls 编号 : timed_out_calls。默认关闭(404个):设置 [server] stats 改为 "public" 或者说 "token" (单位:千美元)stats_token = "env:NAME"(中文(简体) ) 阅读; brust dev 为它服务.

工人电线(合同7), crates/brust-server/src/protocol.rs(中文(简体) )

请求作为内部JSON发送;答复进入工人的共享箭头插槽(从来没有) 过去 floor(len / slots) 字节). A 类 loader编号 :jobs 与堆积不符的回答:工人 将字节设置为 putFetchReply 并写出5字节标记 [0x00][u32 LE n] 输入槽( JSON) 从0x00开始;服务器读取 n 字节被递出。 装入器上下文太大 从字节中规划槽( q)planJobsBuf) (中文(简体) ). 完毕 maxLoaderResponseBytes 答复改为: {"error":…}处理者从不拒绝.

loader {routeId, params, path, req} → {ok:true, data} | {verdict, …} | {error}· ; jobs {jobs:[{id, componentId, kind, inputs, target?, row?}]} → {results:[{id, value}|{id, error}]} (单位:千美元) ssr 任务 jobs[target] 与明显的工作 literals 合并 inputs) (中文(简体) ).

M2限制 : ; 每行子实例, 深一层( 嵌入) 实例是构建错误; 反应儿童道具必须是道具路径或文字; 没有工人再生. 盖茨: bun run build:debug && bun run typecheck && bun test (CI运行每个服务器启动) 单文件; e2e: bun test --timeout 120000 test/e2e.test.ts) (中文(简体) ).

版本与发布记录

@brust/core 共发布 39 个版本,首次发布于 2026/10/12;过去 12 个月发布了 39 个版本。

版本发布日期距今
2.0.0-alpha.38latest2026/11/053 天前
2.0.0-alpha.372026/11/053 天前
2.0.0-alpha.362026/11/044 天前
2.0.0-alpha.352026/11/044 天前
2.0.0-alpha.342026/11/045 天前
2.0.0-alpha.332026/10/2910 天前

关于 @brust/core 的常见问题

@brust/core 是什么?

brust v2 — 将组件编译为 Rust 模板

如何安装 @brust/core?

在项目目录运行 npm install @brust/core,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(^19.0.0)、react-dom(^19.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。它还提供命令行工具 brust,可以用 npx brust 直接运行。

@brust/core 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/brust__core 是否存在。

@brust/core 支持 ESM 还是 CommonJS?

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

@brust/core 可以商用吗?

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

@brust/core 的下载量有多少?

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

@brust/core 还在维护吗?

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