Contents

package.json 中的字段

分三类

  • 为 Node.js 所用的
  • 为 npm 所用
  • 为某些 package 所用的,比如 rollup、babel、webpack、typescript 等(npm 其实也可以归到这类,只不过像 npm 这样的 package 稍特殊些,人家是 package manager)

为 Node.js(v19.0.0) 所用

  • name:package name
  • main:指定 package 的默认入口 module
  • packageManager:指定包管理器(是 npm、yarn 或是 pnpm),依赖 Corepack
  • type:决定当前 package 的模块类型是 是 esm 还是 cjs
  • exports:优先级高于并且可替代 main field,v12+ 可用
  • imports:供 package 内部引入自身的 module 时使用,相当于 vue-cli 中的 path alias

为 npm(v8.19.2) 所用

  • name

  • version

  • description

  • keywords

  • homepage

  • bugs

  • license

  • author

  • contributions

  • funds

  • files:发布时包含的文件(目录)列表,某些文件被默认忽略

  • main:package 的入口文件,若无则默认为同级目录下的 index.js

  • browsers: 用于告知(大多是那些 bundler)此 package 是在浏览器端运行。https://github.com/defunctzombie/package-browser-field-spec

  • bin:全局安装时可用作命令行工具

  • man:配合 man 命令提供手册

  • repository:源码所在地

  • scripts

  • dependencies:Packages required by your application in production

  • devDependencies:Packages that are only needed for local development and testing. 通过 npm install 安装 package A 依赖时,package A 的 devDependencies 不会被安装

  • peerDependencies:比如 webpack 的某个插件依赖 webpack,这个插件将 webpack 列入 dependencies 和 devDependencies 似乎都不太合适,这样的依赖就列入 peerDependencies。v3 到 v6 不会自动安装,v7 之后默认自动安装

  • peerDependenciesMeta:顾名思义,用于描述 peerDependencies 中的依赖,可以将某个依赖标记为 optional 为 false,此时当这个依赖没有被安装时 npm 就不会发出警告

  • bundleDependencies:In cases where you need to preserve npm packages locally or have them available through a single file download, you can bundle the packages in a tarball file by specifying the package names in the bundleDependencies array and executing npm pack

  • optionalDependencies:安装失败也不会报错的 dependencies

  • overrides

  • engines:指定 node 或 npm 版本

  • os:指定操作系统

  • cpu:执行 cpu

  • private:为 true 时不会被发布

  • workspaces

为一些知名 package 所定义

比如 rollup 的 module,typescript 的 types、typing 以及 lint-staged 的 lint-staged 等

关于 browser、module、main、exports

browser 和 module 字段主要是由一些打包工具比如 webpack、rollup 等使用,用以告诉那些 bundler 当前 package 只在浏览器端运行,以及使用的模块类型是否是 esm。

main 和 exports 是 Node.js 标准引入,支持灵活配置的后者被推荐为在新项目中使用以代替前者。可以根据不同的运行环境(比如是通过 import 加载还是 require 加载)使用条件导出不同的代码;也可以定义 submodule 的导出,未被定义的 submodule 则不允许被其他 module 通过 module 路径导入,在支持 exports 的 Node.js 版本中,该字段的优先级大于 main 字段。

个人感觉 exports 字段应该可以取代 browser 字段在那些 bundler 中的作用。