Rollup监听模式下package.json版本号无法自动同步至打包产物的问题求助
解决Rollup监听模式下package.json版本号无法同步更新的问题
我完全懂你的困扰——这么基础的需求却卡壳确实让人头疼。核心问题其实是Rollup在监听模式下会缓存初始导入的package.json模块,哪怕你修改了文件,配置里的pkg变量还是旧值,而且之前的插件写法要么时机不对,要么没绕开缓存。下面是亲测有效的解决方案:
步骤1:让Rollup监听package.json文件
首先得确保Rollup能感知到package.json的变化,在你的Rollup配置里添加watch选项,把package.json加入监听列表:
export default { // 你的其他配置(input、plugins等) watch: { include: ['src/**/*', 'package.json'] // 监听源码和package.json }, // ... };
步骤2:用自定义插件动态读取版本号并注入
不要在配置顶部直接import pkg from './package.json'(这会被Node.js缓存),而是写一个自定义插件,在每次构建时直接读取文件内容,这样就能拿到最新的版本号,然后注入到产物中:
const injectVersionPlugin = () => { return { name: 'inject-version', // 插件名称,Rollup会用它做日志输出 async generateBundle(outputOptions, bundle) { // 用fs直接读取文件,绕开模块缓存 const fs = require('fs').promises; const pkgContent = await fs.readFile('./package.json', 'utf8'); const pkg = JSON.parse(pkgContent); // 给所有输出的代码块注入版本号 Object.values(bundle).forEach(chunk => { if (chunk.type === 'chunk') { chunk.code += `\nfoo.version = '${pkg.version}';`; } }); } }; };
然后把这个插件加到你的output配置里:
export default { // ...其他配置 output: [{ // 你的输出格式、路径等配置 plugins: [injectVersionPlugin()] }], watch: { include: ['src/**/*', 'package.json'] } };
为什么之前的方案失效?
- 直接
import pkg:配置文件在启动监听时只会加载一次,pkg会被Node.js缓存,后续修改package.json不会更新这个变量。 - 动态导入+renderStart:
renderStart阶段Rollup可能已经完成了模块解析,而且动态导入的模块依然会被缓存,没法拿到最新值。 - 自定义监听插件但没重新读取:你触发了重载,但读取版本号的逻辑还是用了缓存的旧值,自然不会更新。
用上面的方案,每次构建时都会重新读取package.json的最新内容,同时Rollup能感知到文件变化触发构建,版本号就会同步更新了,完全不用手动重启监听进程。
内容的提问来源于stack exchange,提问作者Eskel
相关产品推荐
相关产品推荐

