00x0 写在前面
npm是JavaScript中的包管理工具,能解决NodeJS代码部署上的很多问题。通过npm安装的包在package.json文件下找到。经常进行前端开发的同学们应该可以发现,经过npm安装的包有的在devDependencies中,有的在dependencies中,这两者有什么区别呢?本文结合npm的安装命令来说明devDependencies和dependencies的区别。
00x1 npm install –save和npm install –save-dev
1.1 npm install –save命令
|
|
上面两条命令是等价的,都是在本地进行安装。执行以上命令后:
模块被安装到本地项目的中node_modules目录下。如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
模块依赖被写进dependencies 节点。
如果删除node_modules目录,使用npm install 初始化项目时,会将模块下载到项目目录(node_modules)下。
运行npm install –production或者注明NODE_ENV变量值为production时,会自动下载模块到node_modules目录中。
可以通过 require() 来引入本地安装的包。
1.2 dependencies
dependencies是线上环境需要使用的依赖,只要线上环境要用用到这个依赖 ,这个依赖就必须使用上面两条命令安装到dependencies中。像 express 这些模块是项目运行必备的,应该安装在 dependencies 节点下。
00x2 dependencies和devDependencies
2.1 npm install –save-dev
|
|
上面两条命令是等价的,也是在本地进行安装。执行以上命令之后:
模块安装到项目node_modules目录下。
模块依赖被写入devDependencies 节点。
如果删除node_modules目录,使用npm install 初始化项目时,会将模块下载到项目目录(node_modules)下。
运行npm install –production或者注明NODE_ENV变量值为production时,不会自动下载模块到node_modules目录中。
可以通过 require() 来引入本地安装的包。
2.2 devDependencies
devDependencies是开发中使用的依赖,区别于实际 的依赖。也就是说,在线上状态不需要使用的状态,就是开发状态。npm将其单独拆分出来,是为了减少 node_modules目录的大小以及npm install花费的时间。这是因为npm的 依赖是嵌套的,虽然在package.json中只有几个依赖,但实际上它又扩散到N个,而N个又被扩散到N平方个。如果能尽量减少不使用的依赖,那么就能节省线上机器 的硬盘资源,也可以节省部署上线的时间。
在实际开发中,大概有下面几类可以归为开发依赖。
- 构建工具
目前前端比较热门的构建工具是webpack,gulp,grunt等。这些构建工具会生成生产环境的代码,项目打包上线之后就直接使用压缩过的代码。这类构建工具是属于开发依赖的。
像 webpack 还分为代码方式使用( webpack
)和命令行方式使用 ( webpack-cli
),这些都是开发依赖。另外它们可能还会提供一些内置的常用插件,如 xxx-webpack-plugin
,这些也都算开发依赖。
- 预处理器
这里的预处理器指的是对源代码进行一定的处理,生成最终代码的工具。比较典型的有 CSS 中的 less, stylus, sass, scss 等等,以及 JS 中的 coffee-script, babel 等等。
它们的原理都是一致的。以 babel 为例,常用的有两种使用方式。其一是内嵌在 webpack 或者 rollup 等构件工具中,一般以 loader 或者 plugin 的形式出现,例如 babel-loader
。其二是单独使用(小项目较多),例如 babel-cli
。babel 还额外有自己的插件体系,例如 xxx-babel-plugin
。类似地,less 也有与之对应的 less-loader
和 lessc
。这些都算作开发依赖。
- 测试工具
测试工具也属于“线上状态不需要使用的依赖”,因此也归入开发依赖。常用的如 chai
, e2e
, karma
, coveralls
等等都在此列。
- 开发才用的依赖包
开发时需要使用的,而实际上线时要么是已经打包成最终代码,要么就是不需要使用了。比如 webpack-dev-server
支持开发热加载,线上是不用的; babel-register
因为性能原因也不能用在线上。压缩css、js的模块,在项目部署之后也不再使用。其他还可能和具体业务相关,需要开发者自己识别。
如果想达成刚才说的缩减安装包的目的,可以使用命令 npm i--production
忽略开发依赖,只安装依赖,这通常在线上机器(或者 QA 环境)上使用。
00x3 npm install和npm install -g
3.1 npm install
npm也可以用于在本地安装模块,执行这条命令:
模块安装到项目node_modules目录下。
模块依赖不会写入devDependencies或dependencies 节点。
如果删除node_modules目录,使用npm install 初始化项目时,运行 npm install 初始化项目时不会下载模块。
3.2 npm install -g
npm install -g命令用于在全局安装模块,执行命令之后:
模块安装到全局,不会在项目node_modules目录中保存模块包。
模块依赖不会写入devDependencies或dependencies 节点。
如果删除node_modules目录,使用npm install 初始化项目时,运行 npm install 初始化项目时不会下载模块。