声明:本文多处直接引用了文末的参考链接中的内容,如有侵权,请联系删除
npm是什么
- npm 是 JavaScript 的包管理工具,并且是 Node.js 平台的默认包管理工具
- 通过 npm 可以安装、共享、分发代码,管理项目依赖关系
npm安装和卸载
安装
- 安装node时自动安装npm
- 手动重装:
curl -L https://npmjs.com/install.sh | sh
升级
- npm install npm[@指定版本] -g
卸载
- 通过命令卸载:
npm uninstall npm -g
npm常用命令
基础命令
npm -v
: 查看 npm 的版本npm -l
:查看各个命令的简单用法npm help
:查看 npm 命令列表npm config list -l
:查看 npm 的配置
设置环境变量和镜像
常用的环境变量设置
- npm set init-author-name 'your name'
- npm set init-author-email 'your email'
- npm set init-author-url 'http://most-all.com'
- npm set init-license 'MIT'
如果已经有 package.json 文件了,则执行以上的设置后,package.json 不会发生变化,需要重新执行npm init
才会变化
镜像配置与镜像加速解决方案
- npm config set registry 镜像地址:设置镜像源
示例:npm config set registry https://registry.npm.taobao.org
- npm config get registry:查看镜像源
- npm install 模块 --registry 镜像地址:使用指定源安装模块
示例:npm install express --registry https://registry.npm.taobao.org
- npm config list:查看npm当前配置
- npm install -g cnpm --registry=https://registry.npm.taobao.org:安装并使用cnpm替代npm(不推荐)
镜像管理
- npm install -g nrm:安装镜像管理依赖
- nrm常用命令
- nrm ls:查看npm镜像
- nrm use taobao:切换镜像
- nrm add URL 'registry_name':添加自己的镜像
- nrm del 'registry_name':删除镜像
- nrm test ['registry_name']:测试镜像响应速度
常用镜像地址
- npm:https://registry.npmjs.org/
- taobao:http://registry.npm.taobao.org/
- cnpm:http://r.cnpmjs.org/
- edunpm:http://registry.enpmjs.org/
- eu:http://registry.npmjs.eu/
- au:http://registry.npmjs.org.au/
- sl:http://npm.strongloop.com/
- nj:https://registry.nodejitsu.com/
- pt:http://registry.npmjs.pt/
创建模块
- npm init:初始化生成一个新的package.json文件
它会向用户提问一系列问题,如果觉得不用修改默认配置,一路回车就可以了
常用后缀
- -f:代表force
- -y:代表yes
同时增加以上两个后缀,则会跳过提问阶段,直接生成一个新的package.json文件
模块搜索和查看
- npm search <搜索词> [-g]:搜索npm仓库,它后面可以跟字符串,也可以跟正则表达式
- npm list:查看当前项目安装的所有模块
- npm list -g --depth 0:列出全局安装的模块(带上
[--depth 0]
不深入到包的支点,更简洁)
安装模块
常用命令简写
- i:install的简写,根据package.json配置文件中的依赖配置下载安装各种依赖文件
- -g:-global的简写,用于全局安装依赖
示例:npm i -g gulp 或者 npm i gulp -g
- -P:--save-prod的简写,安装生产阶段的依赖并将其添加到package.json的dependencies中,
- -S:--save的简写,安装依赖并将其添加到package.json的dependencies中
示例:npm i gulp --save 或 npm i gulp -S
- -D:--save-dev的简写,安装开发阶段的依赖并将其添加到package.json的devDependencies中
示例:npm i gulp --save-dev 或 npm i gulp -D
- -O:--save-optional的简写,安装可选阶段的依赖并将其添加到package.json的optionalDependencies中
- -E:--save-exact的简写,安装模块的确切版本,而不是使用npm的默认semver range运算符
示例:npm i gulp --save-exact 或 npm i gulp -E
- -B:--save-bundle的简写,安装依赖并将其添加到package.json的bundleDependencies中
- -f:--force的简写,模块不管是否安装过,npm 都要强制重新安装
示例:npm install sax --force
模块安装基础命令
- npm install:读取并按照package.json里面的配置进行安装
- npm install [<@scope>/]
:安装指定模块的最新(@latest)版本
示例:npm install gulp
- npm install [<@scope>/]
@ :安装指定模块的指定版本
示例:npm install gulp@3.9.1
- npm install [<@scope>/]
@ :安装指定指定版本范围内的模块
示例:npm install vue@">=1.0.28 < 2.0.0"
- npm install [<@scope>/]
@ :安装指定模块的指定标签 默认值为(@latest)
示例:npm install sax@0.1.1
- npm install
:通过Github代码库地址安装
示例:npm install git://github.com/package/path.git
模块更新和卸载
- npm update
[-g]:升级当前项目[或全局]的指定模块
示例:npm update express -g
- npm uninstall
[-g]:卸载当前项目[或全局]模块
引用模块
- npm link [<@scope>/]
[@ ]:引用依赖,有些包是全局安装了,在项目里面只需要引用即可 - npm unlink gulp:解除依赖引用
模块版本规则和格式
- 版本规则:MAJOR.MINOR.PATCH
- 主版本号(MAJOR):对应大版本迭代,做了不兼容旧版本的修改
- 次版本号(MINOR):对应小版本迭代,做了可以向下兼容的功能性新增
- 修订号(PATCH):对应修正版本迭代,做了向下兼容的问题修复
- 版本格式
- ^2.2.1 指定的主版本号下,所有更新的版本,匹配 2.2.3, 2.3.0;不匹配1.0.3, 3.0.1
- ~2.2.1 知道的主版本号.次版本号下,所有更新的版本,匹配 2.2.3,2.2.9;不匹配2.3.0,2.4.5
- >=2.1 版本号大于或等于2.1.0,匹配2.1.2,3.1;不匹配 2.0,1.0
- <=2.3 版本号小于等于2.2.0,匹配1.0.0,2.1.2;不匹配 2.3,2.4.1
- 1.0.0 - 2.0.0 版本号在1.0.0(含)到2.0.0(含)之间,匹配1.0.0,1.9.9;不匹配2.1.1
- * 或者 x 匹配所有主版本
- 1 或 1.x 匹配主版本号为1的所有版本
- 1.2 或 1.2.x 匹配主版本号为1次版本号为2的所有版本
执行脚本
使用npm run [--param]
命令执行脚本,除此之外package.json的scripts字段,可以用于指定脚本命令,供npm直接调用。
start和test属于特殊命令,可以省略run,其余的都得带上run
npm 脚本的原理非常简单。每当执行npm run,就会自动新建一个 Shell,在这个 Shell 里面执行指定的脚本命令。因此,只要是 Shell(一般是 Bash)可以运行的命令,就可以写在 npm 脚本里面。
比较特别的是,npm run新建的这个 Shell,会将当前目录的node_modules/.bin子目录加入PATH变量,执行结束后,再将PATH变量恢复原样。
这意味着,当前目录的node_modules/.bin子目录里面的所有脚本,都可以直接用脚本名调用,而不必加上路径。比如,当前项目的依赖里面有 Mocha,只要直接写mocha test就可以了。
"test": "mocha test"
而不用写成下面这样
"test": "./node_modules/.bin/mocha test"
由于 npm 脚本的唯一要求就是可以在 Shell 执行,因此它不一定是 Node 脚本,任何可执行文件都可以写在里面。
npm 脚本的退出码,也遵守 Shell 脚本规则。如果退出码不是0,npm 就认为这个脚本执行失败。
npm run的参数
---package.json文件---
"scripts": { "test": "mocha test/" }
---------终端---------
npm run test -- anothertest.js
# 等同于直接执行
mocha test/ anothertest.js
内部变量
---package.json文件---
{
"name": "npm_test",
"version": "1.0.0",
"config": {
"reporter": "xunit"
},
"script":{
"bundle": "mkdir -p build/$npm_package_version/",
//$npm_package_version 读的是外层"version"的值,同理$npm_package_name 读的是外层"name"的值
"test": "mocha test/ --reporter $npm_package_config_reporter"
//$npm_package_config_reporter读的是"config"里的"reporter"
}
}
pre-和post-两个钩子(hook)
npm在执行命令前,会先查看有没有定义pre-命令名
和post-命令名
两个钩子,如果有的话,就会先执行npm run pre-命令名,然后执行npm run 命令名,最后执行npm run post-命令名。
---package.json文件---
"scripts": {
"lint": "eslint --cache --ext .js --ext .jsx src",
"test": "karma start --log-leve=error karma.config.js --single-run=true",
"pretest": "npm run lint",
"posttest": "echo 'Finished running tests'"
}
-------终端-------
npm run lint
//直接执行 npm run lint 结束
npm run test
//因为有定义了两个钩子pretest、posttest。
//所以先执行 npm run pretest
//然后执行 npm run test
//最后执行 npm run posttest
发布模块
- npm adduser:未注册时,申请注册一个用户,也可以直接在https://www.npmjs.com/注册,命令执行后,会要求输入 Username、Password、Email等信息
- npm login:已注册时进行登陆
- npm publish:发布版本
其他命令
- npm cache clean --force:清除node_module文件缓存,用于对付使用相同版本号发布新版本代码的人
npm与yarn
yarn与npm一样,都是用于前端的包和模块管理工具。在npm5之前,可以说yarn是为解决npm中存在的问题而推出的新的包管理工具,随着npm的不断迭代和更新,npm5以后的版本与yarn在使用上几乎已经趋于一致。但是在语法上依然不同,如下为常用的命令对比
- 从package.json中安装项目依赖
npm install
yarn
- 向package.json中添加/安装新的项目依赖
npm isntall 库名 --save
yarn add 库名
- 向package.json中添加/安装新的dev项目依赖
npm install 库名 --save-dev
yarn add 库名 --dev
- 删除项目依赖
npm uninstall package --save
yarn remove package
- 升级项目依赖
npm update --save
yarn upgrade