阅读 35

package.json 使用指南

1. 概述

一般的 node 项目,或者依据 node 搭建的项目,项目的根目录下都会有一个 package.json 文件,package.json 中定义了项目所需要的各种模块和项目的配置信息。

package.json 可以手动创建,也可以使用 npm init 去自动生成。

一个完整的 package.json 一般都包含以下内容

{
  "name": "hello world",
  "version": "1.0.0",
  "author": "小石",
  "description": "一个node程序",
  "keywords": ["node.js", "js"],
  "scripts": {
    "start": "gulp",
    "build:js": "gulp uglify-js"
  },
  "license": "ISC",
  "devDependencies": {
    "@babel/core": "^7.1.2",
    "@babel/preset-env": "^7.1.0"
  },
  "dependencies": {
    "browser-sync": "^2.23.6"
  }
}
复制代码

其中nameversion(遵循大版本,次要版本,小版本),descriptionauthorkeywords,都属于 package.json的一些基本信息,主要的功能还是依赖 scriptsdependenciesdevDependencies

2. scripts

scripts 主要指定了一些脚本命令的缩写,比如上面的例子中,使用 npm start 就可以运行 gulp 的脚本命令;使用 npm run build:js 就可以运行 gulp uglify-js 的脚本命令。

有些命令缩写需要写run修饰符,有些不需要,主要还是看命令的缩写是不是 npm 的关键字。可以在小黑窗(命令行工具)中输入npm查看具体npm的关键字。

如:

蓝框框起来的命令,在使用的时候都不需要写 run,直接输入 npm XX 即可运行指定的命令。

在使用 scripts 指定脚本缩写的时候还有一些小技巧。

2.1 scripts 命令的生命周期

在编写运行脚本命令缩写时,有生命周期的说话,在某个脚本缩写之前使用 pre ,当运行指定的脚本命令之前,会先将对应添加了 pre 的命令进行运行。

如:

"scripts": {
    "pree2e": "karma start",
    "e2e": "node ./e2e/*.spec.js"
},
复制代码

e2e 命令之前添加了一条 pree2e 的命令,在执行 npm run e2e 的时候,就会先执行 pree2e 对应的命令,然后执行 e2e 对应的命令。

小黑窗中执行的命令就如下图所示:

2.2 && 和 & 的使用

在编写 scripts 命令时,如果多条命令想写到一个缩写中,可以使用 &&& 符号。

使用 && 连接的命令属于串行执行,先执行 && 之前的命令,再执行&&之后的。

使用 & 连接的命令属于并行执行,互不干扰,命令同时进行。

如:

"scripts": {
    "e2e": "karma start && node ./e2e/*.spec.js",
    "unit": "karma start & node ./e2e/*.spec.js"
},
复制代码

2.3 多条命令一起运行

很大的项目中有的时候会有很多条 scripts 命令的缩写,有的时候需要将多条命令同时执行,可以使用上面说的 &&& 符号连接,但是当很多条命令一起执行时,使用 &&& 连接,看起来就会很冗余。

这个时候就要用到 npm-run-all 命令了。

如:

"scripts": {
    "test": "npm-run-all unit  e2e  ui  service",
    "unit": "karma start",
    "pree2e": "karma start",
    "e2e": "node ./e2e/*.spec.js",
    "ui": "backstop test",
    "service": "node ./mochaRunner"
}
复制代码

npm-run-all 命令可以规定有些命令可以一起执行,但是这个是串行的执行,有一个命令挂了就会导致命令停止。

这个时候还可以添加一个关键字 --parallel ,表示后面的命令同时执行。

如:

 "test": "npm-run-all --parallel unit  e2e  ui  service"
复制代码

2.4 命令的退出

在写脚本命令的时候可以使用 exit() 退出,exit(0) 表示正常退出,exit(1) 表示非正常退出,其实这些都是 node 中的命令,在 node 中使用更多一些。

 "test": "npm-run-all --parallel unit  e2e  ui  service exit()"
复制代码

在 node 中 process.exit(0) 表示正常退出,process.exit(1) 表示非正常退出,非正常退出可以再处理异常的时候使用。

3. dependencies 和 devDependencies

3.1 简介

dependenciesdevDependencies 中其实都是添加一些项目中需要引用的依赖包。但是两者是有区别的,dependencies 中依赖包主要是项目运行时所需要的,在打包的时候会将依赖包打到项目中。devDependencies 主要是项目开发时所需要的依赖模块,这个主要是开发的时候用,打包的时候不会打到项目中。

dependenciesdevDependencies 下的依赖都有版本号。在对应的版本号上可以添加各种限定,主要有一下几种:

  • 指定版本:比如 1.2.2,遵循“大版本.次要版本.小版本”的格式规定,安装时只安装指定版本。
  • 波浪号(tilde)+指定版本:比如~1.2.2,表示安装 1.2.x 的最新版本(不低于 1.2.2),但是不安装 1.3.x,也就是说安装时不改变大版本号和次要版本号。
  • 插入号(caret)+指定版本:比如 ˆ1.2.2,表示安装 1.x.x 的最新版本(不低于 1.2.2),但是不安装 2.x.x,也就是说安装时不改变大版本号。需要注意的是,如果大版本号为 0,则插入号的行为与波浪号相同,这是因为此时处于开发阶段,即使是次要版本号变动,也可能带来程序的不兼容。
  • latest:安装最新版本。

3.2 安装

在安装某一个模块时,会根据使用的命令不同,指定依赖包运行的环境。

如:

npm install express --save
npm install express --save-dev
复制代码

使用 --save 会默认将依赖包安装到 dependencies 下,使用--save-dev会将依赖包安装到 devDependencies 下。

4. bin

bin 项用来指定各个内部命令对应的可执行文件的位置。

如:

"bin": {
  "someTool": "./bin/someTool.js"
}
复制代码

有了上面的 bin 之后,我们写 scripts 命令时,就可以进行缩写了。

如:

scripts: {
  start: './node_modules/someTool/someTool.js build';
}

// 简写为
scripts: {
  start: 'someTool build';
}
复制代码

5. 其他

其他的命令还有很多,上面的主要是常用的,还想详细了解的,可以参考JavaScript 标准参考教程

其实 package.json 只是一个配置的 json 文件,懂一些基础的就可以了,能使用最重要,开发中最重要的还是项目主体的开发,好多脚手架其实已经帮我们把这些都弄好了,我们要能看懂。

阅读完后两部曲

  1. 喜欢的小伙伴点个赞吧,感觉对身边人有帮助的,麻烦动动手指,分享一下。非常感谢各位花时间阅读完,同时很感谢各位的点赞和分享。
  2. 希望各位关注一下我的公众号吧,新的文章第一时间发到公众号,公众号主要发一些个人随笔、读书笔记、还有一些技术热点和实时热点,并且还有非常吸引人的我个人自费抽奖活动哦~

关注下面的标签,发现更多相似文章
评论