@ 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页:1src/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) (中文(简体) ).