NPM是什么?

npm(全称 Node Package Manager,即node包管理器)是Node.js默认的、以JavaScript编写的软件包管理系统。

NPM的使用场景:

  • 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
  • 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
  • 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用

NPM-工作原理:

npm依赖解析的主要思想:尽可能地减少间接依赖安装目录的深度,最理想的情况是与直接依赖安装在同一目录下,通过这种方式来减少依赖目录的嵌套,缓解整个依赖目录层次过深的问题。(因为 Windows 中文件路径的长度不能大于 260 个字符。)

参考资料:NPM基本用法和使用技巧

NPM-基础操作:

NPM是随同Node.js一起安装的包管理工具,所以我们只需要安装nodejs就可以同时安装成功NPM

安装Node.js并更新npm

Win系统:

进入Node.js 官方网站,找到 Downloads 栏目,选择适合自己系统的安装包进行安装。

MacOS系统:

在MacOS系统上建议先安装Homebrew,然后使用homebrew来安装NPM。

brew search nodejs #搜索
brew install nodejs #安装

CentOS系统:

在CentOS系统上,我们可以使用yum命令来安装Node.js,前提是需要配置好yum源。

yum -y install nodejs

Ubuntu系统:

在 Ubuntu系统上,我们可以使用apt-get方式来安装Node.js。

apt-get install nodejs  

安装完成并且配置好相关环境之后,我们可以再Terminal中输入node -v
npm -v分别来测试nodejsnpm是否安装成功。

npm常用参数:

  • -g, –global:安装全局依赖,如果没有指定依赖包名,则将当前目录中的包安装至全局

  • -S, –save:安装依赖的同时将该依赖写入 dependencies

  • -D, –save-dev:安装依赖的同时将该依赖写入 devDependencies

  • -O, –save-optional:安装依赖的同时将该依赖写入 optionalDependencies

  • -E, –save-exact:写入 package.json 时带有确切版本号

  • –no-optional:不安装 optional dependencies,可继承

  • –only={dev[elopment]|prod[uction]}:无视 NODE_ENV,只安装 devDependencies 或仅安装除了 devDependencies 之外的依赖项

  • –dry-run:走一遍安装的过程并报告结果,但实际上没有安装任何依赖

在本地安装npm软件包

有两种方法来安装NPM包:本地或全局,你选择哪一种安装使用基于你想如何使用包。

如果你想使用类似的Node.js依赖于包从自己的模块 require,然后要在本地安装,这是npm install的默认行为。在另一方面,如果你想使用它作为一个命令行工具,像繁重的CLI的东西,那么你要在全局安装它。

npm install命令的使用可在下文npm-cli部分查看。

init初始化项目:

npm init #在项目根目录下使用它会创建一个package.json文件,需要填写一些内容,详见下文
npm init -y # 在package.json文件中全部使用默认选项

使用 package.json

管理本地安装的npm软件包的最佳方法是创建一个package.json文件。

一个package.json文件为你提供了很多方便:

- 它作为您的项目所依赖的包的文档。
- 它允许您使用语义版本控制规则来指定项目可以使用的包的版本。
- 使您的构建可重复,这意味着它的方式更容易与其他开发人员共享。

package.json语法:

  • “name”
  • 全部小写
  • 一个字,没有空格
  • 破折号和下划线允许
  • “version”

demo:

{
  "name": "my-awesome-package",
  "version": "1.0.0"
}

其他字段释义:

字段名称 说明
name 当前项目名称
version 项目版本信息,默认为1.0.0
description 来自readme的信息,否则为空字符串 “”
main 默认为index.js
scripts 默认情况下会创建一个空test脚本
keywords 关键词信息,默认空
author 作者信息,默认空
license 软件许可证 ISC
bugs 来自当前项目的信息(如果存在)
homepage 来自当前项目的信息(如果存在)
dependencies 您的应用程序在生产中需要这些软件包
devDependencies 这些软件包仅用于开发和测试

安装npm软件包

安装本地(local)软件包:

npm install <packageName> # 需要在当前项目项目根目录下,与package.json 文件在同一目录下

安装全局(global)软件包:

npm install -g  <packageName> 

在全局安装时出现Permission denied错误时,请在npm指令前加上 sudo(类UNIX系统下)

查看npm软件包

查看本地(local)软件包:

npm list # 与package.json 在同一目录下运行

查看全局(global)软件包:

npm list -g # Terminal中运行

更新npm软件包

npm list -g # 查看系统中全局安装过的软件包

应该经常更新您依赖的软件包,以便您可以获得对上游代码进行的任何更改。

更新本地(local)软件包:

npm update <packageName> #对单个包升级

更新全局(global)软件包:

npm -g是管理本地全局包的命令。

➜  ~ npm -g outdated # 使用此命令可以查看那些包有更新:
Package           Current  Wanted  Latest  Location
cordova             6.5.0   7.0.1   7.0.1
create-react-app    1.3.0   1.3.3   1.3.3
elf-cli             1.4.0   1.7.0   1.7.0
express            4.15.2  4.15.3  4.15.3
ionic               2.2.2   3.5.0   3.5.0
node-gyp            3.6.0   3.6.2   3.6.2
node-inspector      1.0.0   1.1.1   1.1.1
npm                 4.4.1   5.3.0   5.3.0
wechat-api         1.32.0  1.33.0  1.33.0


npm update -g <packageName> # 更新全局的软件包

参考:npm升级所有可更新包

卸载npm软件包

卸载本地(local)软件包

npm uninstall <packageName>

删除本地模块时你应该思考的问题:是否将在package.json上的相应依赖信息也消除?

  • npm uninstall 模块: 删除模块,但不删除模块留在package.json中的对应信息
  • npm uninstall --save 模块: 删除模块,同时删除模块留在package.json中dependencies下的对应信息
  • npm uninstall --save-dev 模块: 删除模块,同时删除模块留在package.json中devDependencies下的对应信息

卸载全局(global)软件包

npm uninstall -g <packageName>  

发布npm包

你可以推送任何包含 package.json 文件的文件夹,比如一个 node module

####注册账号

要发布软件包,你必要有一个 npm 账号,如果没有可以使用 npm adduser 创建一个。然后使用 npm login 登录。

参考:

npm的语义版本控制

语义版本控制是许多项目用于传达此版本中的哪些更改的标准。
沟通发布中的哪些更改很重要,因为有时这些更改将会破坏依赖于该包的代码。

semver:语义化版本标准Link

作为发布者:

如果一个项目将与其他人共享,那么应该从1.0.0项目开始,尽管有些项目在npm不符合这个规则。
之后,变更应处理如下:

  • 错误修正和其他微小变化:修补程序释放,增加最后一个数字,例如1.0.1
  • 不破坏现有功能的新功能:轻微释放,增加中间数字,例如1.1.0
  • 破坏向后兼容性的更改:主要版本,增加第一个数字,例如2.0.0

作为使用者:

作为开发者,可以指定应用程序在package.json文件中可以接受哪些类型的更新。

如果您从1.0.4开始,那么您将如何指定范围:

  • 补丁版本:1.0或1.0.x或~1.0.4
  • 次要版本:1或1.x或^1.0.4
  • 主要版本:*或x

NPM-私有模块:

你可以使用 NPM 命令行工具来管理你在 NPM 仓库的私有模块代码,这使得在项目中使用公共模块变的更加方便。

准备工作

你需要一个 2.7.0 以上版本的 npm ,并且需要有一个可以登陆 npm 仓库的账号。

npm install -g npm
npm login

软件包配置

所有的私有模块都是 scoped package 的。

scope 是 npm 的新特性。如果一个模块的名字以 “@” 开始,那么他就是一个scoped package。scope 就是”@”与”/“之间的部分。

@scope/project-name

当你注册私有模块到一个用户下时,你的 scope 就是当前用户的用户名。

@username/project-name

如果要使用npm init 初始化一个软件包,你可以通过自定义 --scope 选项设置你的 scope

npm init --scope=<your_scope>

如果你在大多数时候使用的 scope 都是相同的,可以设置一个默认的 scope ,这样在我们初始化的时候会自动使用该 scope

npm config set scope <your_scope>

发布模块

npm publish

默认情况下,scoped package 会发布为私有模块,发布为私有模块是需要付费的,费用是每个月 $7

一旦完成发布,你将会在npm库站点上看到你的 scoped package,有 private 标志,说明是非公共的模块,他人无法使用。

私有仓库

授权访问

如果你要授权给其他人使用你的模块,你可以在 package 的权限设置页面设置哪些用户可以拥有 只读或读写、权限。也可以通过命令行进行相关设置

npm owner add <user> <package name>

安装私有模块

如果要安装私有模块,你必须要有权限访问到要安装的私有模块。安装的时候可以使用 scope package name

npm install @scope/project-name

当你在项目中使用这些代码模块时可以如下使用

var project = require('@scope/project-name')

参考资料:

NPM-CLI命令:

命令 释义
npm install 安装模块
npm uninstall 卸载模块
npm update 更新模块
npm outdated 检查模块是否已经过时
npm ls 查看安装的模块
npm init 在项目中引导创建一个package.json文件
npm help 查看某条命令的详细帮助
npm root 查看包的安装路径
npm config 管理npm的配置路径
npm cache 管理模块的缓存
npm start 启动模块
npm stop 停止模块
npm restart 重新启动模块
npm test 测试模块
npm version 查看模块版本
npm view 查看模块的注册信息
npm adduser 用户登录
npm publish 发布模块
npm access 在发布的包上设置访问级别
npm package.json 的语法

参考资料:
NPM官网 CLI Commands

NPM-常用配置:

常用配置项:

  • cache:npm 本地缓存目录,默认 ~/.npm
  • cache-max:保持缓存项目且不向 registry 检查的最长时间,单位秒,默认 Infinity,缓存中的数据不会自动删除除非执行 npm cache clean 命令
  • cache-min:保持缓存项目且不向 registry 检查的最短时间,单位秒,默认 10,可以置为 999999 等以尽量延长缓存生效时间
  • depthnpm ls 等命令中的默认深度,默认 Infinity
  • editor:npm 默认使用的编辑器
  • engine-strict:如果置为 true,npm 将会拒绝安装不符合当前 Node.js 版本的模块
  • force:强力执行一些命令
    • 生命周期脚本执行失败不再阻塞安装过程
    • 发布会覆盖已经发布的版本
    • 访问 registry 时会跳过缓存
  • global:全局模式
  • globalconfig:全局配置文件的路径
  • global-style:以安装全局依赖的方式安装局部依赖,只有直接依赖会被放在顶层依赖目录中
  • https-proxy:代理
  • if-present:如果置为 truenpm run-script 就不会在脚本找不到时报错
  • ignore-scripts:如果置为 true,npm 就不会运行 package.json 定义的脚本
  • init-module:指定 npm init 命令运行的模块
  • init-author-namenpm init 使用的默认作者名
  • init-author-emailnpm init 使用的默认作者邮箱
  • init-author-urlnpm init 使用的默认作者 URL
  • init-licensenpm init 使用的默认许可证
  • init-versionnpm init 使用的默认版本号
  • jsonnpm ls 等命令输出 JSON 格式的数据
  • link:如果置为 true,如果全局依赖中有合适的包,安装局部依赖时将会直接链接到这个全局依赖的包;如果全局依赖中没有该包的任何版本,则全局安装这个包,并链接到局部依赖中;其他情况则在局部依赖中安装该包
  • longnpm lsnpm search 显示额外信息
  • messagenpm version 写在 git 提交中的信息,%s 将被替换为版本号
  • npat:安装时运行测试
  • onload-script:指定一个在 npm 加载时 require() 的包,编程使用 npm 时可能会有用
  • only:与命令中的 --only 效果类似
  • optional:如果置为 false,则不安装 optionalDependencies 中的依赖
  • prefix:指定安装全局依赖的路径
  • production:如果置为 true,则开启生产模式,npm install 将不安装开发依赖,声明周期脚本运行时自动设置 NODE_ENV="production"
  • registry:指定 npm registry 的 URL
  • rollback:移除安装失败的模块
  • save:与命令中的 --save 效果类似
  • scope:与命令中的 --scope 效果类似
  • shrinkwrap:如果置为 false,安装时忽略 npm-shrinkwrap.json
  • progress:如果置为 false,不显示进度条
  • loglevel:设置输出日志的 level,置为 silly 可以显示全部日志

npmrc:

配置文件有:

  • 项目配置文件(/path/to/my/project/.npmrc)
  • 用户配置文件(~/.npmrc)
  • 全局配置文件(/path/to/node/etc/npmrc)
  • 内置配置文件(/path/to/npm/npmrc)

scripts:

npm 支持的生命周期脚本有:

  • prepublish: 发布模块之前执行,也在不带任何参数的局部 npm install 之前执行
  • publishpostpublish: 发布模块之后执行
  • preinstall: 安装该模块之前执行
  • installpostinstall: 安装该模块之后执行
  • preuninstalluninstall: 移除该模块之前执行
  • postuninstall: 移除该模块之后执行
  • preversionversion: 修改模块版本号之前执行
  • postversion: 修改模块版本号之后执行
  • pretesttestposttest: 在 test 命令的前后执行
  • prestopstoppoststop: 在 stop 命令的前后执行
  • prestartstartpoststart: 在 start 命令的前后执行.
  • prerestartrestartpostrestart: 在 restart 命令的前后执行,如果 restart 脚本没有提供,restart 命令将会执行 stop 脚本再执行 start 脚本

对于自定义名称的脚本,可以通过 npm run-script <pkg> <stage> 来执行,匹配名称的 prepost 命令同样也会执行。

NPM-参考资料: