『管理工具-NPM』相关内容整理
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分别来测试nodejs和npm是否安装成功。
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”
- 的形式 x.x.x
- 遵循semver spec命名规范
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
等以尽量延长缓存生效时间depth
:npm ls
等命令中的默认深度,默认Infinity
editor
:npm 默认使用的编辑器engine-strict
:如果置为true
,npm 将会拒绝安装不符合当前 Node.js 版本的模块force
:强力执行一些命令- 生命周期脚本执行失败不再阻塞安装过程
- 发布会覆盖已经发布的版本
- 访问 registry 时会跳过缓存
global
:全局模式globalconfig
:全局配置文件的路径global-style
:以安装全局依赖的方式安装局部依赖,只有直接依赖会被放在顶层依赖目录中https-proxy
:代理if-present
:如果置为true
,npm run-script
就不会在脚本找不到时报错ignore-scripts
:如果置为true
,npm 就不会运行package.json
定义的脚本init-module
:指定npm init
命令运行的模块init-author-name
:npm init
使用的默认作者名init-author-email
:npm init
使用的默认作者邮箱init-author-url
:npm init
使用的默认作者 URLinit-license
:npm init
使用的默认许可证init-version
:npm init
使用的默认版本号json
:npm ls
等命令输出 JSON 格式的数据link
:如果置为true
,如果全局依赖中有合适的包,安装局部依赖时将会直接链接到这个全局依赖的包;如果全局依赖中没有该包的任何版本,则全局安装这个包,并链接到局部依赖中;其他情况则在局部依赖中安装该包long
:npm ls
和npm search
显示额外信息message
:npm 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 的 URLrollback
:移除安装失败的模块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
之前执行publish
、postpublish
: 发布模块之后执行preinstall
: 安装该模块之前执行install
、postinstall
: 安装该模块之后执行preuninstall
、uninstall
: 移除该模块之前执行postuninstall
: 移除该模块之后执行preversion
、version
: 修改模块版本号之前执行postversion
: 修改模块版本号之后执行pretest
、test
、posttest
: 在test
命令的前后执行prestop
、stop
、poststop
: 在stop
命令的前后执行prestart
、start
、poststart
: 在start
命令的前后执行.prerestart
、restart
、postrestart
: 在restart
命令的前后执行,如果restart
脚本没有提供,restart
命令将会执行stop
脚本再执行start
脚本
对于自定义名称的脚本,可以通过 npm run-script <pkg> <stage>
来执行,匹配名称的 pre 和 post 命令同样也会执行。