NPM 实践了 CommonJS 包规范规范,帮助咱们安装和管理依赖包,使得 Node 项目的第三方模块更加规范便捷,能够在 NPM 平台上找到全部共享的插件。vue
CommonJS 包规范的定义分为两部分:用于组织文件目录的包结构和用于描述包信息的包描述文件 package.json。node
一个包由至关于一个存档文件,可压缩为.zip
或tar.gz
,安装时解压还原。彻底符合 CommonJS 包规范的目录包含如下文件:express
|-- .bin // 存放可执行的二进制文件 |-- lib // 存放 Javascript 文件 |-- doc // 存放文档 |-- test // 存放单元测试用例 |-- package.json // 包描述文件
包描述文件 package.json 是一个 JSON 文件,在包的根目录下。NPM 的全部行为都与 package.json 中的字段有关,Node 程序的依赖项也体如今这些字段上。npm
CommonJS 包规范定义了 package.json 中的字段,NPM 实现时对 CommonJS 包规范中的字段也进行取舍和新增,经常使用字段有:json
require()
引入时优先检查该字段。若是 main 字段不存在,Node 按照模块文件定位的规则依次查找包目录下的 index.js、index.node、index.json;npm install package_name -g
将包添加到执行路径中,以后能够“全局使用”。NPM 帮助 Node 完成第三方模块的发布、安装和依赖。能够直接执行$ npm
查看全部命令。segmentfault
使用$ npm init
能够快速生成一个 package.json 文件。数组
使用 npm install
安装依赖包是 NPM 最经常使用的功能,例如执行npm install express
后,npm 向 registry 查询模块压缩包的网址,下载压缩包后 NPM 会在当前的 node_module
目录下建立 express 目录,将包解压还原在此。babel
registry 是 NPM 模块仓库提供了一个查询服务,例如 npmjs.org 的查询服务网址
https://registry.npmjs.org/ ,加模块名
https://registry.npmjs.org/vue 就获得包含 Vue 模块全部版本的信息 JSON 对象,也可使用
$ npm view vue
查询。
Node 项目使用require('express')
引入 express 模块时,require()
方法在路径分析时按照模块路径查找策略,沿当前路径向上逐级查找node_module
目录,最终定位到 express 目录。工具
包的安装和模块引入是相辅相成的, 能够进一步理解 Node 模块加载原理
npm install
默认将包和 package.json 的依赖关系保存在dependencies
,但在能够经过一些额外的标志来控制它们的保存位置和方式:单元测试
-P
or --save
or --save-prod
: 依赖在dependencies
,默认值.-D
or --save-dev
: 依赖在 devDependencies
.-O
or --save-optional
: 依赖在 optionalDependencies
.--no-save
: 防止包依赖保存在 dependencies
.例如 npm install express -D
就会将 express 依赖关系保存在devDependencies
。
在npm install
一个模块时常常纠结要安装在devDependencies
仍是dependencies
,从字面意思看前者用于生产环境,后者用于开发环境。
在官方的定义中,若是环境变量 NODE_ENV 设置为 production,执行 npm install --production
时 npm 会默认安装dependencies
里面的依赖项,不会去安装devDependencies
里的。而且推荐dependencies
里配置正式运行时必须依赖的插件,devDependencies
一般用来放咱们开发或测试的工具,好比 Webpack,Gulp,babel,eslint等。
在实际开发过程当中,Node 包的安装是依据 require/import 模块机制,不管是-P
仍是-D
指令都会把依赖下载到 node_modules
文件夹,-P
仍是-D
只是修改了dependencies
对象,在安装这个库进行开发调试的时候,能够经过npm install
一键安装这两个目录下全部的依赖。
使用 -g
或 --global
能够将包安装为“全局可用”,但须要注意的是,全局安装并不意味将模块包安装为一个全局包,也不是能够在任何地方均可以require()
引入。
实际上-g
命令是将模块包安装在“全局”的node_module
中,即 Node 可执行文件相同的路径下,并经过配置 bin 字段连接。
例如使用命令行查看 Node 可执行文件的位置:
$ which node /usr/local/bin/node
那么全局安装模块的实际位置就是/usr/local/lib/node_modules
(在 Finder 中用 command+shift+G 快捷键访问隐藏目录 )
进一步了解 NPM 的使用能够看 NPM DOCS,NPM更多命令 NPM CLI
继续加油哦永远十八岁的少女~