About npm
-
npmstands for “node package manager”,这应该算是这个工具的初衷吧(for Node.js),当然现在做得越来越好了,官方也把口号改为了”javascript package manager”。 npm之于Javascript类似于pip之于Python。它们都是“包”管理工具,目前看到的主要区别:- 默认的包管理方式不同:
npm管理下每个project都有一个独立环境,默认情况下新安装的包也是在项目的目录下的(近似于pip+virtualenv);而pip则是统一安装到了一个目录下(近似于npm -g)。 - 包的组织结构不同:
npm的包结构是一棵树,即每个依赖包都作为这棵树的一个节点,而每个依赖包所依赖的依赖包则是放在各自的节点之下的,这就导致了一个比较底层的包会在这棵树里出现很多次的情况;而pip在这点上则有点像bower(另外一个Javascript包管理工具),它的包结构是一个列表(当然本质上也是棵树),它没有显式地标出依赖包的依赖包,而是在安装时会去安装这棵树上的所有包。 npm项目依赖可以写到名为package.json的文件中,内容为json格式(具体格式参考https://docs.npmjs.com/files/package.json);而pip是把依赖写在requirements.txt中或放在setup.py中。
- 默认的包管理方式不同:
-
由于
npm与pip设计理念(隔离的粒度)的不同,所以我们在开始一个新的JavaScript项目时需要首先创建package.json文件,并npm install来先安装好一些必要的依赖包,然后再着手写项目中的代码;而开始新的Python项目时,是可以不先新建一个requirements.txt文件并pip install的(除非需要的包版本和当前环境的冲突,就要用virtualenv新建一个环境并安装依赖包了),当代码完成之后,我们再把依赖包的信息写在requirements.txt或setup.py当中。当然一个比较好的习惯是每次开始一个新的Python项目都先隔离出一个新的环境并安装好依赖包再开始coding(以此看来,npm的理念还是更好点啊)。 -
一些常用的npm命令:
-
使用
sudo npm install npm -g来升级npm到最新版本。 -
使用
npm init来生成一个基础的package.json。 -
使用
npm run <command>来执行package.json中scripts字段中的内容或是依赖包中bin目录下的可执行文件(它其实就是对bash的一层封装,添加了一些规则)。 比如在package.json中有如下定义:"scripts": { "start": "npm run lite", "lite": "lite-server" }, "devDependencies": { "lite-server": "^2.2.2" }那么我可以进入到项目根目录后执行
npm run start以及npm run lite(定义在scripts字段中了,由于这里的start对应的是npm run lite,所以这两条命令效果是一样的),除此之外还可以执行npm run lite-server(其实上述两条命令最终会转换成这条命令),它相当于执行了./node_modules/lite-server/bin/lite-server文件(实现原理是npm会将所有依赖包下的bin目录临时添加到PATH环境变量中,执行lite-server命令会到PATH中所有目录去寻找同名的可执行文件,找到就执行找不到就报错)。 -
使用
npm start可以省略npm run start中的run,同样的简写还有npm test、npm stop和npm restart。
-

Comments