通常的 node 项目,或者依据 node 搭建的项目,项目的根目录下都会有一个 package.json
文件,package.json
中定义了项目所须要的各类模块和项目的配置信息。javascript
package.json
能够手动建立,也可使用 npm init
去自动生成。html
一个完整的 package.json
通常都包含如下内容java
{
"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"
}
}
复制代码
其中name
,version
(遵循大版本,次要版本,小版本),description
,author
,keywords
,都属于 package.json
的一些基本信息,主要的功能仍是依赖 scripts
,dependencies
,devDependencies
。node
scripts
主要指定了一些脚本命令的缩写,好比上面的例子中,使用 npm start
就能够运行 gulp
的脚本命令;使用 npm run build:js
就能够运行 gulp uglify-js
的脚本命令。shell
有些命令缩写须要写run
修饰符,有些不须要,主要仍是看命令的缩写是否是 npm
的关键字。能够在小黑窗(命令行工具)中输入npm
查看具体npm
的关键字。express
如:npm
蓝框框起来的命令,在使用的时候都不须要写 run
,直接输入 npm XX
便可运行指定的命令。json
在使用 scripts
指定脚本缩写的时候还有一些小技巧。gulp
在编写运行脚本命令缩写时,有生命周期的说话,在某个脚本缩写以前使用 pre
,当运行指定的脚本命令以前,会先将对应添加了 pre 的命令进行运行。babel
如:
"scripts": {
"pree2e": "karma start",
"e2e": "node ./e2e/*.spec.js"
},
复制代码
给 e2e
命令以前添加了一条 pree2e
的命令,在执行 npm run e2e
的时候,就会先执行 pree2e
对应的命令,而后执行 e2e
对应的命令。
小黑窗中执行的命令就以下图所示:
在编写 scripts
命令时,若是多条命令想写到一个缩写中,可使用 &&
和 &
符号。
使用 &&
链接的命令属于串行执行,先执行 &&
以前的命令,再执行&&
以后的。
使用 &
链接的命令属于并行执行,互不干扰,命令同时进行。
如:
"scripts": {
"e2e": "karma start && node ./e2e/*.spec.js",
"unit": "karma start & node ./e2e/*.spec.js"
},
复制代码
很大的项目中有的时候会有不少条 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"
复制代码
在写脚本命令的时候可使用 exit()
退出,exit(0)
表示正常退出,exit(1)
表示非正常退出,其实这些都是 node 中的命令,在 node 中使用更多一些。
"test": "npm-run-all --parallel unit e2e ui service exit()"
复制代码
在 node 中
process.exit(0)
表示正常退出,process.exit(1)
表示非正常退出,非正常退出能够再处理异常的时候使用。
dependencies
和 devDependencies
中其实都是添加一些项目中须要引用的依赖包。可是二者是有区别的,dependencies
中依赖包主要是项目运行时所须要的,在打包的时候会将依赖包打到项目中。devDependencies
主要是项目开发时所须要的依赖模块,这个主要是开发的时候用,打包的时候不会打到项目中。
dependencies
和 devDependencies
下的依赖都有版本号。在对应的版本号上能够添加各类限定,主要有一下几种:
在安装某一个模块时,会根据使用的命令不一样,指定依赖包运行的环境。
如:
npm install express --save
npm install express --save-dev
复制代码
使用 --save
会默认将依赖包安装到 dependencies
下,使用--save-dev
会将依赖包安装到 devDependencies
下。
bin 项用来指定各个内部命令对应的可执行文件的位置。
如:
"bin": {
"someTool": "./bin/someTool.js"
}
复制代码
有了上面的 bin 以后,咱们写 scripts
命令时,就能够进行缩写了。
如:
scripts: {
start: './node_modules/someTool/someTool.js build';
}
// 简写为
scripts: {
start: 'someTool build';
}
复制代码
其余的命令还有不少,上面的主要是经常使用的,还想详细了解的,能够参考JavaScript 标准参考教程。
其实 package.json
只是一个配置的 json 文件,懂一些基础的就能够了,能使用最重要,开发中最重要的仍是项目主体的开发,好多脚手架其实已经帮咱们把这些都弄好了,咱们要能看懂。