1、npm是什么?
NPM (node package manager),通常称为node包管理器。顾名思义,它的主要功能就是管理node包,包括:安装、卸载、更新、查看、搜索、发布等。
npm 可以让 JavaScript 开发者在共享代码、复用代码以及更新共享的代码上更加方便。
当一个 JavaScript 开发者为了解决某个问题而编写了一些代码并将其共享出来的话,其他的开发者能够在自己的应用程序中复用这些代码,npm 让这些事情变得简单。
如果你使用了其他开发者开发的代码,你就可以很方便地使用 npm 来检查这些代码是否有了新的版本,然后可以下载新版本。
这些能够被复用的小段代码叫做 package (包),或者也可以叫成 module(模块)。一个 package 仅仅只是一个文件夹,里面带有一个或者多个文件而已。其中有一个叫做 "package.json" 的文件是用来描述这个 package 的信息的。通常一个应用(比如一个网站)会依赖几十个或上百个 package,并且这些 package 通常都不会很大。一个基本的思想就是建立一个精小的代码块专门用来解决某个问题,然后再通过这些小的代码块组合起来来解决一个更大的问题。
这种工作方式是有很多好处的。比如有些专家针对某个问题设计出一个 package,我们可以很方便地使用 npm 来获取这个 package。又或者你不想使用团队之外的代码,我们也可以使用这些基于模块的开发方式来让我们团队更好地协作开发,并且自己开发的模块还能够在不同的项目中使用。
在 npm 网站可以找到很多 package 用于构建你的应用。当你浏览 npm 网站时,可以找到很多不同类型的 Node 模块(Node module)。最开始的时候,npm 只是被当做 Node 的包管理器,因此可以找到大量能够应用在服务器端的模块。还有大量能够作为命令行工具使用的 package 。当然还可以找到很多用于前端开发的包。
npm 由三个独立的部分组成:网站、注册表(registry)和命令行工具(CLI)。网站主要是让用户查找 package 的;注册表(registry)是一个巨大的数据库,保存了每个 package 信息的;命令行工具(CLI)是开发者用来发布自己的 package 到注册表或者下载所需 package 的工具。
npm 是一种重用其他开发者所开发的代码的一种方式,并且也是一种与他人共享代码的方式,还能够让你很容易地管理代码的版本。
npm的背后,是基于couchdb的一个数据库,详细记录了每个包的信息,包括作者、版本、依赖、授权信息等。它的一个很重要的作用就是:将开发者从繁琐的包管理工作(版本、依赖等)中解放出来,更加专注于功能的开发。
2、安装 Node.js 以及更新 npm
2.1安装Node.js
如果你使用的是 OS X 或者 Windows,安装 Node.js 的最好方式就是使用
Node.js 下载页面的安装程序。
运行 node -v
来查看 Node 的版本号。
2.2更新npm
Node 中捆绑了 npm,因此当你安装好Node.js后你的电脑上应该已经安装了某个版本的 npm。不过,npm 的更新比 Node 频繁多了,因此我们应该确保我们使用的是最新版本的 npm。
npm install npm@latest -g
运行 npm -v
查看npm的版本号。
3、本地安装npm包
3.1本地安装or全局安装
有两种方式用来安装 npm 包:本地安装和全局安装。至于选择哪种方式来安装,取决于我们如何使用这个包。
如果你自己的模块依赖于某个包(比如通过 Node.js 的require
加载),那么你应该选择本地安装,这种方式也是npm install
命令的默认行为。 如果你想将包作为一个命令行工具,比如 grunt CLI,那么你应该选择全局安装。
想要了解更多关于install
命令行的行为,可以查看CLI 文档。
3.2本地安装
可以使用下面的命令来本地安装一个包:
npm install <package_name>
上述命令执行之后将会在当前的目录下创建一个 node_modules 的目录(如果不存在的话),然后将下载的包保存到这个目录下。
为了确认 npm install 是正常工作的,可以检查 node_modules 目录是否存在,并且里面是否含有你安装的包的文件夹。在类 Unix 系统中(例如 "OSX"、"Debian"),你可以使用 ls node_modules 命令来查看,在 Windows 系统中则可以使用 dir node_modules 命令来查看。
例如,安装一个叫做 lodash 的包。安装成功之后,如果 node_modules 目录下存在一个名为 lodash 的文件夹,则说明成功安装了这个包。
> npm install lodash
> ls node_modules # 在 Windows 系统中使用 `dir` 命令
#=> lodash
3.3全局安装
将包安装到全局,你应该使用 如下命令:
npm install -g <package_name>
如果你遇到 EACCES 错误,那么你_需要修复权限问题。你还可以尝试使sudo
来解决这个问题,不过最好避免这样做:
sudo npm install -g jshint
3.4哪个版本的包会被安装?
在本地目录中如果没有package.json
这个文件的话,那么最新版本的包会被安装。如果存在package.json
文件,则会在package.json
文件中查找针对这个包所约定的语义化版本规则,然后安装符合此规则的最新版本。
3.5使用已安装的包
一旦将包安装到 node_modules 目录中,你就可以使用它了。比如在你所创建的 Node.js 模块中,你可以 require 这个包。
实例,创建一个名为 index.js 的文件,并保存如下代码:
// index.js
var lodash = require('lodash');
var output = lodash.without([1, 2, 3], 1);
console.log(output);
运行 node index.js 命令。应当输出 [2, 3]。
如果你没能正确安装 lodash,你将会看到如下的错误信息:
module.js:340
throw err;
^
Error: Cannot find module 'lodash'
可以在 index.js 所在的目录中运行 npm install lodash 命令来修复这个问题。
3.6node_modules的查找路径是怎样的?
从当前文件目录开始查找node_modules目录,如果没有,则进入父级目录,查找父级目录下的node_modules目录;直到根目录下的node_modules目录。
比如当前脚本文件/demo/src/foo.js,在该模块中使用require('bar')方式加载模块时,node内部运行过程如下:
/demo/src/node_modules/bar
/demo/node_modules/bar
/node_modules/bar
4、卸载本地安装的包
通过 npm uninstall <package> 命令可以将 node_modules 目录下的包删除掉:
npm uninstall lodash
如需从 package.json 文件中删除依赖,需要在命令后添加参数 --save:
npm uninstall --save lodash
注意:如果你将安装的包作为 "devDependency"(也就是通过 --save-dev 参数保存的),那么 --save 无法将其从 package.json 文件中删除。所以必须通过 --save-dev 参数可以将其卸载。
为了确定 npm uninstall 能够正常工作,请先检查 node_modules 目录是否存在,并且你所删除的包不在这个目录下。
实例,安装 lodash。为了确认安装成功,请检查 node_modules 目录下存在 lodash 目录。
通过 npm uninstall 命令卸载 lodash。为了确认执行成功,请检查 node_modules 目录下不存在 lodash 目录。
> npm install lodash
> ls node_modules # Windows 系统下使用 `dir` 命令
#=> lodash
> npm uninstall lodash
> ls node_modules
#=>
5、更新本地安装的包
很多时候,我们会更新我们所依赖的包以获取最新的更新。
为了完成这个任务,在 package.json 文件所在的目录中执行 npm update 命令即可。
运行 npm outdated 命令。不输出任何结果表示成功。
6、更新全局安装的包
如需更新全局安装的包,运行npm update -g <package_name>
命令即可:
npm update -g jshint
想要查看哪些全局安装的包需要更新,你可以使用
npm outdated -g --depth=0
命令来查看。
如果需要更新所有全局安装的包的话,你应该使用npm update -g
命令。不过,如果 npm 版本低于 2.6.1 的话,建议通过此脚本更新所有陈旧的包。
7、卸载全局安装的包
安装到全局的包可以通过 npm uninstall -g <package_name> 来卸载,如:
npm uninstall -g jshint
8、创建Node.js 模块
Node.js 模块就是可以发布到 npm 的代码包。当你创建一个新模块时,创建 package.json 文件是第一步。
你可以使用 npm init 命令创建 package.json 文件。命令行中将会提示 package.json 字段中需要你输入的值。名称(name) 和 版本(version) 这两个字段是必填的。你还需要输入入口文件字段(main) 字段,当然,可以使用默认值 index.js。
如果你想为作者(author)字段添加信息,你可以使用以下格式(邮箱、网址都是选填的):
Your Name <email@example.com> (http://example.com)
创建 package.json 文件之后,还需要创建模块的入口文件。如果使用默认值,文件名是 index.js。
创建好的package.json是长这样的
在入口文件中,添加一个函数,作为 exports对象的一个属性。这样,require 此文件之后,这个函数在其他代码中就可以使用了。
exports.printMsg = function() {
console.log("This is a message from the demo package");
}
这样的话,你的node模块就已经创建完成了。
发布完自己的包之后,可以做如下尝试:
- 将你的包发布到 npm。
- 在你的项目外新建一个目录,然后 cd 进入这个新目录。
- 运行 npm install <package>。
- 创建一个 test.js 文件,require 这个包,并调用其中的方法。
- 运行 node test.js。查看是否和代码中的信息一致。
9、发布npm包
可以发布任何具有package.json文件的目录到npm服务器上。要发布,必须是npm注册表上的用户。
9.1创建一个用户
注册一个npm账号,2个方式,最简单的就是去npm官网注册
- npm注册
- 还有一个方式就是 npm adduser,按照它的提示去创建
9.2首次需要登录,使用npm login 存储证书到本地,后面就不需要每次都登录了
登录需要输入用户名,密码,还有邮箱,这些都是刚刚注册时候填写的
9.3发布包
使用npm publish发布包。
发布过程会把整个目录发布,不想发布的内容模块,可以通过 .gitignore 或 .npmignore 文件忽略。发布成功之后可以去npm官网搜索一下,是否已经存在npm
发布过程可能会遇到这样的一个问题:
使用 cnpm 的注意报错:
no_perms Private mode enable, only admin can publish this module
设置回原本的就可以了
npm config set registryhttp://registry.npmjs.org
发布完成之后,如果还想回到之前的cnpm,使用下面的命令
npm config set registry https://registry.npm.taobao.org
9.4创建一个案例,引用刚上传的包
假设已经成功发布了,并且包名叫做test-module,这时候可以新建一个空目录,cd进去,运行npm install test-module,然后在这个目录下会出现一个叫node_modules的文件夹,你之前写的包就会出现在这个文件夹下面。
然后写一个index.js文件,代码如下
var test = require('toniqian-test-module');
test.showMsg();
运行index.js
node index.js
运行结果显示
This is my first module
那么刚刚上传的包,目前已经可以使用,到目前的话,你已经成功创建了一个npm包了。
9.5如何更新npm包
当你包的内容修改之后,比如:
exports.showMsg = function () {
console.log("This is my second module");
};
修改了提示文字,那么我们需要
npm version <update_type>
update_type
就是版本号的意思,会自动更新package.json里面的版本号
然后重新 npm publish,更新就会完成。
10、npm script是什么?如何使用?
package.json 文件有一个 scripts 字段,可以用于指定脚本命令,供 npm 直接调用。
npm 内置了两个简写的命令:
npm test
和npm start
,其它命令要写成npm run xxx
形式