package.json 常见配置项如下:
scripts(快捷脚本)
scripts 字段是 package.json 中的一种元数据功能,它接受一个对象,对象的属性为可以通过 npm run运行的脚本,值为实际运行的命令(通常是终端命令),如:
"scripts": {
"start": "node index.js"
},
将终端命令放入 scripts 字段,既可以记录它们又可以实现轻松重用。
config
config字段用来配置scripts运行时的配置参数,如下所示:
{
"config": {
"port": 3000
}
}
如果运行npm run start,则port字段会映射到npm_package_config_port环境变量中:
console.log(process.env.npm_package_config_port) // 3000
用户可以通过npm config set foo:port 3001 命令来重写port的值。
dependencies & devDependencies(项目依赖)
dependencies 字段指定了项目运行所依赖的模块,可以理解为我们的项目在生产环境运行中要用到的东西。比如说我们常用的antd只能哪个代码块就会用到里面的组件,所以要放到dependencies里面去
devDependencies字段指定了项目开发所需要的模块,开发环境会用到的东西,比如说webpack。我们打包的时候会用到,但是项目运行的时候却用不到,所以只需要放到devDependencies中去就好了,类似的eslint之类的
这里重点谈一下这些版本号直接的差异
npm包的版本号由主版本号.次版本号.补丁版本号[major, minor, patch]组成。
~1.1.1
1.1.1 <= 支持版本 < 1.2.0
~(锁定次版本号,且补丁号不小于当前补丁号)
^1.1.1
1.1.1 <= 支持版本 < 2.0.0
^(锁定主版本号,且次版本号和补丁号不小于当前)
其他一些情况:
*: >=0.0.0(任何版本都满足)
1.x: >=1.0.0 <2.0.0-0(匹配主要版本)
1.2.x: >=1.2.0 <1.3.0-0(匹配主要和次要版本)
1.2.3 - 2.3.4 : >=1.2.3 <=2.3.4
engines
指定项目 node及npm 版本
"engines": {
"node": ">= 8.16.0",
"npm": ">= 6.9.0"
},
需要注意的是,engines属性仅起到一个说明的作用,当用户版本不符合指定值时也不影响依赖的安装。
os
模块适用系统
假如我们开发了一个模块,只能跑在 darwin 系统下,我们需要保证 windows 用户不会安装到该模块,从而避免发生不必要的错误。
这时候,使用 os 属性则可以帮助我们实现以上的需求,该属性可以指定模块适用系统的系统,或者指定不能安装的系统黑名单(当在系统黑名单中的系统中安装模块则会报错):
"os" : [ "darwin", "linux" ] # 适用系统
"os" : [ "!win32" ] # 黑名单
Tips:在 node 环境下可以使用 process.platform 来判断操作系统。
cpu
指定模块适用 cpu 架构
和上面的 os 字段类似,我们可以用 cpu 字段更精准的限制用户安装环境:
"cpu" : [ "x64", "ia32" ] # 适用 cpu
"cpu" : [ "!arm", "!mips" ] # 黑名单
Tips:在 node 环境下可以使用 process.arch 来判断 cpu 架构。
private
定义私有模块
一般公司的非开源项目,都会设置 private 属性的值为 true,这是因为 npm 拒绝发布私有模块,通过设置该字段可以防止私有模块被无意间发布出去。
name
项目名称
这个名称和你要发布项目到npm上的有关系。
假如你不想发布的话那这个name和version就不是必填项了
version
版本号
version和name组成在npm内部的一个唯一标识符。
description
项目描述
此文档是您需要了解的有关 package.json 文件中所需内容的全部信息。它必须是实际的 JSON,而不仅仅是 JavaScript对象文字。
keywords
把关键字放进去。它是一个字符串数组
homepage
项目主页的url
type
js的模块化规范包含了commonjs、CMD、UMD、AMD和ES module等,最早先在node中支持的仅仅是commonjs字段,但是从node13.2.0开始后,node正式支持了ES module规范,在package.json中可以通过type字段来声明npm包遵循的模块化规范。
{
type: "module"||"commonjs"
}
不指定type的时候,type的默认值是commonjs,不过建议npm包都指定一下type
main
main 字段用来指定加载的入口文件,在 browser 和 Node 环境中都可以使用。如果我们将项目发布为npm包,那么当使用 require 导入npm包时,返回的就是main字段所列出的文件的module.exports 属性。如果不指定该字段,默认是项目根目录下的index.js。如果没找到,就会报错。
该字段的值是一个字符串:
"main": "./src/index.js",