package.json 文件是用来管理本地安装 npm 包的唯一文件。它描述了当前项目依赖的包的列表,包含项目依赖包的版本,便于项目管理和移植
一、创建
1、npm init 即可在当前目录创建一个 package.json 文件,跟着步骤选项,手动创建package.json文件
2、npm init --yes 可以跳过回答问题步骤,直接生成默认值的 package.json 文件
二、package.json两部分
- “name” :全部小写,没有空格,可以使用下划线或者横线
- “version” :x.x.x 的格式,符合“语义化版本规则”
比如:
{
"name": "shixinzhang-demo-package",
"version": "1.0.0"
}
其他内容:
- description:描述信息,有助于搜索,如果 package.json 中没有 description 信息,npm 使用项目中的 README.md 的第一行作为描述信息。这个描述信息有助于别人搜索你的项目,因此建议好好写 description 信息。
- main: 入口文件,不固定,可自定义
- scripts:支持的脚本,默认是一个空的 test
- keywords:关键字,有助于在人们使用 npm search 搜索时发现你的项目
- author:作者信息
- license:默认是 MIT
- bugs:当前项目的一些错误信息,如果有的话
我们可以为 init
命令设置一些默认值
> npm set init.author.email "shixinzhang2016@gmail.com"
> npm set init.author.name "shixinzhang"
> npm set init.license "MIT"
指定依赖的包
在 package.json
文件中指定项目依赖的包,这样复制项目时,可以使用 npm install
下载
包有两种依赖方式:
- dependencies:在生产环境中需要用到的依赖
- devDependencies:在开发、测试环境中用到的依赖,在上线打包后的代码是不存在的
依赖包版本选择:
- ~会匹配最近的小版本依赖包,比如~1.2.3会匹配所有1.2.x版本,但是不包括1.3.0
- ^会匹配最新的大版本依赖包,比如^1.2.3会匹配所有1.x.x的包,包括1.3.0,但是不包括2.0.0
- *会匹配最新版本的依赖包,但会产生兼容问题,一般不推荐
版本号规范
项目的版本号都是从 1.0.0 版本开始。以后要升级版本应该遵循以下标准:
- 补丁版本:解决了 Bug 或者一些较小的更改,增加最后一位数字,比如 1.0.1
- 小版本:增加了新特性,同时不会影响之前的版本,增加中间一位数字,比如 1.1.0
- 大版本:大改版,无法兼容之前的,增加第一位数字,比如 2.0.0
安装 package
使用 npm 安装 package 有两种方式:本地(当前项目路径)安装 或者 全局安装
- 如果你只是想在当前项目里用 require() 加载使用,那你可以安装到本地 ,npm install 默认就是安装到本地的
- 如果你想要在命令行里直接使用,比如 grunt CLI,就需要安装到全局了
如果在你的项目里有 package.json
文件,运行 npm install
后它会查找文件中列出的依赖包,然后下载符合语义化版本规则的版本。
npm install
默认会安装 package.json
中 dependencies
和 devDependencies
里的所有模块。
如果想只安装 dependencies
中的内容,可以使用 --production
字段:
npm install --production
本地安装 package
npm 使用下面的命令下载一个包:
npm install <package_name>
后面就是要安装包的名称。这个命令会在当前目录创建一个 node_modules
目录,然后下载我们指定的包到这个目录中。
安装指定版本:
npm install
默认安装最新版本,如果想要安装指定版本,可以在库名称后加 @版本号
:
$ npm install sax@latest
$ npm install sax@0.1.1
$ npm install sax@">=0.1.0 <0.2.0"
- 如果当前项目有
package.json
文件,下载包时会下载这个文件中指定的版本; - 如果当前项目中没有
package.json
文件,就会下载指定包的最新版本。
如果下载报错:npm install error saveError ENOENT: no such file or directory, open '/Users/zhangshixin/package.json'
解决办法:
- 在目录下执行 npm init 创建 package.json,输入初始化信息
- 然后再执行下载命令
安装参数 --save
和 --save -dev
添加依赖时我们可以手动修改 package.json
文件,添加或者修改 dependencies
devDependencies
中的内容即可。
另一种方式是用命令行,在使用 npm install
时增加 --save
或者 --save -dev
后缀:
- npm install <package_name> --save 表示将这个包名及对应的版本添加到 package.json的 dependencies
- npm install <package_name> --save-dev 表示将这个包名及对应的版本添加到 package.json的 devDependencies
使用下载好的包
下载后 node_modules
文件夹中有要使用的包,我们就可以使用其中的代码了。
比如在 Node.js 项目中,我们可以用 require(XXX)
引入它。
在使用 require('lodash')
后引入了 lodash 库,然后调用了它的 without()
方法,这个方法可以去除第一个数组参数中与第二个参数重复的数据。
保存这个文件后,使用 node index.js
运行这个文件,成功的话就可以得到运行结果[2,3];
如果报错,先先在当前目录下重新运行 npm install lodash
安装,看是否报错。
更新本地 package
有时候我们想知道依赖的包是否有新版本,可以使用 npm outdated
查看,如果发现有的包有新版本,就可以使用 npm update <package-name>
更新它,或者直接 npm update
更新所有:
一开始,我们package.json里面定义的lodash的版本是3.10.1,
当我们用npm outdated,能看到最新版本是4.17.10
要更新到最新版本,我们需要把package.json改为*,然后执行npm update
只有当前模块版本低于远程,package.json 中的版本语义规则满足情况,才能更新成功。
npm uninstall <package-name> : 卸载本地 package
同时node_modules/lodash文件夹,以及package.json里面的"lodash": ....也一并删除了
全局安装 package
如果你想要直接在命令行中使用某个包,比如 jshint
,你可以全局安装它。
全局安装比本地安装多了个 -g
:
npm install -g <package-name>
以 jshint
为例,全局安装命令是:
npm install -g jshint
安装后可以使用 npm ls -g --depth=0
查看安装在全局第一层的包。
3.使用其他包管理器帮你解决这个问题
卸载 node,然后使用 Homebrew 重装 node:
brew install node
Homebrew 会帮我们处理好权限的问题。
npm outdated -g --depth=0:
查看需要更新的包
npm update -g <package>:
更新指定的包:
npm update -g:
要更新所有全局包
官方说在 2.6.1 以下的 npm ,直接使用 npm update -g
并不安全,因为它会递归地更新所有全局依赖。
npm check:检查当前版本与最新版本的比照图
npm uninstall -g <package>:
卸载全局 package
npm run:直接运行 package.json
中 scripts
指定的脚本:
{
"name": "demo",
"scripts": {
"lint": "jshint **.js",
"test": "mocha test/"
}
}
npm run 是 npm run-script 的缩写,命令行输入 npm run lint 或者 npm run-script lint 就会执行 jshint **.js 。
npm run 会创建一个Shell,执行指定的命令,并临时将node_modules/.bin加入PATH 变量,这意味着本地模块可以直接运行。
package.json 中的 scripts 执行的脚本是本地项目内 node_modules -> .bin 内的脚本。
直接运行 npm run 会列出当前项目的 package.json 中 scripts 属性下的所有脚本命令。
npm install 也可以直接从 github 下载:
$ npm install git://github.com/package/path.git
$ npm install git://github.com/package/path.git#0.1.0
npm info <package-name> 可以查看指定包的信息:
npm adduser 用于在npmjs.com注册一个用户:
npm home <package-name>命令可以打开指定模块的主页;
npm repo <package-name>命令则是打开指定模块的代码仓库。
npm prune “修剪”,npm prune 可以检查出当前项目的 node_modules目录中,没有在 package.json里提到的模块。