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 --savenpm 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 listnpm list -globalnpm list vue

加上global参数,会列出全局装置的模块。

npm install

Node模块采纳npm install命令装置。

每个模块能够“全局装置”,也能够“本地装置”。“全局装置”指的是将一个模块装置到系统目录中,各个我的项目都能够调用。一般来说,全局装置只实用于工具模块,比方eslintgulp。“本地装置”指的是将一个模块下载到以后我的项目的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 adduserUsername: YOUR_USER_NAMEPassword: YOUR_PASSWORDEmail: 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,别离写入以下内容。

// .npmignoresource// .gitignorenode_modulesdistribution

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模块管理器(阮一峰)