共被编辑 1 次

版本 更新时间 贡献者 编辑原因 操作
#r1 9月11日 岑小早1 创建问题 查看

npm package 打包针对不同运行环境要做什么处理?

问题描述

我有一个 package 就叫它 - MyPKG 引用了 lodash.debounce, MyPKG 的运行环境为: [浏览器, nodejs, es-module]

MyPKG 使用 rollup 打包进行了 tree shaking, 只将 lodash.debounce 打包进去了, 输出一个 umd 模块, 所有环境均使用这个打包结果 (言下之意就是 package.json 中, main,browser,module,unpkg 均指向同一个文件)

但是我认为这样做仍然存在问题:
1.如果用户的项目也使用了 lodash, 那么用户的构建产物, 可能包含两份 lodash.debounce
2.如果用户的项目也使用了 lodash, 当用户的 lodash 和 MyPKG 的 lodash 版本不一致的时候, 用户将会安装两个版本的 lodash.

基于如上的问题, MyPKG 将会是一个不受欢迎的 package.

我的期望结果

大致了解了一下 peerDependence 字段

1.浏览器环境: 输出一份 amd 模块, 包含 lodash.debounce
2.nodejs 环境输出一份 commonjs 模块, 包含 lodash.debounce
3.jsnext:main 输出一份 es6 模块, 是否包含 lodash.debounce 要根据用户本地环境决定

我的初步方案

针对不同运行环境进行差异化构建, 可能要使用三份 rollup 配置吧?

我希望了解的答案

1.针对我的问题, 应该不是个例, 有相关文章是讲解这个问题的吗?
2.很多包都有这样的需求, 有没有最佳实践可以推荐一下, 或者说科普一下?