npm 包入口与对应文件类型

838 阅读1分钟

npm 包入口与对应文件类型

npm 包划分

  • 只允许在 web 端使用的
  • 只允许在 server 端使用的(包含 webpack,rollup 等工具)
  • web 端/server 端都可以使用

IIFE,CJS,ESM,UMD

文件类型包入口字段使用场景
iifejsdelivr unpkgweb 使用,供 CDN 选择路径,添加全局变量到浏览器中
cjsmainnode 环境使用,使用 require('module'),默认入口
esmmodulenode/web 环境均可,都需设置 type 为 module
umdbrowserweb 使用,该字段亦会被 webpack 调用

webpack 的mainFields字段默认值: ["browser", "module", "main"],browser 会被 cdn 加载,故 browser 最好使用 umd 格式

使用 exports 条件导出

推荐使用 exports 代替 main,这样只能引入exports指定的文件,如 import "pkg/other_file.js" 没有配置在exports中,就无法被引入

{
  "main": "./index.js", // 兼容不支持 exports 的 node
  "exports": {
    "require": "./lib/index.cjs.js",
    "import": "./lib/index.esm.js",
    "default": "./lib/index.esm.js"
  }
}

总结

  • 最好使用 exports 条件导出
  • 如导出的是 ESM 规范的包,使用 module
  • 如只在 web 端使用,并且严禁在 server 端使用,使用 unpkg 或 jsdelivr
  • 如只在 server 端使用,使用 module,main
  • 如在 web 端和 server 端都允许使用,使用 unpkg,jsdelivr,module 和 main

实践

完全使用 esm,如有不同环境需求,通过 rollup 打包成支持其他目标环境的格式 esm 给打包器使用,iife 给浏览器,cjs 给 node

参考链接

cjs, umd, esm or iife?
package.json 中的 browser,module,main 字段优先级探索
在 Nodejs 或浏览器运行 ESM 代码
nodejs 官方文档 package 包
vue3