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

NPM包使用Rollup打包时依赖是否入包的最佳实践咨询

Rollup 打包 NPM 公共包的依赖处理最佳实践

你的基础分析逻辑完全正确,以下是行业通用的最佳实践方案:

一、依赖是否打入产物的核心判断规则

  • dependencies、peerDependencies下的依赖不需要打入最终产物:这类依赖都会在用户安装你的包时自动(或提示手动)安装,由上层项目的构建工具统一处理即可,既可以避免依赖重复打包导致体积膨胀,也能保证依赖版本的灵活性。
  • 仅两种特殊场景需要把第三方依赖打入产物:
    • 依赖是你自己的私有包,没有发布到公开 NPM 源,上层项目无法直接安装
    • 你对第三方依赖做了定制修改,且不希望上层项目安装的同依赖版本覆盖你的修改(这种情况更推荐用patch-package等方案处理,尽可能避免直接打包依赖)
  • devDependencies下的依赖都是开发、构建、测试场景使用,不会出现在src的运行时代码里,不需要额外处理。

二、Rollup 标记external的实现方案

你提到的两种方案都可以用,优先推荐更省心的维护中方案:

方案1:使用rollup-plugin-node-externals插件(通用场景首选)

你提到的rollup-plugin-peer-deps-external已经停止维护,includeDependencies配置废弃也是停更导致的,目前行业通用的替代方案是rollup-plugin-node-externals,它可以自动把package.json里的dependencies、peerDependencies、optionalDependencies全部标记为external,不需要手动写判断逻辑,配置如下:

import nodeExternals from 'rollup-plugin-node-externals'

export default {
  plugins: [
    // 要放在其他所有插件的最前面
    nodeExternals({
      // 可选配置:如果有特殊需要打包的依赖,加到exclude数组即可
      exclude: ['some-pack-you-want-to-bundle']
    })
  ]
}

方案2:手动判断裸模块ID(适合定制化需求高的场景)

如果你需要自定义排除逻辑,比如要把项目内的特定私有目录模块排除在external规则外,可以用 React Router 同款的手动判断方案,根据自己的项目结构调整判断条件即可,稳定性很高:

function isBareModuleId(id) {
  // 不是相对路径、也不是绝对路径的本地模块,就判定为第三方依赖,标记为external
  return !id.startsWith('.') && !path.isAbsolute(id)
}

export default {
  external: isBareModuleId
}

三、额外注意事项

  • 如果你要输出 UMD 格式的产物给浏览器直接引用,需要额外配置output.globals给标记为external的依赖指定对应的全局变量名,避免运行时找不到依赖。
  • 如果你的包引入了node:前缀的 Node.js 内置模块,上述两种方案都会自动将其标记为external,不需要额外处理。

内容的提问来源于stack exchange,提问作者Wayne Mao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:42:01