npm笔记
参考自:
1. npm 常用命令详解
2. npm入门文档
3. npm 中文文档
概念理解
什么是NPM
NPM的全称是Node Package Manager,是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:
- 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
- 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
- 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
npm 由三个独立的部分组成:网站、注册表(registry)和命令行工具(CLI)。网站主要是让用户查找 package 的;注册表(registry)是一个巨大的数据库,保存了每个 package 信息的;命令行工具(CLI)是开发者用来发布自己的 package 到注册表或者下载所需 package 的工具。
由于新版的nodejs已经集成了npm,所以直接安装nodejs就可以了。
什么是包/模块
nodejs以包的形式组织程序模块,而包的定义却十分简单——包含文件内容符合规范package.json文件的目录或归档文件,并通过”package-name”@”version”来唯一标识每个包。
package.json
包的定义和NPM都围绕着package.json文件做文章,package.json文件其实就相当于JAVA中的MANIFEST.MF文件,用于存放模块的名称、版本、作者、机构、模块入口、依赖项等信息。首先我们通过
npm init
命令在当前工作目录下以用户引导的方式创建一个全新的package.json文件。然后通过
npm help json
命令打开帮助文档,并根据实际的项目需求自行初始化package.json的项目即可。下面将对基础配置项进行叙述:
- name:必选项,表示模块名称。命名时不能包含js、node、和url中需要转义的字符,不能以
.
和_
为开头。 - version:必选项,表示模块的版本号。版本号以主版本号(Major).副版本号(Minor).补丁版本号(Patch)构成(如1.2.0)。 而engines、dependencies和devDependencies等配置项中可使用语义化版本号语法,具体如下(假设当前版本号是 1.1.0):
- 兼容模块新发布的补丁版本:~1.1.0、1.1.x、1.1
- 兼容模块新发布的小版本、补丁版本:^1.1.0、1.x、1
- 兼容模块新发布的大版本、小版本、补丁版本:*、x
- main:必选项,模块入口文件相对路径(相对于模块根目录)。
- description:可选项,表示模块功能描述,显示在
npm search "package-name"
中 - keywords:可选项,数组类型,表示模块的关键字,显示在
npm search "package-name"
中 - homepage:可选项,包的官网 url 。
- author:可选项,表示包的作者姓名。
- contributors:可选项,包的其他贡献者姓名。
- repository:可选项,源码托管地址。
- scripts:可选项,自定义在cli中输入
npm "script"
时实际执行的程序。npm默认提供大量的script供我们调用。 - engines:可选项,依赖的node版本。
- dependencies、devDependencies:可选项,用于配置模块的生产环境依赖包和开发环境依赖包。当执行
npm install
时,npm会根据这两个配置项的值去下载安装相关的依赖包。两者的区别是devDependencies是模块开发过程的依赖包(如:grunt只在开发时有用的模块),并且当其他模块需要依赖当前模块时,当通过npm install “package-name”
时会自动下载安装dependencies的包而不会下载devDependencies的包。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。
常用npm命令
- 查看模块的版本:
npm version
- 安装模块:
npm install <Module Name>
- 查看所有全局安装的模块:
npm list -g
- 查看某个模块的版本号:
npm list <Module Name>
- 卸载模块:
npm uninstall <Module Name>
- 更新模块:
npm update <Module Name>
- 搜索模块:
npm search <Module Name>
模块操作
启动模块
npm start [-- <args>]
该命令写在package.json文件scripts的start字段中,可以自定义命令来配置一个服务器环境和安装一系列的必要程序,如
"scripts": {
"start": "gulp -ws"
}
此时在cmd中输入npm start
命令相当于执行gulpfile.js文件自定义的watch和server命令。
如果package.json文件没有设置start,则将直接启动node server.js.
停止模块
npm stop [-- <args>]
重新启动模块
npm restart [-- <args>]
测试模块
npm test [-- <args>]
该命令写在package.json文件scripts的test字段中,可以自定义该命令来执行一些操作,如
"scripts": {
"test": "gulp release"
},
此时在cmd中输入npm test
命令相当于执行gulpfile.js文件自定义的release命令。
npm install安装模块详解
安装包,默认会安装最新的版本
npm install gulp
指定安装版本
npm install gulp@4.6.5
alias: npm i
common options: [-S|--save|-D|--save-dev|-O|--save-optional] [-E|--save-exact] [--dry-run]
保存安装包信息
模块的依赖都被写入了package.json文件后,他人打开项目的根目录(项目开源、内部团队合作),使用npm install
命令可以根据dependencies配置安装所有的依赖包
- -S, –save 安装包信息将加入到dependencies(生产阶段的依赖)
npm install gulp --save
或npm install gulp -S
package.json 文件的 dependencies 字段:
"dependencies": {
"gulp": "^3.9.1"
}
- -D, –save-dev 安装包信息将加入到devDependencies(开发阶段的依赖),所以开发阶段一般使用它
npm install gulp --save-dev
或npm install gulp -D
package.json 文件的 devDependencies字段:
"devDependencies": {
"gulp": "^3.9.1"
}
- -O, –save-optional 安装包信息将加入到optionalDependencies(可选阶段的依赖)
npm install gulp --save-optional
或npm install gulp -O
package.json 文件的optionalDependencies字段:
"optionalDependencies": {
"gulp": "^3.9.1"
}
- -E, –save-exact 精确安装指定模块版本
npm install gulp --save-exact
或npm install gulp -E
输入命令npm install gulp -ES
,留意package.json 文件的 dependencies 字段,以看出版本号中的^消失了
"dependencies": {
"gulp": "3.9.1"
}
本地安装与全局安装
npm 的包安装分为本地安装(local)、全局安装(global)两种:
npm install express # 本地安装
npm install express -g # 全局安装
如果出现以下错误:npm err! Error: connect ECONNREFUSED 127.0.0.1:8087
解决办法为:$ npm config set proxy null
本地安装
- 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
- 可以通过 require() 来引入本地安装的包。
全局安装
- 将安装包放在 /usr/local 下或者你 node 的安装目录。
- 可以直接在命令行里使用。