1. npm stands for “node package manager”,这应该算是这个工具的初衷吧(for Node.js),当然现在做得越来越好了,官方也把口号改为了”javascript package manager”。

  2. 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中。
  3. 由于npmpip设计理念(隔离的粒度)的不同,所以我们在开始一个新的JavaScript项目时需要首先创建package.json文件,并npm install来先安装好一些必要的依赖包,然后再着手写项目中的代码;而开始新的Python项目时,是可以不先新建一个requirements.txt文件并pip install的(除非需要的包版本和当前环境的冲突,就要用virtualenv新建一个环境并安装依赖包了),当代码完成之后,我们再把依赖包的信息写在requirements.txtsetup.py当中。当然一个比较好的习惯是每次开始一个新的Python项目都先隔离出一个新的环境并安装好依赖包再开始coding(以此看来,npm的理念还是更好点啊)。

  4. 一些常用的npm命令:

    • 使用sudo npm install npm -g来升级npm到最新版本。

    • 使用npm init来生成一个基础的package.json

    • 使用npm run <command>来执行package.jsonscripts字段中的内容是依赖包中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 testnpm stopnpm restart