# 介绍

主要属性介绍:

  • name:包名称,必须少于 214 个字符,不能包含空格,只能包含小写字母、连字符-或下划线_,这是因为当软件包在 npm 上发布时,它会基于此属性获得自己的 URL。
  • main:引用时,指定默认位置。
  • private:设置 true 可以防止意外地发不到 npm
  • engines:设置了该包使用了哪个版本的 node
  • browserslist:用于告知要支持哪些浏览器
  • version:版本号x.x.x,这些数字的含义是,金修复缺陷的版本是补丁版本,引入向后兼容的更改的版本是次版本,具有重大更改的是主版本。
  • licennpmse:软件包的许可证
  • keywords:关键字,便于搜索用

# package.json官方字段

https://docs.npmjs.com/files/package.json (opens new window)

# package.json非官方字段

https://segmentfault.com/a/1190000016365409

# 软件包版本

语法使用了 semver(语义版本控制),具有以下规则:

  • ~: 如果写入的是 〜0.13.0,则只更新补丁版本:即 0.13.1 可以,但 0.14.0 不可以。
  • ^: 如果写入的是 ^0.13.0,则要更新补丁版本和次版本:即 0.13.1、0.14.0、依此类推。
  • *: 如果写入的是 *,则表示接受所有的更新,包括主版本升级。
  • >: 接受高于指定版本的任何版本。
  • >=: 接受等于或高于指定版本的任何版本。
  • <=: 接受等于或低于指定版本的任何版本。
  • <: 接受低于指定版本的任何版本。

还有其他规则:

  • 无符号:仅接收指定的特定版本。
  • latest:使用可用的最新版本。

还可以在范围内组合以上大部分内容,例如:1.0.0 || >=1.1.0 <1.2.0,即使用 1.0.0 或从 1.1.0 开始但低于 1.2.0 的版本。

# 入口

# main

定义了 npm 包的入口文件,browser 环境和 node 环境均可使用

# bin

指定包指令

# module

非官方字段。定义 npm 包的 ESM 规范的入口文件,browser 环境和 node 环境均可使用

# exports

Node.js 12+ 支持它作为“main”的替代方案,可以支持定义子路径导出和条件导出,同时封装内部未导出的模块。路径必须使用"./"开头

{
  "exports": {
    ".": {
      "import": "./dist/mymodule.mjs"
    }
  }
}

# resolutions

强行指定某个包的依赖包版本

"resolutions": {
  "foo/bar": "1.0.0" // 这里的 key"foo/bar"表示foo的直接依赖bar,把版本区间重写成1.0.0。
  "foo/**/bar": "1.0.0" // 不是直接依赖时,可以使用这种写法
  "bar": "1.0.0" // 所有依赖这个包都指向这个版本
}

# browser

定义 npm 包在 browser 环境下的入口文件

# 优先级

browser = browser+mjs > module > browser+cjs > main

# 总结

如果 npm 包导出的是 ESM 规范的包,使用 module

如果 npm 包只在 web 端使用,并且严禁在 server 端使用,使用 browser。

如果 npm 包只在 server 端使用,使用 main

如果 npm 包在 web 端和 server 端都允许使用,使用 browser 和 main

其他更加复杂的情况,如npm 包需要提供 commonJS 与 ESM 等多个规范的多个代码文件,请参考上述使用场景或流程图

参考:https://juejin.cn/post/6844903862977953806

# files

files是一个文件数组,描述了将软件包作为依赖项安装时要包括的条目。如果在数组里面声明了一个文件夹,那也会包含文件夹中的文件。某些特殊文件和目录也被包括或排除在外,无论它们是否存在于文件数组中。

以下文件无论是否设置,总是包含:
*   `package.json`
*   `README`
*   `CHANGES`/`CHANGELOG`/`HISTORY`
*   `LICENSE`/`LICENCE`
*   `NOTICE`
*   The file in the “main” field
以下文件总是被忽略:
*   `.git`
*   `CVS`
*   `.svn`
*   `.hg`
*   `.lock-wscript`
*   `.wafpickle-N`
*   `.*.swp`
*   `.DS_Store`
*   `._*`
*   `npm-debug.log`
*   `.npmrc`
*   `node_modules`
*   `config.gypi`
*   `*.orig`
*   `package-lock.json`(use shrinkwrap instead)

# dependencies

# Git URLs as Dependencies

Examples:

git+ssh://git@github.com:npm/cli.git#v1.0.27
git+ssh://git@github.com:npm/cli#semver:^5.0
git+https://isaacs@github.com/npm/cli.git
git://github.com/npm/cli.git#v1.0.27

实例:

{
  ...
  "dependencies": {
    "remember-scroll": "git+ssh://git@github.com:fengxianqi/remember-scroll.git#v0.1.1",
  },
  "devDependencies": {
    ...
  }
}

# publishConfig

设置推送时候的地址:"publishConfig": { "registry": "https://registry.npmjs.com/"}

# type, typing(非官方字段)

就像 main 字段一样,定义一个针对 TypeScript 的入口文件。指定该字段后,vscode会自动引入类型提示。