Node.js 依赖管理(一)—区分dependencies和devDependencies

原文连接:https://www.novenblog.xin/detail/?id=65css

本文拜读百度@小蘑菇哥哥Node.js 中的依赖管理正文从这里开始~node

nodejs 中总共有 5 种依赖:
webpack

 

  • 一、dependencies
  • 二、devDependencies (经常使用)
  • 三、peerDependencies (不太经常使用)
  • 四、bundledDependencies (我以前没用过)
  • 五、optionalDependencies (我以前没用过)

本文主要是记录dependencies和devDependencies相关用途与区别。web

首先是一张图, 简单表示二者的区别npm

 

dependencies - 开发及运行时均须要的依赖

安装方式json

npm install xxx -S 或 npm i xxx --save

i和install功能一致,此安装命令会将依赖项自动添加到package.json中的dependencies一项下。gulp

  • 若是直接只写一个包的名字,则安装当前 npm registry 中这个包的最新版本;
  • 若是要指定版本的,能够把版本号写在包名后面,例如 npm i webpack@3.0.0 —save。

注意:在npm 5.x 开始能够省略 —save,即若是执行 npm install xxx,npm 同样会把包的依赖添加到 package.json 中去。要关闭这个功能,可使用 npm config set save false。sass

 

devDependencies - 只在开发时须要的依赖服务器

顾名思义,也就是在线上运行环境下是不须要这些依赖的,好比webpack打包工具。babel

安装方式

npm install xxx -D 或 npm i xxx --save--dev

 

为何须要devDependencies?

最终目的是为了减小 node_modules 目录的大小以及 npm install 花费的时间。

由于不少没有理解dependencies和devDependencies区别的nodeJs使用者,在安装一个依赖项的时候,每每会选择不使用--save或-S,这样会致使dependencies依赖性太多,在开发过程当中影响不大,可是在部署到线上服务器后,由于线上生产环境只打包dependencies中的依赖,会因为dependencies致使项目依赖过多,项目文件过大,浪费服务器资源等一系列问题。

另一个问题是,npm 的依赖是嵌套的,因此可能看上去 package.json 中只有几个依赖,但实际上它又扩散到 N 个,而 N 个又扩散到 N 平方个,一层层扩散出去,可谓子子孙孙无穷尽也。若是可以尽可能减小不使用的依赖,那么就可以节省线上机器的硬盘资源,也能够节省部署上线的时间

 

在实际开发中,大概有这么几类能够归为开发依赖:

构建工具

如今比较热门的是 webpack 和 rollup,以往还有 grunt, gulp 等等。这些构建工具会生成生产环境的代码,以后在线上使用时就直接使用这些压缩过的代码。因此这类构建工具是属于开发依赖的。

像 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。这些都算做开发依赖。

在 babel 中还有一个注意点,那就是 babel-runtime 是 dependencies 而不是 devDependencies。具体分析我在以前的 babel 文章中提过,就再也不重复了。

测试工具

严格来讲,测试和开发并非一个过程。但它们同属于“线上状态不须要使用的依赖”,所以也就纳入开发依赖了。经常使用的如 chai, e2e, karma, coveralls 等等都在此列。

真的是开发才用的依赖包

最后一类比较杂,很难用一个大类囊括起来,总之就是开发时须要使用的,而实际上线时要么是已经打包成最终代码了,要么就是不须要使用了。好比 webpack-dev-server 支持开发热加载,线上是不用的;babel-register 由于性能缘由也不能用在线上。其余还可能和具体业务相关,就看各位开发者本身识别了。

 

下面是其余相关文章推荐:

相关文章
相关标签/搜索