乐趣区

关于javascript:npm-超详细教程

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 list

npm list -global

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

退出移动版