Releases: Harhao/bundlekit
@bundlekit/shared-utils@0.0.8
Patch Changes
-
0ef5a9b: fix(ssr): 修复 SSR 项目「页面渲染但点击事件不绑定」的问题,7 个 bundler × dev/build 全场景补齐 hydration
原因:SSR 模式下生成的 HTML 缺少加载客户端 bundle 的
<script>标签 →
浏览器只拿到静态 HTML → 没有 client JS 执行 → React/Vue 没有 hydrate →
事件 listener 不绑。修复矩阵
Dev SSR Build SSR vite pages 触发 vite-plugin-html SPA 模式注入 entry vite-plugin-html 写 dist/index.html webpack adapter getTemplate手工注入 + 防重复守卫HtmlWebpackPlugin 写 dist/index.html rspack 同上 HtmlRspackPlugin 写 dist/index.html rollup 新增 client watcher + static MW + dist/index.html 作 SSR 模板 adapter writeHtmlFile写 dist/index.htmlrolldown 同上 同上 esbuild 同上 同上 parcel 同上 同上 各包改动
- @bundlekit/plugin-react / plugin-vue(模板):SSR 模式也保留
pages,让 client pass 走 bundler 原生 HTML 流水线(保持 split chunks 顺序 / hashing 正确);prodssr.template改为指向编译产物dist/index.html,runtime 直接用它替换<!--ssr-outlet-->。 - @bundlekit/shared-utils:新增
buildSSRHTMLTemplate(递归扫描 client outDir,把 _.js / _.css 注入到源模板,handle vite 的assets/js/嵌套产物);新增createStaticFileMiddleware(dev SSR 静态资源服务,HTML fall-through 给 SSR handler)。 - @bundlekit/service:SSR build 双 pass 间加兜底 HTML 注入器——若 client pass 没产
dist/index.html(用户删了 pages 或 bundler 异常),用buildSSRHTMLTemplate写一份。 - @bundlekit/bundler-rolldown / rollup / esbuild / parcel:
createSSRMiddleware重写,从只跑 server compiler 改为 client + server 双 watcher,链上挂createStaticFileMiddleware+ SSR handler;handler 的getTemplate优先用 client 编译出的dist/index.html(带<script>),缺失才回退源模板。 - @bundlekit/bundler-webpack / rspack:
getTemplate加防重复注入守卫——模板已含<script src=...>时直接返回,避免用户把ssr.template改到 proddist/index.html时双挂载。 - @bundlekit/bundler-rspack:顺带修一个独立 bug——
prodBuild的compiler.run(callback)没包 Promise 就 return,Service 的 SSR 双 pass 会变成「fire-and-forget」导致兜底注入器读到空 dist;现在包成await new Promise(...)且加上stats.hasErrors()reject。
- @bundlekit/plugin-react / plugin-vue(模板):SSR 模式也保留
@bundlekit/service@0.0.11
Patch Changes
-
0ef5a9b: fix(ssr): 修复 SSR 项目「页面渲染但点击事件不绑定」的问题,7 个 bundler × dev/build 全场景补齐 hydration
原因:SSR 模式下生成的 HTML 缺少加载客户端 bundle 的
<script>标签 →
浏览器只拿到静态 HTML → 没有 client JS 执行 → React/Vue 没有 hydrate →
事件 listener 不绑。修复矩阵
Dev SSR Build SSR vite pages 触发 vite-plugin-html SPA 模式注入 entry vite-plugin-html 写 dist/index.html webpack adapter getTemplate手工注入 + 防重复守卫HtmlWebpackPlugin 写 dist/index.html rspack 同上 HtmlRspackPlugin 写 dist/index.html rollup 新增 client watcher + static MW + dist/index.html 作 SSR 模板 adapter writeHtmlFile写 dist/index.htmlrolldown 同上 同上 esbuild 同上 同上 parcel 同上 同上 各包改动
- @bundlekit/plugin-react / plugin-vue(模板):SSR 模式也保留
pages,让 client pass 走 bundler 原生 HTML 流水线(保持 split chunks 顺序 / hashing 正确);prodssr.template改为指向编译产物dist/index.html,runtime 直接用它替换<!--ssr-outlet-->。 - @bundlekit/shared-utils:新增
buildSSRHTMLTemplate(递归扫描 client outDir,把 _.js / _.css 注入到源模板,handle vite 的assets/js/嵌套产物);新增createStaticFileMiddleware(dev SSR 静态资源服务,HTML fall-through 给 SSR handler)。 - @bundlekit/service:SSR build 双 pass 间加兜底 HTML 注入器——若 client pass 没产
dist/index.html(用户删了 pages 或 bundler 异常),用buildSSRHTMLTemplate写一份。 - @bundlekit/bundler-rolldown / rollup / esbuild / parcel:
createSSRMiddleware重写,从只跑 server compiler 改为 client + server 双 watcher,链上挂createStaticFileMiddleware+ SSR handler;handler 的getTemplate优先用 client 编译出的dist/index.html(带<script>),缺失才回退源模板。 - @bundlekit/bundler-webpack / rspack:
getTemplate加防重复注入守卫——模板已含<script src=...>时直接返回,避免用户把ssr.template改到 proddist/index.html时双挂载。 - @bundlekit/bundler-rspack:顺带修一个独立 bug——
prodBuild的compiler.run(callback)没包 Promise 就 return,Service 的 SSR 双 pass 会变成「fire-and-forget」导致兜底注入器读到空 dist;现在包成await new Promise(...)且加上stats.hasErrors()reject。
- @bundlekit/plugin-react / plugin-vue(模板):SSR 模式也保留
-
Updated dependencies [fb94642]
-
Updated dependencies [0ef5a9b]
- @bundlekit/bundler-rspack@0.0.8
- @bundlekit/bundler-vite@0.0.8
- @bundlekit/bundler-webpack@0.0.8
- @bundlekit/bundler-rolldown@0.0.8
- @bundlekit/bundler-rollup@0.0.10
- @bundlekit/shared-utils@0.0.8
@bundlekit/service@0.0.10
Patch Changes
-
8196668: 汇总修复:Parcel HTML 生成、Service bundler 加载、CLI 面板刷帧、文档更新
@bundlekit/bundler-parcel — fix: 修复 dev/build 不生成 HTML 导致页面空白的问题
- 新增
writeHtmlFile()函数,构建完成后扫描 outDir 中的 JS/CSS 产物并写入index.html - 若配置了
pages[0].template则读取模板注入 script/link 标签,否则自动生成最小 HTML(含<div id="root">) devBuild():每次 Parcel watch 构建成功后调用,再启动/reload DevServer,确保首次访问即有 HTMLprodBuild():bundler.run()完成后调用,保证生产产物包含index.html
@bundlekit/service — fix: 修复安装 bundler 插件后仍无法加载的问题
loadBundlerPlugin改用用户项目目录(this.context)作为createRequire基准路径- 原来以
import.meta.url(service 包自身位置)为基准,全局安装时无法找到用户项目中新安装的包
- 原来以
- ESM 兜底改用
pathToFileURL(resolvedPath).href替换 bare specifier- 原来
import(packageName)仍从 service 文件位置解析,与安装路径无关
- 原来
- 新增实际错误信息打印,方便排查加载失败原因
@bundlekit/cli — fix: 修复创建项目面板步骤文案显示节奏不平滑
CreateApp.tsx创建项目流程中,React/Ink setState 合批 + 中间同步 I/O 阻塞事件循环,导致多个步骤的✔状态批量跳出,初始 5 个 pending 标签也看不到独立首帧。- 新增
yieldFrame()(setTimeout(0)跳宏任务),让 Ink 有机会把帧 paint 到终端 setTasks(initialTasks)之后先 yield 一次,让"全 pending"初始帧可见- 每个步骤
running/done状态切换后各 yield 一次,避免合批
@bundlekit/docs-agent — docs: 更新文档以反映 Parcel 2 与 esbuild 适配器的加入,七种打包器全覆盖
docs/index.md:hero description 与 SSR 特性说明从"五种"更新为"七种"docs/guide.md:快速开始介绍从五种更新为七种,bundler 选择列表加入 parcel/esbuild,SSR 章节同步更新docs/guide/bundlers.md:打包器列表加入 Parcel 2 与 esbuild 行;各打包器特性新增 Parcel/esbuild 章节;配置字段映射表扩展至七列;SSR 支持矩阵加入 parcel/esbuild 行docs/guide/ssr.md:bundler 数量更新为七个;HMR 支持矩阵加入 parcel/esbuild 行及说明packages/bundlekit-docs/README.md:更新标题与简介(bundlekit-cli-docs在 changeset ignore 列表中,本文不在 frontmatter 显式声明)packages/bundlekit-docs-agent/README.md:intro 注明覆盖七种打包器
- 新增
@bundlekit/plugin-vue@0.0.9
Patch Changes
-
fb94642: feat(library): 类库 / SDK 打包模式全 7 个 bundler 完整支持
之前
library: true/libraryName: "MyLib"字段只在 rollup / rolldown / parcel 上有效,且 esbuild 的 UMD 是降级到 iife 的(没全局变量名)。这一轮把支持矩阵补齐:各 adapter 改动
- @bundlekit/bundler-webpack / rspack:之前两家不读
library字段,client pass 始终设output.library。现在:library: true时跳过HtmlWebpackPlugin/HtmlRspackPlugin(不产 SPA shell HTML)libraryName填到output.library.name,UMD 自动加umdNamedDefine + globalObject- format 标准化映射:
esm → 'module'(开experiments.outputModule)/commonjs → 'commonjs2'/umd / iife / amd透传
- @bundlekit/bundler-vite:之前 vite adapter 完全不读
library字段。现在library: true走 vite 原生build.lib模式:formats数组转 vite 的lib.formats,UMD/IIFE 自动塞lib.name = libraryName- 跳过
vite-plugin-html,文件名按<entry>.<format-ext>命名 - 默认把
package.json的dependencies + peerDependencies自动 externalize(react/vue/react-dom 自带 globals 映射)
- @bundlekit/bundler-esbuild:UMD 不再降级 iife,而是
format: iife + globalName + banner/footer包真 UMD wrapper(CJS / AMD / Browser 三种宿主都能跑)
CLI 改动
bc create <name> --lib --library-name <name>:新增--lib与--library-nameflag,TTY / non-TTY 两条路径都接上- 默认
libraryName取项目名转 PascalCase(my-lib→MyLib),用户可显式覆盖 --lib自动跳过 SSR prompt(语义不兼容)
模板改动
@bundlekit/plugin-react / plugin-vue各自加:src/lib-entry.{tsx|jsx|ts|js}.ejs:generator 在 library 模式下重命名为src/index.<ext>,re-exportApp+ 默认导出<%= libraryName %>.bundlekitrc.{ts|js}.ejs加<% if (library) %>顶层分支:多格式["esm","commonjs","umd"]、library: true+libraryName、externals: ["react","react-dom"]/["vue"]、不含pages、不含devServer- Library 模式下 generator 跳过
public/、index.{tsx|jsx}、main.{ts|js}、entry-server / entry-client(这些都是应用 mount 入口,SDK 用不到)
测试覆盖
新增 14 个 build 集成测试(7 bundler × 2 模式):
build/<bundler>-lib.test.ts:基础 CJS lib build,require 出add(2,3)===5build/<bundler>-lib-umd.test.ts:UMD build,验证产物含libraryName,用 vm 在伪 browser 环境 eval 后globalThis.MyLib.add(2,3)===5- parcel 此项 skip:Parcel 原生只支持 commonjs/global outputFormat,没 UMD wrapper
新增 3 个 CLI
--lib集成测试:验证 react-ts / vue3-ts library 模式下文件结构 +.bundlekitrc.ts内容 +--library-name覆盖默认值。支持矩阵
能力 rollup rolldown webpack rspack vite esbuild parcel library/libraryName字段✅ ✅ ✅ ✅ ✅ ✅ ✅ 真 UMD(含全局名) ✅ ✅ ✅ ✅ ✅ ✅ ❌ 多格式同时输出 ✅ ✅ 取 formats[0] 取 formats[0] ✅ 取 formats[0] 仅 commonjs Library 跳过 HTML 入口 ✅ ✅ ✅ ✅ ✅ ✅ ✅ 自动 external peerDeps 透传 透传 透传 透传 ✅ 透传 透传 加粗 = 本次新增能力。
- @bundlekit/bundler-webpack / rspack:之前两家不读
-
1308e66: feat(plugin-node): 新增 @bundlekit/plugin-node,支持纯 TypeScript / Node.js 项目模板
新增
@bundlekit/plugin-node插件,为 Node.js 工具库、CLI、后端服务等场景提供纯 TypeScript 项目脚手架。新增内容
packages/bundlekit-plugin-node(全新包):index.ts:插件主入口,给所有 env 打framework='node'标记,并移除 devServer 配置(Node 库不需要本地开发服务)generator/index.ts:CLI create 流程回调,调用addPluginToConfig自动写入.bundlekitrc.tstemplates/template-node-ts/:模板文件集合.bundlekitrc.ts.ejs:按library模式分支生成配置:- 普通模式:
target: "node",formats: ["esm", "commonjs"],双格式输出,无 HTML 入口 - Library 模式:额外加
library: true+libraryName,适合发布到 npm 的 SDK
- 普通模式:
src/index.ts.ejs:应用入口(含greet/add示例 +isMain判断,可直接node运行)src/lib-entry.ts.ejs:库入口(--lib模式由 generator 重命名为src/index.ts,re-exportutils.ts+ 默认导出命名空间)src/utils.ts:基础工具函数(greet/add,作为 SDK 函数示例)tsconfig.json:Node 友好的 TS 配置(target: ES2020,module: NodeNext,开declaration + declarationMap)package.json.ejs:含"type": "module"+exports字段(import/require/default三条路径)+typecheckscript
CLI 改动:
index.tsx:TEMPLATES 新增node-ts(显示名:Node.js / 纯 TypeScript(无框架))lib/commands/create/actions.ts:normalizeTemplate加node/node-ts别名resolvePluginPkgName加node-*→@bundlekit/plugin-node分支- 错误提示加入
node-ts
lib/utils/generatorRunner.ts:重构 generator 查找逻辑,从「require.resolvesubpath exports」改为「先 resolvepackage.json定位包根目录,再拼接generator/index.ts|js|cjs|mjs,最后用 jiti 加载」—— 彻底解决.ts源文件无法被原生import()加载的问题,同时兼容 monorepo 和已发布场景package.json:dependencies增加@bundlekit/plugin-node: workspace:*
plugin-react / plugin-vue package.json:加
exports字段("./generator": "./generator/index.ts"),让require.resolve能正常解析 generator 子路径(为 generatorRunner 重构预留)使用方式
# 普通 Node.js / 纯 TS 项目 bc create my-ts-app -t node-ts -b rollup # SDK / 库项目(双格式 esm + cjs,无 HTML) bc create my-ts-sdk -t node-ts -b rollup --lib --library-name MySDK
测试覆盖
新增 8 个集成测试:
__tests__/integration/cli/cli-plugin-node.test.ts:7 个 CLI create 场景用例(普通模式 / library 模式 / 文件结构 /.bundlekitrc.ts内容 /package.json结构)__tests__/integration/build/node-lib.test.ts:1 个 build 测试(rollup 打 node library,require 出add(2,3)===5)
59 单元 + 45 集成全部通过(1 parcel UMD skip 为已知缺口)。
-
0ef5a9b: fix(ssr): 修复 SSR 项目「页面渲染但点击事件不绑定」的问题,7 个 bundler × dev/build 全场景补齐 hydration
原因:SSR 模式下生成的 HTML 缺少加载客户端 bundle 的
<script>标签 →
浏览器只拿到静态 HTML → 没有 client JS 执行 → React/Vue 没有 hydrate →
事件 listener 不绑。修复矩阵
Dev SSR Build SSR vite pages 触发 vite-plugin-html SPA 模式注入 entry vite-plugin-html 写 dist/index.html webpack adapter getTemplate手工注入 + 防重复守卫HtmlWebpackPlugin 写 dist/index.html rspack 同上 HtmlRspackPlugin 写 dist/index.html rollup 新增 client watcher + static MW + dist/index.html 作 SSR 模板 adapter writeHtmlFile写 dist/index.htmlrolldown 同上 同上 esbuild 同上 同上 parcel 同上 同上 各包改动
- @bundlekit/plugin-react / plugin-vue(模板):SSR 模式也保留
pages,让 client pass 走 bundler 原生 HTML 流水线(保持 split chunks 顺序 / hashing 正确);prodssr.template改为指向编译产物dist/index.html,runtime 直接用它替换<!--ssr-outlet-->。 - @bundlekit/shared-utils:新增
buildSSRHTMLTemplate(递归扫描 client outDir,把 _.js / _.css 注入到源模板,handle vite 的assets/js/嵌套产物);新增createStaticFileMiddleware(dev SSR 静态资源服务,HTML fall-through 给 SSR handler)。 - @bundlekit/service:SSR build 双 pass 间加兜底 HTML 注入器——若 client pass 没产
dist/index.html(用户删了 pages 或 bundler 异常),用buildSSRHTMLTemplate写一份。 - @bundlekit/bundler-rolldown / rollup / esbuild / parcel:
createSSRMiddleware重写,从只跑 server compiler 改为 client + server 双 watcher,链上挂createStaticFileMiddleware+ SSR handler;handler 的getTemplate优先用 client 编译出的dist/index.html(带<script>),缺失才回退源模板。 - @bundlekit/bundler-webpack / rspack:
getTemplate加防重复注入守卫——模板已含<script src=...>时直接返回,避免用户把ssr.template改到 proddist/index.html时双挂载。 - @bundlekit/bundler-rspack:顺带修一个独立 bug——
prodBuild的compiler.run(callback)没包 Promise 就 return,Service 的 SSR 双 pass 会变成「fire-and-forget」导致兜底注入器读到空 dist;现在包成await new Promise(...)且加上stats.hasErrors()reject。
- @bundlekit/plugin-react / plugin-vue(模板):SSR 模式也保留
-
Updated dependencies [0ef5a9b]
- @bundlekit/shared-utils@0.0.8
@bundlekit/plugin-react@0.0.9
Patch Changes
-
fb94642: feat(library): 类库 / SDK 打包模式全 7 个 bundler 完整支持
之前
library: true/libraryName: "MyLib"字段只在 rollup / rolldown / parcel 上有效,且 esbuild 的 UMD 是降级到 iife 的(没全局变量名)。这一轮把支持矩阵补齐:各 adapter 改动
- @bundlekit/bundler-webpack / rspack:之前两家不读
library字段,client pass 始终设output.library。现在:library: true时跳过HtmlWebpackPlugin/HtmlRspackPlugin(不产 SPA shell HTML)libraryName填到output.library.name,UMD 自动加umdNamedDefine + globalObject- format 标准化映射:
esm → 'module'(开experiments.outputModule)/commonjs → 'commonjs2'/umd / iife / amd透传
- @bundlekit/bundler-vite:之前 vite adapter 完全不读
library字段。现在library: true走 vite 原生build.lib模式:formats数组转 vite 的lib.formats,UMD/IIFE 自动塞lib.name = libraryName- 跳过
vite-plugin-html,文件名按<entry>.<format-ext>命名 - 默认把
package.json的dependencies + peerDependencies自动 externalize(react/vue/react-dom 自带 globals 映射)
- @bundlekit/bundler-esbuild:UMD 不再降级 iife,而是
format: iife + globalName + banner/footer包真 UMD wrapper(CJS / AMD / Browser 三种宿主都能跑)
CLI 改动
bc create <name> --lib --library-name <name>:新增--lib与--library-nameflag,TTY / non-TTY 两条路径都接上- 默认
libraryName取项目名转 PascalCase(my-lib→MyLib),用户可显式覆盖 --lib自动跳过 SSR prompt(语义不兼容)
模板改动
@bundlekit/plugin-react / plugin-vue各自加:src/lib-entry.{tsx|jsx|ts|js}.ejs:generator 在 library 模式下重命名为src/index.<ext>,re-exportApp+ 默认导出<%= libraryName %>.bundlekitrc.{ts|js}.ejs加<% if (library) %>顶层分支:多格式["esm","commonjs","umd"]、library: true+libraryName、externals: ["react","react-dom"]/["vue"]、不含pages、不含devServer- Library 模式下 generator 跳过
public/、index.{tsx|jsx}、main.{ts|js}、entry-server / entry-client(这些都是应用 mount 入口,SDK 用不到)
测试覆盖
新增 14 个 build 集成测试(7 bundler × 2 模式):
build/<bundler>-lib.test.ts:基础 CJS lib build,require 出add(2,3)===5build/<bundler>-lib-umd.test.ts:UMD build,验证产物含libraryName,用 vm 在伪 browser 环境 eval 后globalThis.MyLib.add(2,3)===5- parcel 此项 skip:Parcel 原生只支持 commonjs/global outputFormat,没 UMD wrapper
新增 3 个 CLI
--lib集成测试:验证 react-ts / vue3-ts library 模式下文件结构 +.bundlekitrc.ts内容 +--library-name覆盖默认值。支持矩阵
能力 rollup rolldown webpack rspack vite esbuild parcel library/libraryName字段✅ ✅ ✅ ✅ ✅ ✅ ✅ 真 UMD(含全局名) ✅ ✅ ✅ ✅ ✅ ✅ ❌ 多格式同时输出 ✅ ✅ 取 formats[0] 取 formats[0] ✅ 取 formats[0] 仅 commonjs Library 跳过 HTML 入口 ✅ ✅ ✅ ✅ ✅ ✅ ✅ 自动 external peerDeps 透传 透传 透传 透传 ✅ 透传 透传 加粗 = 本次新增能力。
- @bundlekit/bundler-webpack / rspack:之前两家不读
-
1308e66: feat(plugin-node): 新增 @bundlekit/plugin-node,支持纯 TypeScript / Node.js 项目模板
新增
@bundlekit/plugin-node插件,为 Node.js 工具库、CLI、后端服务等场景提供纯 TypeScript 项目脚手架。新增内容
packages/bundlekit-plugin-node(全新包):index.ts:插件主入口,给所有 env 打framework='node'标记,并移除 devServer 配置(Node 库不需要本地开发服务)generator/index.ts:CLI create 流程回调,调用addPluginToConfig自动写入.bundlekitrc.tstemplates/template-node-ts/:模板文件集合.bundlekitrc.ts.ejs:按library模式分支生成配置:- 普通模式:
target: "node",formats: ["esm", "commonjs"],双格式输出,无 HTML 入口 - Library 模式:额外加
library: true+libraryName,适合发布到 npm 的 SDK
- 普通模式:
src/index.ts.ejs:应用入口(含greet/add示例 +isMain判断,可直接node运行)src/lib-entry.ts.ejs:库入口(--lib模式由 generator 重命名为src/index.ts,re-exportutils.ts+ 默认导出命名空间)src/utils.ts:基础工具函数(greet/add,作为 SDK 函数示例)tsconfig.json:Node 友好的 TS 配置(target: ES2020,module: NodeNext,开declaration + declarationMap)package.json.ejs:含"type": "module"+exports字段(import/require/default三条路径)+typecheckscript
CLI 改动:
index.tsx:TEMPLATES 新增node-ts(显示名:Node.js / 纯 TypeScript(无框架))lib/commands/create/actions.ts:normalizeTemplate加node/node-ts别名resolvePluginPkgName加node-*→@bundlekit/plugin-node分支- 错误提示加入
node-ts
lib/utils/generatorRunner.ts:重构 generator 查找逻辑,从「require.resolvesubpath exports」改为「先 resolvepackage.json定位包根目录,再拼接generator/index.ts|js|cjs|mjs,最后用 jiti 加载」—— 彻底解决.ts源文件无法被原生import()加载的问题,同时兼容 monorepo 和已发布场景package.json:dependencies增加@bundlekit/plugin-node: workspace:*
plugin-react / plugin-vue package.json:加
exports字段("./generator": "./generator/index.ts"),让require.resolve能正常解析 generator 子路径(为 generatorRunner 重构预留)使用方式
# 普通 Node.js / 纯 TS 项目 bc create my-ts-app -t node-ts -b rollup # SDK / 库项目(双格式 esm + cjs,无 HTML) bc create my-ts-sdk -t node-ts -b rollup --lib --library-name MySDK
测试覆盖
新增 8 个集成测试:
__tests__/integration/cli/cli-plugin-node.test.ts:7 个 CLI create 场景用例(普通模式 / library 模式 / 文件结构 /.bundlekitrc.ts内容 /package.json结构)__tests__/integration/build/node-lib.test.ts:1 个 build 测试(rollup 打 node library,require 出add(2,3)===5)
59 单元 + 45 集成全部通过(1 parcel UMD skip 为已知缺口)。
-
0ef5a9b: fix(ssr): 修复 SSR 项目「页面渲染但点击事件不绑定」的问题,7 个 bundler × dev/build 全场景补齐 hydration
原因:SSR 模式下生成的 HTML 缺少加载客户端 bundle 的
<script>标签 →
浏览器只拿到静态 HTML → 没有 client JS 执行 → React/Vue 没有 hydrate →
事件 listener 不绑。修复矩阵
Dev SSR Build SSR vite pages 触发 vite-plugin-html SPA 模式注入 entry vite-plugin-html 写 dist/index.html webpack adapter getTemplate手工注入 + 防重复守卫HtmlWebpackPlugin 写 dist/index.html rspack 同上 HtmlRspackPlugin 写 dist/index.html rollup 新增 client watcher + static MW + dist/index.html 作 SSR 模板 adapter writeHtmlFile写 dist/index.htmlrolldown 同上 同上 esbuild 同上 同上 parcel 同上 同上 各包改动
- @bundlekit/plugin-react / plugin-vue(模板):SSR 模式也保留
pages,让 client pass 走 bundler 原生 HTML 流水线(保持 split chunks 顺序 / hashing 正确);prodssr.template改为指向编译产物dist/index.html,runtime 直接用它替换<!--ssr-outlet-->。 - @bundlekit/shared-utils:新增
buildSSRHTMLTemplate(递归扫描 client outDir,把 _.js / _.css 注入到源模板,handle vite 的assets/js/嵌套产物);新增createStaticFileMiddleware(dev SSR 静态资源服务,HTML fall-through 给 SSR handler)。 - @bundlekit/service:SSR build 双 pass 间加兜底 HTML 注入器——若 client pass 没产
dist/index.html(用户删了 pages 或 bundler 异常),用buildSSRHTMLTemplate写一份。 - @bundlekit/bundler-rolldown / rollup / esbuild / parcel:
createSSRMiddleware重写,从只跑 server compiler 改为 client + server 双 watcher,链上挂createStaticFileMiddleware+ SSR handler;handler 的getTemplate优先用 client 编译出的dist/index.html(带<script>),缺失才回退源模板。 - @bundlekit/bundler-webpack / rspack:
getTemplate加防重复注入守卫——模板已含<script src=...>时直接返回,避免用户把ssr.template改到 proddist/index.html时双挂载。 - @bundlekit/bundler-rspack:顺带修一个独立 bug——
prodBuild的compiler.run(callback)没包 Promise 就 return,Service 的 SSR 双 pass 会变成「fire-and-forget」导致兜底注入器读到空 dist;现在包成await new Promise(...)且加上stats.hasErrors()reject。
- @bundlekit/plugin-react / plugin-vue(模板):SSR 模式也保留
-
Updated dependencies [0ef5a9b]
- @bundlekit/shared-utils@0.0.8
@bundlekit/plugin-node@0.0.2
Patch Changes
- Updated dependencies [0ef5a9b]
- @bundlekit/shared-utils@0.0.8
@bundlekit/plugin-mock@0.0.8
Patch Changes
- Updated dependencies [0ef5a9b]
- @bundlekit/shared-utils@0.0.8
@bundlekit/cli@0.0.9
Patch Changes
-
8196668: 汇总修复:Parcel HTML 生成、Service bundler 加载、CLI 面板刷帧、文档更新
@bundlekit/bundler-parcel — fix: 修复 dev/build 不生成 HTML 导致页面空白的问题
- 新增
writeHtmlFile()函数,构建完成后扫描 outDir 中的 JS/CSS 产物并写入index.html - 若配置了
pages[0].template则读取模板注入 script/link 标签,否则自动生成最小 HTML(含<div id="root">) devBuild():每次 Parcel watch 构建成功后调用,再启动/reload DevServer,确保首次访问即有 HTMLprodBuild():bundler.run()完成后调用,保证生产产物包含index.html
@bundlekit/service — fix: 修复安装 bundler 插件后仍无法加载的问题
loadBundlerPlugin改用用户项目目录(this.context)作为createRequire基准路径- 原来以
import.meta.url(service 包自身位置)为基准,全局安装时无法找到用户项目中新安装的包
- 原来以
- ESM 兜底改用
pathToFileURL(resolvedPath).href替换 bare specifier- 原来
import(packageName)仍从 service 文件位置解析,与安装路径无关
- 原来
- 新增实际错误信息打印,方便排查加载失败原因
@bundlekit/cli — fix: 修复创建项目面板步骤文案显示节奏不平滑
CreateApp.tsx创建项目流程中,React/Ink setState 合批 + 中间同步 I/O 阻塞事件循环,导致多个步骤的✔状态批量跳出,初始 5 个 pending 标签也看不到独立首帧。- 新增
yieldFrame()(setTimeout(0)跳宏任务),让 Ink 有机会把帧 paint 到终端 setTasks(initialTasks)之后先 yield 一次,让"全 pending"初始帧可见- 每个步骤
running/done状态切换后各 yield 一次,避免合批
@bundlekit/docs-agent — docs: 更新文档以反映 Parcel 2 与 esbuild 适配器的加入,七种打包器全覆盖
docs/index.md:hero description 与 SSR 特性说明从"五种"更新为"七种"docs/guide.md:快速开始介绍从五种更新为七种,bundler 选择列表加入 parcel/esbuild,SSR 章节同步更新docs/guide/bundlers.md:打包器列表加入 Parcel 2 与 esbuild 行;各打包器特性新增 Parcel/esbuild 章节;配置字段映射表扩展至七列;SSR 支持矩阵加入 parcel/esbuild 行docs/guide/ssr.md:bundler 数量更新为七个;HMR 支持矩阵加入 parcel/esbuild 行及说明packages/bundlekit-docs/README.md:更新标题与简介(bundlekit-cli-docs在 changeset ignore 列表中,本文不在 frontmatter 显式声明)packages/bundlekit-docs-agent/README.md:intro 注明覆盖七种打包器
- 新增
@bundlekit/cli@0.0.12
Patch Changes
- ce5779c: 修复安装模板失败
@bundlekit/cli@0.0.11
Patch Changes
- 7078d92: fix: 修复纯 node + Typescript 的模版