原文连接:https://www.novenblog.xin/detail/?id=65css
本文拜读百度@小蘑菇哥哥的Node.js 中的依赖管理,正文从这里开始~node
nodejs 中总共有 5 种依赖:
webpack
本文主要是记录dependencies和devDependencies相关用途与区别。web
首先是一张图, 简单表示二者的区别npm
安装方式json
npm install xxx -S 或 npm i xxx --save
i和install功能一致,此安装命令会将依赖项自动添加到package.json中的dependencies一项下。gulp
注意:在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 由于性能缘由也不能用在线上。其余还可能和具体业务相关,就看各位开发者本身识别了。
下面是其余相关文章推荐: