关于npm install --save和npm install --save-dev的总结

npm

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命令

1
2
3
npm install --save
npm install -S

     上面两条命令是等价的,都是在本地进行安装。执行以上命令后:

  1. 模块被安装到本地项目的中node_modules目录下。如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。

  2. 模块依赖被写进dependencies 节点。

  3. 如果删除node_modules目录,使用npm install 初始化项目时,会将模块下载到项目目录(node_modules)下。

  4. 运行npm install –production或者注明NODE_ENV变量值为production时,会自动下载模块到node_modules目录中。

  5. 可以通过 require() 来引入本地安装的包。

1.2 dependencies

     dependencies是线上环境需要使用的依赖,只要线上环境要用用到这个依赖 ,这个依赖就必须使用上面两条命令安装到dependencies中。像 express 这些模块是项目运行必备的,应该安装在 dependencies 节点下。

00x2 dependencies和devDependencies

2.1 npm install –save-dev

1
2
npm install --save-dev
npm install -D

     上面两条命令是等价的,也是在本地进行安装。执行以上命令之后:

  1. 模块安装到项目node_modules目录下。

  2. 模块依赖被写入devDependencies 节点。

  3. 如果删除node_modules目录,使用npm install 初始化项目时,会将模块下载到项目目录(node_modules)下。

  4. 运行npm install –production或者注明NODE_ENV变量值为production时,不会自动下载模块到node_modules目录中。

  5. 可以通过 require() 来引入本地安装的包。

2.2 devDependencies

   devDependencies是开发中使用的依赖,区别于实际 的依赖。也就是说,在线上状态不需要使用的状态,就是开发状态。npm将其单独拆分出来,是为了减少 node_modules目录的大小以及npm install花费的时间。这是因为npm的 依赖是嵌套的,虽然在package.json中只有几个依赖,但实际上它又扩散到N个,而N个又被扩散到N平方个。如果能尽量减少不使用的依赖,那么就能节省线上机器 的硬盘资源,也可以节省部署上线的时间。

  在实际开发中,大概有下面几类可以归为开发依赖。

  1. 构建工具

    目前前端比较热门的构建工具是webpack,gulp,grunt等。这些构建工具会生成生产环境的代码,项目打包上线之后就直接使用压缩过的代码。这类构建工具是属于开发依赖的。

   像 webpack 还分为代码方式使用( webpack)和命令行方式使用 ( webpack-cli),这些都是开发依赖。另外它们可能还会提供一些内置的常用插件,如 xxx-webpack-plugin,这些也都算开发依赖。

  1. 预处理器

  这里的预处理器指的是对源代码进行一定的处理,生成最终代码的工具。比较典型的有 CSS 中的 less, stylus, sass, scss 等等,以及 JS 中的 coffee-script, babel 等等。

  它们的原理都是一致的。以 babel 为例,常用的有两种使用方式。其一是内嵌在 webpack 或者 rollup 等构件工具中,一般以 loader 或者 plugin 的形式出现,例如 babel-loader。其二是单独使用(小项目较多),例如 babel-cli。babel 还额外有自己的插件体系,例如 xxx-babel-plugin。类似地,less 也有与之对应的 less-loaderlessc。这些都算作开发依赖。

  1. 测试工具

  测试工具也属于“线上状态不需要使用的依赖”,因此也归入开发依赖。常用的如 chai, e2e, karma, coveralls 等等都在此列。

  1. 开发才用的依赖包

  开发时需要使用的,而实际上线时要么是已经打包成最终代码,要么就是不需要使用了。比如 webpack-dev-server 支持开发热加载,线上是不用的; babel-register 因为性能原因也不能用在线上。压缩css、js的模块,在项目部署之后也不再使用。其他还可能和具体业务相关,需要开发者自己识别。

  如果想达成刚才说的缩减安装包的目的,可以使用命令 npm i--production 忽略开发依赖,只安装依赖,这通常在线上机器(或者 QA 环境)上使用。

00x3 npm install和npm install -g

3.1 npm install

  npm也可以用于在本地安装模块,执行这条命令:

  1. 模块安装到项目node_modules目录下。

  2. 模块依赖不会写入devDependencies或dependencies 节点。

  3. 如果删除node_modules目录,使用npm install 初始化项目时,运行 npm install 初始化项目时不会下载模块。

3.2 npm install -g

  npm install -g命令用于在全局安装模块,执行命令之后:

  1. 模块安装到全局,不会在项目node_modules目录中保存模块包。

  2. 模块依赖不会写入devDependencies或dependencies 节点。

  3. 如果删除node_modules目录,使用npm install 初始化项目时,运行 npm install 初始化项目时不会下载模块。

Miss Me wechat
light