You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 21:52:39