npm 超具体教程
简介
npm,全名 node package manger。
- npm 是
Node
的开放式模块注销和管理系统,是Node.js
包的规范公布平台,用于Node.js
包的公布、流传、依赖管制,网址:https://www.npmjs.com/ - npm 提供了命令行工具,能够不便地下载、装置、降级、删除包,也能够让你作为开发者公布并保护包
npm 如何应用
- npm 在依照 Node.js 时会连带被装置。但有可能不是最新版本,须要
npm install npm@latest -g
降级到最新版本。
根本命令:
# 查看 npm 命令列表
$ npm help
# 查看各个命令的简略用法
$ npm -l
# 查看 npm 的版本
$ npm -v
# 查看 npm 的配置
$ npm config list -l
npm 的应用
npm init 初始化 package.json 文件
用来初始化生成 package.json
文件。在这个过程中会向用户发问一系列问题,如果你感觉不必批改默认配置,一路回车就能够了。
如果应用了 -f
(代表force
)、-y
(代表yes
),则跳过发问阶段,间接生成一个新的package.json
文件。
npm set 设置环境变量
$ npm set init-author-name 'Your name'
$ npm set init-author-email 'Your email'
$ npm set init-author-url 'http://yourdomain.com'
$ npm set init-license 'MIT'
下面命令等于为 npm init
设置了默认值,当前执行 npm init
的时候,package.json
的作者姓名、邮件、主页、许可证字段就会主动写入预设的值。这些信息会寄存在用户主目录的 ~/.npmrc
文件,使得用户不必每个我的项目都输出。如果某个我的项目有不同的设置,能够针对该我的项目运行npm config
。
$ npm set save-exact true
下面命令设置退出模块时,package.json
将记录模块的确切版本,而不是一个可选的版本范畴。
npm config
$ npm config set prefix $dir
下面的命令将指定的 $dir
目录,设为模块的全局装置目录。如果以后有这个目录的写权限,那么运行 npm install
的时候,就不再须要 sudo
命令受权了。
$ npm config set save-prefix ~
下面的命令使得 npm install --save
和npm install --save-dev
装置新模块时,容许的版本范畴从克拉符号(^)改成波浪号(~),即从容许小版本升级,变成只容许补丁包的降级。
$ npm config set init.author.name $name
$ npm config set init.author.email $email
下面命令指定应用 npm init
时,生成的 package.json
文件的字段默认值。
npm info
npm info
命令能够查看每个模块的具体信息
$ npm info underscore
$ npm info underscore description
$ npm info underscore homepage
$ npm info underscore version
npm search
npm search
命令用于搜寻 npm 仓库,它前面能够跟字符串,也能够跟正则表达式
$ npm search < 搜索词 >
npm list
npm list
命令以树型构造列出以后我的项目装置的所有模块,以及它们依赖的模块。
npm list
npm list -global
npm list vue
加上 global 参数,会列出全局装置的模块。
npm install
Node
模块采纳 npm install
命令装置。
每个模块能够“全局装置”,也能够“本地装置”。“全局装置”指的是将一个模块装置到系统目录中,各个我的项目都能够调用。一般来说,全局装置只实用于工具模块,比方 eslint
和gulp
。“本地装置”指的是将一个模块下载到以后我的项目的 node_modules
子目录,而后只有在我的项目目录之中,能力调用这个模块
# 本地装置
$ npm install <package name>
# 全局装置
$ sudo npm install -global <package name>
$ sudo npm install -g <package name>
# 也反对间接输出 Github 代码库地址
$ npm install git://github.com/package/path.git
$ npm install git://github.com/package/path.git#0.1.0
# 强制重新安装
$ npm install <packageName> --force
# 如果你心愿,所有模块都要强制重新安装,那就删除 node_modules 目录,从新执行 npm install
$ rm -rf node_modules
$ npm install
装置不同版本
install 命令总是装置模块的最新版本,如果要装置模块的特定版本,能够在模块名前面加上 @和版本号。
$ npm install sax@latest
$ npm install sax@0.1.1
$ npm install sax@">=0.1.0 <0.2.0"
# 如果应用 --save-exact 参数,会在 package.json 文件指定装置模块的确切版本
$ npm install readable-stream --save --save-exact
$ npm install sax --save
$ npm install node-tap --save-dev
# 或者
$ npm install sax -S
$ npm install node-tap -D
# 如果要装置 beta 版本的模块,须要应用上面的命令
# 装置最新的 beta 版
$ npm install <module-name>@beta (latest beta)
# 装置指定的 beta 版
$ npm install <module-name>@1.3.1-beta.3
# npm install 默认会装置 dependencies 字段和 devDependencies 字段中的所有模块,如果应用 --production 参数,能够只装置 dependencies 字段的模块
$ npm install --production
# 或者
$ NODE_ENV=production npm install
防止零碎权限
默认状况下,Npm
全局模块都装置在系统目录(比方 /usr/local/lib/
),普通用户没有写入权限,须要用到sudo
命令。这不是很不便,咱们能够在没有 root
权限的状况下,装置全局模块。
首先,在主目录下新建配置文件 .npmrc
,而后在该文件中将prefix
变量定义到主目录上面。
prefix = /home/yourUsername/npm
而后在主目录下新建 npm
子目录
$ mkdir ~/npm
尔后,全局装置的模块都会装置在这个子目录中,npm
也会到 ~/npm/bin
目录去寻找命令。
最初,将这个门路在 .bash_profile
文件(或 .bashrc
文件)中退出 PATH
变量。
export PATH=~/npm/bin:$PATH
npm update
npm update 命令能够更新本地装置的模块
# 降级以后我的项目的指定模块
$ npm update [package name]
# 降级全局装置的模块
$ npm update -global [package name]
它会先到近程仓库查问最新版本,而后查问本地版本。如果本地版本不存在,或者近程版本较新,就会装置。
应用 -S
或--save
参数,能够在装置的时候更新 package.json
外面模块的版本号。
留神,从 npm v2.6.1
开始,npm update 只更新顶层模块,而不更新依赖的依赖,以前版本是递归更新的。如果想取到老版本的成果,要应用上面的命令。
$ npm --depth 9999 update
npm uninstall
npm uninstall 命令,卸载已装置的模块
$ npm uninstall [package name]
# 卸载全局模块
$ npm uninstall [package name] -global
npm run
npm 不仅能够用于模块治理,还能够用于执行脚本。package.json 文件有一个 scripts 字段,能够用于指定脚本命令,供 npm 间接调用。
npm run 命令会主动在环境变量 $PATH 增加 node_modules/.bin 目录,所以 scripts 字段外面调用命令时不必加上门路,这就防止了全局装置 NPM 模块。
npm run 如果不加任何参数,间接运行,会列出 package.json 外面所有能够执行的脚本命令。
npm 内置了两个命令简写,npm test 等同于执行 npm run test,npm start 等同于执行 npm run start。
$ npm i eslint --save-dev
pre- 和 post- 脚本
npm run 为每条命令提供了 pre- 和 post- 两个钩子(hook)。以 npm run lint 为例,执行这条命令之前,npm 会先查看有没有定义 prelint 和 postlint 两个钩子,如果有的话,就会先执行 npm run prelint,而后执行 npm run lint,最初执行 npm run postlint。
全局模块(在命令行的任何中央能够应用) 部分模块
- 为什么全局模块能够间接在任何中央应用
全局的模块
- 必须应用 package.json 中配置 bin 参数
-
! /usr/bin/env node
npm link
就是将以后的目录长期的放到全局下。
开发 NPM 模块的时候,有时咱们会心愿,边开发边试用,比方本地调试的时候,require(‘myModule’) 会主动加载本机开发中的模块。Node 规定,应用一个模块时,须要将其装置到全局的或我的项目的 node_modules 目录之中。对于开发中的模块,解决办法就是在全局的 node_modules 目录之中,生成一个符号链接,指向模块的本地目录。
npm link 就能起到这个作用,会主动建设这个符号链接。
请构想这样一个场景,你开发了一个模块 myModule,目录为 src/myModule,你本人的我的项目 myProject 要用到这个模块,我的项目目录为 src/myProject。首先,在模块目录(src/myModule)下运行 npm link 命令。
src/myModule$ npm link
下面的命令会在 NPM 的全局模块目录内,生成一个符号链接文件,该文件的名字就是 package.json 文件中指定的模块名。
/path/to/global/node_modules/myModule -> src/myModule
这个时候,曾经能够全局调用 myModule 模块了。然而,如果咱们要让这个模块装置在我的项目内,还要进行上面的步骤。
切换到我的项目目录,再次运行 npm link 命令,并指定模块名。
src/myProject$ npm link myModule
下面命令等同于生成了本地模块的符号链接。
src/myProject/node_modules/myModule -> /path/to/global/node_modules/myModule
而后,就能够在你的我的项目中,加载该模块了。
var myModule = require('myModule');
这样一来,myModule 的任何变动,都能够间接反映在 myProject 我的项目之中。然而,这样也呈现了危险,任何在 myProject 目录中对 myModule 的批改,都会反映到模块的源码中。
如果你的我的项目不再须要该模块,能够在我的项目目录内应用 npm unlink 命令,删除符号链接。
src/myProject$ npm unlink myModule
npm bin
# 我的项目根目录下执行
$ npm bin
./node_modules/.bin
npm adduser
$ npm adduser
Username: YOUR_USER_NAME
Password: YOUR_PASSWORD
Email: YOUR_EMAIL@domain.com
npm publish
npm publish 用于将以后模块公布到 npmjs.com。执行之前,须要向 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
而后,在 package.json 外面写入 build 脚本。
"scripts": {
"build": "babel source --presets babel-preset-es2015 --out-dir distribution",
"prepublish": "npm run build"
}
运行下面的脚本,会将 source 目录外面的 ES6 源码文件,转为 distribution 目录外面的 ES5 源码文件。而后,在我的项目根目录上面创立两个文件 .npmignore 和 .gitignore,别离写入以下内容。
// .npmignore
source
// .gitignore
node_modules
distribution
npm deprecate
如果想废除某个版本的模块,能够应用 npm deprecate 命令。
$ npm deprecate my-thing@"< 0.2.3" "critical bug fixed in v0.2.3"
github / npm
npm 版本号治理的问题
- semver 标准 规定了版本号 由 3 位组成 MAJOR MINOR PATCH
- MAJOR 可能不在兼容老版本
- MINOR 新增了一些兼容旧版本的 api vue.observable
- PATCH 修复 bug
都是 git 的 tag 对应着 npm 的版本
npm version major minor patch
会主动和 git 进行关联
版本号含意
- 2.2.0 必须是 2.2.0
- ^2.2.0 限定大版本,前面更新只有不超过 2 尽能够
- ~2.2.0 限定前两个版本,前面的版本只有比 0 大就能够
-
=2.0 大于这个版本
- <=2.0
- 1.0.0 – 2.0.0
预发版本
- alpha 预览版 外部测试版
- beta 测试版 公开测试版
- rc 最终测试版本
scripts
- 能够配置脚本的命令 快捷键(能够把很长的命令放到 scripts 中)
- 执行命令 会将以后的 node_modules 目录下的.bin 文件夹放到全局中(所以能够间接应用)
- npm run start 能够简写成 npm start
npx
- npx 和 script 统一能够帮咱们间接运行 .bin 目录下的内容
- 如果.bin 目录下存在 会执行对应脚本,如果不存在会下载运行
npx 只是一个长期的应用计划。npm5.2 之后产生的
源的切换 (npm nrm nvm)
- npm install nrm -g
- nrm ls / nrm use
包的公布
- 如何公布一个包 先注册 npm 账号
- 肯定要在官网源上发
- npm addUser 增加用户
- npm publish 公布包
参考链接:npm 模块管理器(阮一峰)