概述
npm
有两种含义。
首先,npm 是一个网站,用来登记和管理 Node 的模块,网址为npmjs.org。
其次,npm 是一个命令行软件,用来在用户的电脑上安装和管理 Node 模块。
安装
npm
不需要单独安装。安装 Node 的时候,会默认一起安装npm
。
但是,默认安装的npm
可能不是最新版本。在 Node 安装成功后,最好用下面的命令,更新到最新版本。
然后,运行下面的命令,查看一下 npm 的版本。
下面三个命令,也可以用来获取帮助。
npm init
npm init
用来初始化生成一个新的package.json
文件。它会向用户提问一系列问题,如果你觉得不用修改默认配置,一路回车就可以了。
如果使用了-f
(代表force)、-y
(代表yes),则跳过提问阶段,直接生成一个新的package.json
文件。
npm set
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
。
上面命令设置加入模块时,package.json
将记录模块的确切版本,而不是一个可选的版本范围。
npm config
上面的命令将指定的$dir
目录,设为模块的全局安装目录。如果当前有这个目录的写权限,那么运行npm install
的时候,就不再需要sudo
命令授权了。
上面的命令使得npm install --save
和npm install --save-dev
安装新模块时,允许的版本范围从克拉符号(^
)改成波浪号(~
),即从允许小版本升级,变成只允许补丁包的升级。
上面命令指定使用npm init
时,生成的package.json
文件的字段默认值。
npm info
npm info
命令可以查看每个模块的具体信息。比如,查看underscore模块的信息。
$ npm info underscore
{ name: 'underscore',
description: 'JavaScript\'s functional programming helper library.',
'dist-tags': { latest: '1.5.2', stable: '1.5.2' },
repository:
{ type: 'git',
url: 'git://github.com/jashkenas/underscore.git' },
homepage: 'http://underscorejs.org',
main: 'underscore.js',
version: '1.5.2',
devDependencies: { phantomjs: '1.9.0-1' },
licenses:
{ type: 'MIT',
url: 'https://raw.github.com/jashkenas/underscore/master/LICENSE' },
files:
[ 'underscore.js',
'underscore-min.js',
'LICENSE' ],
readmeFilename: 'README.md'}
上面命令返回一个JavaScript对象,包含了underscore模块的详细信息。这个对象的每个成员,都可以直接从info命令查询。
$ npm info underscore description
JavaScript's functional programming helper library.
$ npm info underscore homepage
http://underscorejs.org
$ npm info underscore version
1.5.2
npm search
npm search
命令用于搜索npm仓库,它后面可以跟字符串,也可以跟正则表达式。
下面是一个例子。
$ npm search node-gyp
// NAME DESCRIPTION
// autogypi Autogypi handles dependencies for node-gyp projects.
// grunt-node-gyp Run node-gyp commands from Grunt.
// gyp-io Temporary solution to let node-gyp run `rebuild` under…
// ...
npm list
npm list
命令以树型结构列出当前项目安装的所有模块,以及它们依赖的模块。
加上global参数,会列出全局安装的模块。
npm list
命令也可以列出单个模块。
npm link
开发NPM模块的时候,有时我们会希望,边开发边试用,比如本地调试的时候,require('myModule')
会自动加载本机开发中的模块。Node规定,使用一个模块时,需要将其安装到全局的或项目的node_modules
目录之中。对于开发中的模块,解决方法就是在全局的node_modules
目录之中,生成一个符号链接,指向模块的本地目录。
npm link
就能起到这个作用,会自动建立这个符号链接。
请设想这样一个场景,你开发了一个模块myModule
,目录为src/myModule
,你自己的项目myProject
要用到这个模块,项目目录为src/myProject
。首先,在模块目录(src/myModule
)下运行npm link
命令。
上面的命令会在NPM的全局模块目录内,生成一个符号链接文件,该文件的名字就是package.json
文件中指定的模块名。
这个时候,已经可以全局调用myModule
模块了。但是,如果我们要让这个模块安装在项目内,还要进行下面的步骤。
切换到项目目录,再次运行npm link
命令,并指定模块名。
上面命令等同于生成了本地模块的符号链接。
然后,就可以在你的项目中,加载该模块了。
这样一来,myModule
的任何变化,都可以直接反映在myProject
项目之中。但是,这样也出现了风险,任何在myProject
目录中对myModule
的修改,都会反映到模块的源码中。
如果你的项目不再需要该模块,可以在项目目录内使用npm unlink
命令,删除符号链接。
npm bin
npm bin
命令显示相对于当前目录的,Node模块的可执行脚本所在的目录(即.bin
目录)。
npm adduser
npm adduser
用于在npmjs.com注册一个用户。
npm publish
npm publish
用于将当前模块发布到npmjs.com
。执行之前,需要向npmjs.com
申请用户名。
如果已经注册过,就使用下面的命令登录。
登录以后,就可以使用npm publish
命令发布。
如果当前模块是一个beta版,比如1.3.1-beta.3
,那么发布的时候需要使用tag
参数,将其发布到指定标签,默认的发布标签是latest
。
如果发布私有模块,模块初始化的时候,需要加上scope
参数。只有npm的付费用户才能发布私有模块。
Scopes
相当于npm
模块的命名空间,scoped package
的包名格式为:
包名以@
开头,介于@
和/
之间的为scope
。
Scoped Package
默认为私有模块,付费用户才能发布,不过发布时可以指定为公开模块,就不需要付费。
如果你的模块是用ES6写的,那么发布的时候,最好转成ES5。首先,需要安装Babel。
然后,在package.json
里面写入build
脚本。
"scripts": {
"build": "babel source --presets babel-preset-es2015 --out-dir distribution",
"prepublish": "npm run build"
}
运行上面的脚本,会将source
目录里面的ES6源码文件,转为distribution
目录里面的ES5源码文件。然后,在项目根目录下面创建两个文件.npmignore
和.gitignore
,分别写入以下内容。
npm deprecate
如果想废弃某个版本的模块,可以使用npm deprecate
命令。
运行上面的命令以后,小于0.2.3
版本的模块的package.json
都会写入一行警告,用户安装这些版本时,这行警告就会在命令行显示。
npm owner
模块的维护者可以发布新版本。npm owner
命令用于管理模块的维护者。
# 列出指定模块的维护者
$ npm owner ls <package name>
# 新增维护者
$ npm owner add <user> <package name>
# 删除维护者
$ npm owner rm <user> <package name>
其他命令
npm home,npm repo
npm home
命令可以打开一个模块的主页,npm repo
命令则是打开一个模块的代码仓库。
这两个命令不需要模块先安装。
npm outdated
npm outdated
命令检查当前项目所依赖的模块,是否已经有新版本。
它会输出当前版本(current version)、应当安装的版本(wanted version)和最新发布的版本(latest version)。
npm prune
npm prune
检查当前项目的node_modules
目录中,是否有package.json
里面没有提到的模块,然后将所有这些模块输出在命令行。
npm shrinkwrap
npm shrinkwrap
的作用是锁定当前项目的以来模块的版本。
运行该命令后,会在当前项目的根目录下生成一个npm-shrinkwrap.json
文件,内容是node_modules
目录下所有已经安装模块的版本。
下次运行npm install
命令时,npm
发现当前目录下有npm-shrinkwrap.json
文件,就会只安装里面提到的模块,且版本也会保持一致。
命令行参数
--proxy
--proxy
参数允许对npm
命令设置代理。
$ npm --proxy http://127.0.0.1:8100 install
# or
$ npm config set proxy http://127.0.0.1:8100
$ npm install
上面的命令将通过本机的8100端口代理npm
的通信。
如果设置了环境变量HTTP-PROXY
或者http-proxy
和HTTPS-PROXY
或者https-proxy
,那么代理设置将以这个环境变量为准。
--registry
--registry
参数设置npm
与之通信的远程主机,默认是https://registry.npmjs.org/
。
$ npm install --registry=https://registry.npm.taobao.org
# or
$ npm config set registry "https://registry.npm.taobao.org"
$ npm install
上面的命令将远程主机设为npm
的淘宝镜像。
参考链接
- James Halliday, task automation with npm run: npm run命令(package.json文件的script属性)的用法
- Keith Cirkel, How to Use npm as a Build Tool
- justjs, npm link: developing your own npm modules without tears
- hoodie-css, Development Environment Help
- Stephan Bönnemann, How to make use of npm’s package distribution tags to create release channels
- Alex Booker, How to Build and Publish ES6 npm Modules Today, with Babel