美文网首页
认识package.json

认识package.json

作者: 小杰66 | 来源:发表于2021-04-10 17:13 被阅读0次

每个项目根目录下都有一个 package.json 文件,其定义了运行项目所需要的各种依赖和项目的配置信息。可以使用 npm init -y 命令在项目目录下生成一个 package.json文件。

必备属性(name & version)

  • package.json 中有非常多的配置项,其中必须填写的两个字段分别是 name 字段和 version 字段,它们是组成一个 npm 模块的唯一标识。

name 字段

  • name 字段定义了模块的名称,其命名时需要遵循官方的一些规范和建议:
    • 模块名会成为模块 url、命令行中的一个参数或者一个文件夹名称,任何非 url 安全的字符在模块名中都不能使用(我们可以使用 validate-npm-package-name 包来检测模块名是否合法);
    • 语义化模块名,可以帮助开发者更快的找到需要的模块,并且避免意外获取错误的模块;
    • 若模块名称中存在一些符号,将符号去除后不得与现有的模块名重复,例如:由于 react-router-dom 已经存在,react.router.domreactrouterdom 都不可以再创建。
  • name 字段不能与其他模块名重复,我们可以执行npm view <packageName>命令查看模块名是否已经被使用。
  • 或者,我们也可以去 npm 上输入模块名,如果搜不到,则可以使用该模块名。

version 字段

  • npm 包中的模块版本都需要遵循 SemVer 规范,该规范的标准版本号采用 X.Y.Z 的格式,其中 XYZ 均为非负的整数,且禁止在数字前方补零:
    • X 是主版本号(major):修改了不兼容的 API
    • Y 是次版本号(minor):新增了向下兼容的功能
    • Z 为修订号(patch):修正了向下兼容的问题
  • 当某个版本改动比较大、并非稳定而且可能无法满足预期的兼容性需求时,我们可能要先发布一个先行版本。
  • 先行版本号可以加到主版本号.次版本号.修订号的后面,通过 - 号连接一连串以句点分隔的标识符和版本编译信息:
    • 内部版本(alpha)
    • 公测版本(beta)
    • 正式版本的候选版本rc(即 Release candiate)
  • 我们可以执行以下命令查看模块的版本:
npm view <packageName> version # 查看某个模块的最新版本
npm view <packageName> versions # 查看某个模块的所有历史版本

描述信息(description & keywords)

  • description 字段用于添加模块的描述信息,便于用户了解该模块。
  • keywords 字段用于给模块添加关键字。
  • 当我们使用 npm 检索模块时,会对模块中的 description 字段和 keywords 字段进行匹配,写好 package.json中的 descriptionkeywords 将有利于增加我们模块的曝光率。

安装项目依赖(dependencies & devDependencies)

  • dependencies字段指定了项目运行所依赖的模块(生产环境使用),如 antdreactmoment等插件库:
    • 它们是我们生产环境所需要的依赖项,在把项目作为一个 npm 包的时候,用户安装 npm 包时只会安装 dependencies 里面的依赖。
  • devDependencies 字段指定了项目开发所需要的模块(开发环境使用),如 webpacktypescriptbabel等:
    • 在代码打包提交线上时,我们并不需要这些工具,所以我们将它放入 devDependencies 中。
  • 如果一个模块不在 package.json 文件之中,我们可以单独安装这个模块,并使用相应的参数,将其写入 dependencies 字段/ devDependencies 字段中:
# 使用 npm
npm install <package...> --save # 写入 dependencies 属性
npm install <package...> --save-dev # 写入 devDependencies 属性

# 使用 yarn
yarn add <package...> # 写入 dependencies 属性
yarn add <package...> --dev # 写入 devDependencies 属性
  • 有了 package.json 文件,开发直接使用 npm install 命令,就会在当前目录中自动安装所需要的模块,安装完成项目所需的运行和开发环境就配置好了。

简化终端命令(scripts)

  • scripts 字段是 package.json 中的一种元数据功能,它接受一个对象,对象的属性为可以通过 npm run运行的脚本,值为实际运行的命令(通常是终端命令),如:
"scripts": {
  "start": "node index.js"
},
  • 将终端命令放入 scripts 字段,既可以记录它们又可以实现轻松重用。

定义项目入口(main)

  • main 字段是 package.json 中的另一种元数据功能,它可以用来指定加载的入口文件。假如你的项目是一个 npm 包,当用户安装你的包后,require('my-module') 返回的是 main 字段中所列出文件的 module.exports 属性。
  • 当不指定main 字段时,默认值是模块根目录下面的index.js 文件。

发布文件配置(files)

  • files 字段用于描述我们使用 npm publish 命令后推送到 npm 服务器的文件列表,如果指定文件夹,则文件夹内的所有内容都会包含进来。
  • 我们可以查看下载的 antdpackage.jsonfiles 字段,内容如下:
"files": [
    "dist",
    "lib",
    "es"
],
  • 另外,我们还可以通过配置一个 .npmignore 文件来排除一些文件, 防止大量的垃圾文件推送到 npm 上。

定义私有模块(private)

  • 一般公司的非开源项目,都会设置 private 属性的值为 true,这是因为 npm 拒绝发布私有模块,通过设置该字段可以防止私有模块被无意间发布出去。

指定模块适用系统(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 架构。

指定项目 node 版本(engines)

  • engines 字段可以指定适用的 node 版本:
"engines": {
   "node": ">= 8.16.0"
},
  • 该字段也可以指定适用的 npm 版本:
"engines": {
   "npm": ">= 6.9.0"
 },
  • 需要注意的是,engines属性仅起到一个说明的作用,当用户版本不符合指定值时也不影响依赖的安装。

转自:https://juejin.cn/post/6844904159226003463

相关文章

网友评论

      本文标题:认识package.json

      本文链接:https://www.haomeiwen.com/subject/hzsnkltx.html