
前端后端Web框架【免费下载链接】modern.jsA progressive web framework based on React and Rsbuild.项目地址https://gitcode.com/gh_mirrors/mo/modern.js点击查看免费下载本文围绕 PROVENANCE.md 展开完整还原real-v2-bff-hono这个测试夹具fixture从origin/v2集成测试bff-hono裁剪而来的出处记录并结合仓库源码解析modernjs-migrate-to-v3skill 遇到applyBaseConfig包装配置时「结构性迁移不自动进行、诚实进入人工清单」的设计边界以及 run.mjs 端到端测试如何断言这一行为。读完后你能掌握如何阅读 fixture 的 provenance 记录、applyBaseConfig判定在迁移脚本中的落点以及如何复现整套迁移验证。一、Fixture 出处记录逐文件的来源映射PROVENANCE.md 是real-v2-bff-hono夹具的来源说明声明其来源为origin/v2:tests/integration/bff-hono裁剪保留核心结构并给出逐文件映射Fixture 文件来源与裁剪说明modern.config.ts来自origin/v2:tests/integration/bff-hono/modern.config.ts形态为applyBaseConfig({ server.ssr.mode, runtime.router, bff.prefix, plugins: [bffPlugin()] })package.json来自同名文件裁剪了exports/typesVersionsserver/modern.server.ts同名文件已是 v3 形态defineServerConfigapi/index.ts来自origin/v2:tests/integration/bff-hono/api/index.ts裁剪src/routes/{layout,page}.tsx同名文件记录同时给出两条关键警示⚠️ 原文要点modern.config.ts使用仓库 integration 测试 helperapplyBaseConfig(...)属于非标准用户配置包装本 fixture 用于验证遇到applyBaseConfig时runtime/plugins等结构性迁移不自动进行、明确进 manual 并提示「结构迁移未完成」只做依赖升级 / import 路径等文件级安全改写。核心结构applyBaseConfig 包装、bffPlugin、runtime.router不得被改成 v3 形态。这条 provenance 声明不是普通的注释而是测试断言的「契约」run.mjs 会逐条验证上述约束是否被迁移脚本遵守见第四节。二、Fixture 核心文件逐段解读2.1 modern.config.tsapplyBaseConfig 包装的配置modern.config.ts 全文如下import { bffPlugin } from modern-js/plugin-bff; import { applyBaseConfig } from ../../utils/applyBaseConfig; export default applyBaseConfig({ server: { ssr: { mode: stream, }, }, runtime: { router: true, }, bff: { prefix: /bff-api, }, plugins: [bffPlugin()], });其中applyBaseConfig是仓库 integration 测试公共 helper定义在 tests/utils/applyBaseConfig.tsexport const applyBaseConfig (config defineConfig({})) { return mergeConfig UserConfigExportAppUserConfig, UserConfigExportAppNormalizedConfig ([ { output: { // disable polyfill and ts checker to make test faster polyfill: off, disableTsChecker: true, }, performance: { buildCache: false, }, plugins: [appTools()], }, config, ]); };即把传入的测试配置与一组「测试加速基础配置」关闭 polyfill、关闭 TS checker、关闭构建缓存、注入appTools()合并。它只在仓库 monorepo 的 integration 测试中可用依赖../../utils/applyBaseConfig相对路径对真实用户工程而言属于「非标准配置包装」——真实用户工程应使用defineConfig。这正是该 fixture 要考察的场景。2.2 package.jsonworkspace 协议 React 18package.json 的关键特征所有modern-js/*依赖均为workspace:*协议modern-js/plugin-bff、modern-js/runtime、modern-js/server-runtimedependencies与modern-js/app-toolsdevDependenciesreact/react-dom为^18.3.1React 18而非 17/19还含hono、zod依赖engines.node要求14.17.6scripts 仅保留dev/build/servemodern dev/modern build/modern serve。对照原始 integration 测试 tests/integration/bff-hono/package.jsonfixture 确实按 PROVENANCE 的声明裁剪了exports/typesVersions原始文件含大段dist/*导出映射并移除了new: modern new、dev:bff、start:bff等 scriptsReact 也从^19.3.0降为^18.3.1、hono 从^4.11.7降为^3.12.2。2.3 api/index.tsBFF Hono APIapi/index.ts 展示了一个裁剪后的 BFF 路由示例从modern-js/plugin-bff/hono引入Api、Get、Query、useHonoContext并用 zod 做 query 校验const GetQuerySchema z.object({ user: z.string().email(), }); export const getHello Api( Get(/hello/get), Query(GetQuerySchema), async ({ query }) { const c useHonoContext(); c.res.headers.set(x-bff-api, c.req.path); return { query }; }, );2.4 server/modern.server.ts已是 v3 形态server/modern.server.ts 按 PROVENANCE 声明「已是 v3 形态defineServerConfig」直接用modern-js/server-runtime的defineServerConfig、MiddlewareHandler、useHonoContext定义了两组 Hono 中间件export default defineServerConfig({ middlewares: [{ name: request-timing, handler: requestTiming }], renderMiddlewares: [{ name: render-timing, handler: timing }], });对比原始 integration 测试 tests/integration/bff-hono/server/modern.server.ts额外含onError钩子和c.set(userid, 42)fixture 做了裁剪但保持了 v3 的defineServerConfig结构不变。2.5 src/routes约定式路由标准结构src/routes/layout.tsx 与 src/routes/page.tsx 是 v3 约定式路由的标准layout/page结构Outlet布局 首页组件。PROVENANCE 要求迁移后必须原样保留不得生成routes/index.tsx、src/entry.tsx或legacy-*目录。三、applyBaseConfig 迁移边界源码级机制PROVENANCE 警示的第二条——「结构性迁移不自动进行」——在 skill 脚本中有明确落点。3.1 结构性迁移的拦截点migrate.mjs 的migrateRuntimeBlock在处理appTools({ bundler })与顶层runtime块之前先做包装检测约 L1326-L1336// applyBaseConfig 是仓库 integration 测试 helper / 非标准用户配置包装结构性迁移 // runtime / plugins / dev.port / appTools bundler一律交人工避免半自动改坏。 // 检测一律在 masked剥离注释/字符串上做避免注释里的 applyBaseConfig/runtime 误触发。 if (/\bapplyBaseConfig\s*\(/.test(maskCommentsAndStrings(code))) { note( manual, ⚠️ 结构迁移未完成modern.config 用 applyBaseConfig(...)integration 测试 helper / 非标准配置包装包裹。runtime / plugins / dev.port / appTools({ bundler }) 等结构性迁移需先人工展开为 defineConfig 再处理本次仅完成依赖升级 / import 路径 / tailwind 等文件级安全改写配置结构尚未迁移到 v3。, ); return; }即一旦命中applyBaseConfig(直接return顶层runtime块不会搬进src/modern.runtime.ts、plugins不会被改写只在报告的人工清单manual中记录「结构迁移未完成」。同样的守卫也存在于addBffPlugin约 L708-L710命中applyBaseConfig包装时跳过向plugins末尾追加bffPlugin()的自动改写「避免半自动改坏顶层 plugins」。3.2 扫描阶段applyBaseConfig 是 v2-only 结构信号scan-project.mjs约 L307-L308把applyBaseConfig列为v2-only 结构信号之一if (/\bapplyBaseConfig\s*\(/.test(configText)) v2OnlySignals.push(applyBaseConfig);这与 SKILL.md 中 monorepo/workspace 项目判定规则一致modern-js/app-tools使用workspace:*/link:/catalog:协议时无法从版本号判定大版本此时只有命中 v2-only 结构信号顶层runtime、appTools({ bundler })、applyBaseConfig、modern-js/plugin-tailwindcss、modern-js/runtime/bff|serverimport、App.config/init、src/pages、自定义server/index才判定为 v2无任何信号则视为 ambiguous 并阻断。real-v2-bff-hono恰好同时命中applyBaseConfig、顶层runtime、bffPlugin等信号因此能被稳定识别为 v2 项目而不误报 ambiguous。3.3 人工清单指向的修复路径SKILL.md 的人工项对照表把applyBaseConfig(...)结构性迁移指向 migrate-config.md其中给出的标准人工步骤是先把applyBaseConfig({...})展开为export default defineConfig({...})或合并applyBaseConfig注入的基础配置再按本 skill 的规则迁移runtime/plugins/appTools等结构。也就是说real-v2-bff-hono这个 fixture 验证的完整闭环是scan 命中信号 → migrate 拒绝结构性改写并写 manual → report 给出可执行的人工展开路径而不是静默把 helper 包装展开后「假成功」。四、端到端验证run.mjs 的 B1 组断言tests/skill/README.md 说明了整个验证入口node tests/skill/run.mjs把 fixture 复制到临时目录跑 skill 的scan-project.mjsmigrate.mjs断言迁移结果符合预期退出码非 0 表示有断言失败。fixture 分为三层real-v2-bff-hono属于B 层origin/v2 integration 真实形态applyBaseConfig 包装目标是「验证结构性迁移进 manual、不假成功」。run.mjs 的 B1 组约 L203-L237对real-v2-bff-hono的断言与 PROVENANCE 的声明逐条对应断言摘自 run.mjs B1 组对应的 PROVENANCE 承诺[provenance] 含 PROVENANCE.md夹具自带来源记录[provenance] applyBaseConfig 包装保留未被自动展开核心结构不得被改成 v3 形态[provenance] runtime.router 结构保留在 config未被搬走结构性迁移不自动进行[provenance] 未生成 src/modern.runtime.tsruntime.router 不得被搬入 runtime 文件[manual] 报告明确「结构迁移未完成」 applyBaseConfig明确进 manual 并提示「结构迁移未完成」[provenance] workspace:* 依赖保留未强升固定版本只做文件级安全改写[manual] workspace 协议依赖进 manual随 monorepo 升级依赖升级的边界[manual] React18 ssr.mode:stream 不误报 SSR 人工项不误报其中workspace:*的处理逻辑对应 migrate.mjs 中跳过协议依赖后的报告约 L593-L597if (skippedWorkspace.size) { note( manual, workspace/link/catalog 协议依赖未改版本随 monorepo 整体升级到 v3${[...skippedWorkspace].join(, )}, ); }而「React18 ssr.mode: stream不误报」的含义是fixture 的 React 为 18 且 SSR 模式已是流式v3 默认因此人工清单中不应出现「React17 需把ssr.mode设回string」之类的提示见 migrate-config.md 中server.ssr.mode一节v3 默认stream仅 React 17 项目需手动设回string。另外两点值得注意bff-hono中并无 v2 的modern-js/runtime/bff|serverimportfixture 的 api/index.ts 直接从modern-js/plugin-bff/hono引入因此不会触发 import 路径改写与bffPlugin()追加逻辑测试聚焦在「包装判定」本身server/modern.server.ts已是 v3 形态所以 B1 组也不会产生「自定义 server」人工项断言面收敛在 config 包装与依赖协议两类边界上。五、如何复现验证在仓库根目录执行测试会把 fixture 复制到系统临时目录运行不改动仓库内文件node tests/skill/run.mjs输出形如✓ [provenance] applyBaseConfig 包装保留未被自动展开的逐条断言末尾打印N 通过 / 0 失败退出码非 0 即表示有断言失败。若想单独观察单个 fixture 的迁移产物可按 tests/skill/README.md 的思路将tests/skill/fixtures/real-v2-bff-hono/复制到临时目录依次执行node skills/modernjs-migrate-to-v3/scripts/scan-project.mjs 临时目录 node skills/modernjs-migrate-to-v3/scripts/migrate.mjs 临时目录 --to3.0.0然后查看临时目录/.agents/runs/modernjs-migrate/report.json的changed/manual字段——按 PROVENANCE 的契约manual中应出现「结构迁移未完成」与workspace/link/catalog 协议依赖两类条目而modern.config.ts应保留applyBaseConfig包装、runtime.router结构、bffPlugin()调用原样不动。六、小结PROVENANCE.md 虽然篇幅不长却完整定义了real-v2-bff-hono夹具的三重契约出处可追溯每个文件映射回origin/v2:tests/integration/bff-hono的裁剪版本、结构不可变applyBaseConfig包装、bffPlugin、runtime.router不得被自动改成 v3 形态、行为可断言结构性迁移进 manual 并提示「结构迁移未完成」仅做文件级安全改写。配合 migrate.mjs 的包装守卫、scan-project.mjs 的 v2-only 信号判定与 run.mjs 的 B1 组断言它构成了 Modern.js v3 迁移 skill 中「不假成功、诚实报告」设计原则的一个完整验证样本也为理解 monorepo 场景下workspace协议依赖与applyBaseConfig类非标准配置包装的迁移边界提供了可直接复现的案例。赞分享前端后端Web框架【免费下载链接】modern.jsA progressive web framework based on React and Rsbuild.项目地址https://gitcode.com/gh_mirrors/mo/modern.js点击查看免费下载相关推荐AIRI BytePlus 接入实战从 API Key 到角色大脑的完整配置AIRI BytePlus 接入实战从 API Key 到角色大脑的完整配置 把 API Key 粘进 Settings → Providers → ChatAI 应用人工智能大模型数字人AI Agent语音前端后端桌面应用移动开发即时通讯3D渲染Modern.js Skills 端到端测试用 Fixture 断言验证自动化迁移与功能启用脚本的行为Modern.js Skills 端到端测试用 Fixture 断言验证自动化迁移与功能启用脚本的行为 本文以 tests/skill/README.md前端后端Web框架Elsa GitHub 活动 ID 兼容性迁移V2 契约设计与 fail-closed 离线迁移工具实战Elsa GitHub 活动 ID 兼容性迁移V2 契约设计与 fail closed 离线迁移工具实战 本文围绕 Elsa Workflows.NET 工后端工作流自动化流程编排低代码创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考