About npm
-
npm
stands 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