8月 282014
 

收集了一些关于npm的资料,记录下。

一、安装NPM

NPM的全称是Node Package Manager,如果你熟悉ruby的gem,Python的PyPL、setuptools,PHP的pear,那么你就知道NPM的作用是什么了。没错,它就是Nodejs的包管理器。Nodejs自身提供了基本的模块。但是在这些基本模块上开发实际应用需要较多的工作。所幸的是笔者执笔此文的时候NPM上已经有了5112个Nodejs库或框架,这些库从各个方面可以帮助Nodejs的开发者完成较为复杂的应用。这些库的数量和活跃也从侧面反映出Nodejs社区的发展是十分神速和活跃的。下面我将介绍安装NPM和通过NPM安装Nodejs的第三方库,以及在大陆的网络环境下,如何更好的利用NPM。

Unix/Linux下安装NPM

就像NPM的官网(http://npmjs.org/)上介绍的那样,安装NPM仅仅是一行命令的事情:

curl http://npmjs.org/install.sh | sh

这里详解一下这句命令的意思,curl http://npmjs.org/install.sh是通过curl命令获取这个安装shell脚本,按后通过管道符| 将获取的脚本交由sh命令来执行。这里如果没有权限会安装不成功,需要加上sudo来确保权限:

curl https://npmjs.org/install.sh | sudo sh

安装成功后执行npm命令,会得到一下的提示:

Usage: npm <command>
where <command> is one of:
adduser, apihelp, author, bin, bugs, c, cache, completion,
config, deprecate, docs, edit, explore, faq, find, get,
help, help-search, home, i, info, init, install, la, link,
list, ll, ln, ls, outdated, owner, pack, prefix, prune,
publish, r, rb, rebuild, remove, restart, rm, root,
run-script, s, se, search, set, show, star, start, stop,
submodule, tag, test, un, uninstall, unlink, unpublish,
unstar, up, update, version, view, whoami

我们以underscore为例,来展示下通过npm安装第三方包的过程。

npm install underscore

返回:

[email protected] ./node_modules/underscore

由于一些特殊的网络环境,直接通过npm install命令安装第三方库的时候,经常会出现卡死的状态。幸运的是国内CNode社区的@fire9同学利用空余时间搭建了一个镜像的NPM资源库,服务器架设在日本,可以绕过某些不必要的网络问题。你可以通过以下这条命令来安装第三方库:

npm –registry “http://npm.hacknodejs.com/” install underscore

如果你想将它设为默认的资源库,运行下面这条命令即可:

npm config set registry “http://npm.hacknodejs.com/

设置之后每次安装时就可以不用带上—registry参数。值得一提的是还有另一个镜像可用,该镜像地址是http://registry.npmjs.vitecho.com,如需使用,替换上面两行命令的地址即可。

二、NPM常用命令介绍

npm install xxx 安装模块 

npm install [email protected] 安装1.1.1版本的xxx

npm install xxx -g 将模块安装到全局环境中。

 npm ls 查看安装的模块及依赖
npm ls -g 查看全局安装的模块及依赖 

npm uninstall xxx (-g) 卸载模块 

npm cache clean 清理缓存 

npm help xxx 查看帮助 

npm view moudleName dependencies 查看包的依赖关系 

npm view moduleNames 查看node模块的package.json文件夹 

npm view moduleName labelName 查看package.json文件夹下某个标签的内容 

npm view moduleName repository.url 查看包的源文件地址 

npm view moduleName engines 查看包所依赖的Node的版本 

npm help folders 查看npm使用的所有文件夹 

npm rebuild moduleName 用于更改包内容后进行重建 

npm outdated  检查包是否已经过时,此命令会列出所有已经过时的包,可以及时进行包的更新 

npm update moduleName 更新node模块

  更多命令参考:https://npmjs.org/doc/

三、本地安装与全局安装

npm的包安装分为本地安装(local)、全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已,比如

npminstall grunt# 本地安装npminstall -g grunt-cli# 全局安装

这两种安装方式有什么区别呢?从npm官方文档的说明来看,主要区别在于(后面通过具体的例子来说明):
本地安装
1. 将安装包放在 ./node_modules 下(运行npm时所在的目录)
2. 可以通过 require() 来引入本地安装的包

全局安装
1. 将安装包放在 /usr/local 下
2. 可以直接在命令行里使用

本地安装

1、将安装包放在 ./node_modules 下(运行npm时所在的目录)

比如运行下面命令

npm install grunt–save-dev

那么,就会在当前目录下发现一个node_modules目录,进去后能够看到grunt这个包

casperchenMacBookPro:testUsemincasperchen$lltotal200drwxr-xr-x16casperchenstaff544B12 14 23:17node_modules

进入node_modules

casperchenMacBookPro:node_modulescasperchen$lltotal0drwxr-xr-x16casperchenstaff544B12 5 00:49grunt

2、可以通过 require() 来引入本地安装的包

直接来个例子,我们在项目根目录下创建test.js,里面的内容很简单

vargrunt=require(‘grunt’);grunt.log.writeln(‘hello grunt’);

然后在控制台运行test.js

node test.js

然后就会看到如下输出

casperchenMacBookPro:testUsemin casperchen$node test.js
hello grunt

全局安装

1、将安装包放在 /usr/local 下

运行如下命令

npminstall -g grunt-cli

然后进入/usr/local/bin目录,就会发现grunt-cli已经被放置在下面了

casperchenMacBookPro:bin casperchen$pwd
/usr/local/bincasperchenMacBookPro:bin casperchen$ll grunt
lrwxr-xr-x1root admin39B81821:43grunt -> ../lib/node_modules/grunt-cli/bin/grunt

可见,全局模块的真实安装路径在/usr/local/lib/node_modules/下,/usr/local/bin下的可执行文件只是软链接而已

2、可以直接在命令行里使用

实现细节在上面其实就讲到了,通过在`/usr/local/bin下创建软链接的方式实现。这里不赘述

更直观的例子

下面就直接看下,当我们在项目目录下运行grunt task(task为具体的grunt任务名,自行替换)时,发生了什么事情。这里要借助node-inspector。

首先,没接触过node-inspector的童鞋可以参考之前的文章了解下

运行如下命令开启调试

node-inspector &

见到如下输出

casperchenMacBookPro:tmp casperchen$node-inspector &
[1]14390casperchenMacBookPro:tmp casperchen$NodeInspectorv0.6.1info – socket.io startedVisithttp://127.0.0.1:8080/debug?port=5858to start debugging.

接着,在当前任务下运行grunt任务

^CcasperchenMacBookPro:testUsemincasperchen$node –debug-brk$(which grunt) dev
debugger listening on port5858

接着,打开chrome浏览器,输入网址http://127.0.0.1:8080/debug?port=5858,就会自动进入断点调试状态
。从一旁显示的tips可以看到,全局命令grunt其实就是/usr/local/lib/node_modules/grunt-cli/bin/grunt
image

按下F8接着往下跑,就会进如Gruntfile.js,此时的grunt,是本地安装的一个node包。全局命令跟本地的包名字一样,挺有迷惑性的。
image