简介
npm,全名 node package manger。
NPM(Node Package Manager)是一个 JavaScript 包管理工具,也是 Node.js 的默认包管理器。
NPM 允许开发者轻松地下载、安装、共享、管理项目的依赖库和工具。网址:https://www.npmjs.com/
新版的 Node.js 已经集成了 NPM,所以我们可以直接通过输入 npm -v 来测试是否成功安装
如果你安装的是旧版本的 npm,可以很容易得通过 npm 命令来升级,命令如下:
npm install npm -g
# 或者
npm install -g cnpm --registry=https://registry.npmmirror.com
安装
npm 在按照 Node.js 时会连带被安装。但有可能不是最新版本,需要 npm install npm@latest -g 升级到最新版本。
命令:
# 查看 npm 命令列表
$ npm help
# 查看各个命令的简单用法
$ npm -l
# 查看 npm 的版本
$ npm -v
# 查看 npm 的配置
$ npm config list -l
安装包
本地安装
- 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
- 可以通过 require() 来引入本地安装的包。
全局安装
- 将安装包放在 /usr/local 下或者你 node 的安装目录。
- 一般来说,全局安装只适用于工具模块,比如eslint和gulp
- 可以直接在命令行里使用。
如果你希望具备两者功能,则需要在两个地方安装它或使用 npm link。有时我们会希望,边开发边试用,比如本地调试的时候,require(‘myModule’) 会自动加载本机开发中的模块。Node规定,使用一个模块时,需要将其安装到全局的或项目的 node_modules 目录之中。对于开发中的模块,解决方法就是在全局的 node_modules 目录之中,生成一个符号链接,指向模块的本地目录。npm link 就能起到这个作用,会自动建立这个符号链接。
更新包
npm update命令可以更新本地安装的模块
# 升级当前项目的指定模块
$ npm update [package name]
# 升级全局安装的模块
$ npm update -global [package name]
1234
它会先到远程仓库查询最新版本,然后查询本地版本。如果本地版本不存在,或者远程版本较新,就会安装。
使用-S或–save参数,可以在安装的时候更新package.json里面模块的版本号。
注意,从npm v2.6.1开始,npm update只更新顶层模块,而不更新依赖的依赖,以前版本是递归更新的。如果想取到老版本的效果,要使用下面的命令。
$ npm --depth 9999 update
发布卸载包
npm publish用于将当前模块发布到http://npmjs.com。执行之前,需要向http://npmjs.com申请用户名。
# 需要向npmjs.com申请用户名
$ npm adduser
# 登录
$ npm login
# 发布
$ npm publish
# 如果当前模块是一个beta版,比如1.3.1-beta.3,那么发布的时候需要使用tag参数,将其发布到指定标签,默认的发布标签是latest
$ npm publish --tag beta
# 如果发布私有模块,模块初始化的时候,需要加上scope参数。只有npm的付费用户才能发布私有模块。
$ npm init --scope=<yourscope>
# 如果你的模块是用ES6写的,那么发布的时候,最好转成ES5。首先,需要安装Babel。
$ npm install --save-dev babel-cli@6 babel-preset-es2015@6
123456789101112
然后,在package.json里面写入build脚本。
"scripts": {
"build": "babel source --presets babel-preset-es2015 --out-dir distribution",
"prepublish": "npm run build"
}
1234
运行上面的脚本,会将 source 目录里面的ES6源码文件,转为 distribution 目录里面的 ES5 源码文件。然后,在项目根目录下面创建两个文件 .npmignore 和 .gitignore,分别写入以下内容。
// .npmignore
source
// .gitignore
node_modules
distribution
npm deprecate
123456
如果想废弃某个版本的模块,可以使用 npm deprecate 命令。
$ npm deprecate my-thing@"< 0.2.3" "critical bug fixed in v0.2.3"
废弃之后还是可以查到的,而且不能再次发布,如果要删除需要执行
npm unpublish <包名> -force
如果要更新发布则执行以下两步
- 第一步:执行npm version <版本号类型>
- 第二步:执行 npm publish
版本控制
npm内置了版本控制功能,允许你通过简单的命令来更新项目的版本号。
- npm version patch:将版本号中的补丁级别加1(例如,从1.0.0到1.0.1)。
- npm version minor:将版本号中的次要级别加1,并将补丁级别重置为0(例如,从1.0.0到1.1.0)。
- npm version major:将版本号中的主级别加1,并将次要级别和补丁级别重置为0(例如,从1.0.0到2.0.0)。
安装原理
参考
- https://mp.weixin.qq.com/s/8WKqxJ_CSvwEtKHPcWHmdA
1、npm install 执行之后,首先,检查并获取 npm 配置
这里的优先级为:项目级的 .npmrc 文件 > 用户级的 .npmrc 文件> 全局级的 .npmrc 文件 > npm 内置的 .npmrc 文件
2、检查项目中是否有 package-lock.json 文件
- 若有:检查 package-lock.json 和 package.json 中声明的依赖是否一致:一致就直接使用package-lock.json 中的信息,从缓存或网络资源中加载依赖;不一致,则依据npm的版本进行处理
- 若无:则根据 package.json 递归构建依赖树,按照构建好的依赖树下载完整的依赖资源,在下载时就会检查是否存在相关资源缓存:存在缓存,就会将缓存内容解压到node_modules 中;不存在缓存,就从npm远程仓库下载包,并会检验包的完整性,随后添加到缓存,解压到node_modules 中生成package-lock.json。
3、最后生成 package-lock.json
这里值得注意的是:npm不同版本在检查 package-lock.json 和 package.json 中声明的依赖是否一致的时候处理是不一样的
- npmV5.0.x是根据package-lock.json下载
- npmV5.1.0-5.4.2:当package.json声明的依赖版本规范有符合的更新版本时,会按照package.json安装,并更新package-lock.json
- npmV5.4.2以上,当package.json声明的依赖版本规范和package-lock.json安装版本兼容,则按照package-lock.json安装,如果不兼容,按照package.json安装,并更新package-lock.json
package.json
简介
package.json 位于模块的目录下,用于定义包的属性。
属性
name - 包名。
version - 包的版本号。
description - 包的描述。
homepage - 包的官网 url 。
author - 包的作者姓名。
contributors - 包的其他贡献者姓名。
dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。
repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。
main - main 字段指定了程序的主入口文件,require(‘moduleName’) 就会加载这个文件。这个字段的默认值是模块根目录下面的 index.js。
keywords - 关键字
package-lock.json
Lock文件的出现是为了解决 npm install 的不确定性问题 ,在 npm 5.x 版本新增了 package-lock.json 文件。
它的作用是锁定依赖结构,只要你目录下有 package-lock.json 文件,那么你每次执行 npm install 后生成的 node_modules 目录结构一定是完全相同的。
版本号
NPM 使用语义版本号来管理代码,语义版本号分为 X.Y.Z 三位,分别代表主版本号、次版本号和补丁版本号,当代码变更时,版本号按以下原则更新。
- 如果只是修复 bug,需要更新 Z 位。
- 如果是新增了功能,但是向下兼容,需要更新 Y 位。
- 如果有大变动,向下不兼容,需要更新 X 位。
版本号有了这个保证后,在申明第三方包依赖时,除了可依赖于一个固定版本号外,还可依赖于某个范围的版本号。例如 “argv”: “0.0.x” 表示依赖于 0.0.x 系列的最新版 argv。
命令
我们在开发项目中,有很多功能或者UI库都是其他的开源开发者写好发布到npm包,我们不用自己的来开发,直接下载使用即可。大大的提高了开发的速度。
- npm init 初始化一个新的 Node.js 项目,生成 package.json 文件。
- npm install 包名称 本地安装指定的npm包,如果不加包名称,那么就是安装package.json文件中的所有依赖
- npm install 包名称 -g 全局安装
- npm list 查看安装的模块
- npm list -g 查看全局安装的模块
- npm list 包名称 查看某个包的版本号
- npm uninstall 包名称 卸载指定的npm包
- npm update 包名称 更新指定的npm包
- npm search 包名称 搜索指定的npm包
- npm publish 发布模块
- npm help 查看有关于npm的所有命令
- npm config get registry 查看下载源
- npm cache clean --force 清除缓存
- npm config set registry http://registry.npm.taobao.org 设置淘宝镜像源(已过期)
- npm config set registry https://registry.npmjs.org/ 设置官方镜像源
- npm config set registry https://registry.npmmirror.com 设置淘宝镜像源
- npm config set strict-ssl false 取消SSL验证
- npm run
淘宝 NPM 镜像
由于国内直接使用 npm 的官方镜像是非常慢的,这里推荐使用淘宝 NPM 镜像。
淘宝 NPM 镜像是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。
你可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:
$ npm install -g cnpm --registry=https://registry.npmmirror.com
这样就可以使用 cnpm 命令来安装模块了:
$ cnpm install [name]
更多信息可以查阅:https://npmmirror.com/。
nrm
nrm 用于管理镜像,是一个可以切换npm镜像的管理工具。
The end.