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

使用Rollup打包依赖含Node条件require的UMD浏览器库问题

解决Rollup对条件内Node模块require的提升问题

核心原因

@rollup/plugin-commonjs默认会将所有require调用视为静态依赖进行提升处理,哪怕它们处于条件分支中,这就导致原本只在Node环境下执行的require('os')等语句被提前处理,破坏了原有的条件逻辑。

解决方案

1. 让CommonJS插件忽略特定Node内置模块的require解析

修改rollup.config.js中@rollup/plugin-commonjs的配置,添加ignore选项指定需要忽略的Node内置模块,这样Rollup就不会对这些模块的require调用进行提升或解析:

import commonjs from '@rollup/plugin-commonjs';
import nodeResolve from '@rollup/plugin-node-resolve';
import typescript from '@rollup/plugin-typescript';

export default {
  input: 'src/index.ts',
  output: {
    file: 'dist/your-library.umd.js',
    format: 'umd',
    name: 'YourLibraryName'
  },
  plugins: [
    nodeResolve({
      browser: true, // 优先解析适合浏览器环境的模块
      preferBuiltins: false // 禁用优先使用Node内置模块的行为
    }),
    commonjs({
      ignore: ['os', 'http', 'https'] // 忽略这些Node内置模块的require处理
    }),
    typescript()
  ]
};

2. 消除缺失内置模块的警告

如果配置后仍有关于缺失Node内置模块的警告,可以使用rollup-plugin-ignore插件将这些模块标记为忽略,避免Rollup尝试打包它们:
首先安装插件:

npm install rollup-plugin-ignore --save-dev

然后在配置中添加:

import ignore from 'rollup-plugin-ignore';

export default {
  // ...其他配置
  plugins: [
    ignore(['os', 'http', 'https']), // 提前忽略这些模块
    nodeResolve({ browser: true, preferBuiltins: false }),
    commonjs({ ignore: ['os', 'http', 'https'] }),
    typescript()
  ]
};

3. 验证效果

重新执行Rollup构建后,检查生成的bundle文件,原本处于Node环境检测条件内的require('os')等语句应该会保留原有的条件逻辑,不会被提前提升为require$$0之类的调用。

注意:因为这些require语句只在Node环境下执行,而你的库目标是浏览器环境,所以即使保留这些语句也不会在浏览器中触发,不会影响浏览器端的功能。

内容的提问来源于stack exchange,提问作者José Cabo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:55:38