1.3 常见的构建工具及其优缺点

1.3 常见的构建工具及其优缺点

问题一:你了解的构建工具有哪些,各自有什么优缺点?

1. Npm Script

Npm Script是一个任务执行者。Npm 是在安装 Node.js 时附带的包管理器,Npm Script 则是 Npm 内置的一个功能,允许在package.json文件里面使用scripts字段定义任务:

{"scripts":{"dev":"node dev.js","pub":"node build.js"}}

里面的scripts字段是一个对象,每个属性对应一段 Shell 脚本,以上代码定义了两个任务dev和pub。 其底层实现原理是通过调用 Shell 去运行脚本命令,例如执行npm run pub命令等同于执行命令node build.js。

Npm Script的优点是内置,无须安装其他依赖。

Npm Script的缺点是功能太简单,虽然提供了pre和post两个钩子,但不能方便地管理多个任务之间的依赖。

2. Grunt

Grunt和 Npm Script 类似,也是一个任务执行者。Grunt 有大量现成的插件封装了常见的任务,也能管理任务之间的依赖关系,自动化执行依赖的任务,每个任务的具体执行代码和依赖关系写在配置文件Gruntfile.js里,例如:

module.exports=function(grunt){// 所有插件的配置信息grunt.initConfig({// uglify 插件的配置信息uglify:{app_task:{files:{'build/app.min.js':['lib/index.js','lib/test.js']}}},// watch 插件的配置信息watch:{another:{files:['lib/*.js'],}}});// 告诉 grunt 我们将使用这些插件grunt.loadNpmTasks('grunt-contrib-uglify');grunt.loadNpmTasks('grunt-contrib-watch');//告诉grunt当我们在终端中启动 grunt 时需要执行哪些任务  grunt.registerTask('dev',['uglify','watch']);};

在项目根目录下执行命令grunt dev就会启动 JavaScript 文件压缩和自动刷新功能。

Grunt的优点是:

灵活,它只负责执行你定义的任务;

大量的可复用插件封装好了常见的构建任务。

Grunt的缺点是集成度不高,要写很多配置后才可以用,无法做到开箱即用。

Grunt 相当于进化版的 Npm Script,它的诞生其实是为了弥补 Npm Script 的不足。

3. Gulp

Gulp是一个基于流的自动化构建工具。 除了可以管理和执行任务,还支持监听文件、读写文件。Gulp 被设计得非常简单,只通过下面5个方法就可以胜任几乎所有构建场景:

通过gulp.task注册一个任务;

通过gulp.run执行任务;

通过gulp.watch监听文件变化;

通过gulp.src读取文件;

通过gulp.dest写文件。

Gulp 的最大特点是引入了流的概念,同时提供了一系列常用的插件去处理流,流可以在插件之间传递,大致使用如下:

// 引入 Gulpvar gulp=require('gulp');// 引入插件var jshint=require('gulp-jshint');var sass=require('gulp-sass');var concat=require('gulp-concat');var uglify=require('gulp-uglify');// 编译 SCSS 任务gulp.task('sass',function(){// 读取文件通过管道喂给插件gulp.src('./scss/*.scss')// SCSS 插件把 scss 文件编译成 CSS 文件.pipe(sass())//输出文件.pipe(gulp.dest('./css'));});//合并压缩 JSgulp.task('scripts',function(){gulp.src('./js/*.js').pipe(concat('all.js')).pipe(uglify()).pipe(gulp.dest('./dist'));});// 监听文件变化gulp.task('watch',function(){//当 scss 文件被编辑时执行 SCSS 任务  gulp.watch('./scss/*.scss',['sass']);gulp.watch('./js/*.js',['scripts']);});

Gulp 的优点是好用又不失灵活,既可以单独完成构建也可以和其它工具搭配使用。

Gulp 的缺点是和 Grunt 类似,集成度不高,要写很多配置后才可以用,无法做到开箱即用。

可以将Gulp 看作 Grunt 的加强版。相对于 Grunt,Gulp增加了监听文件、读写文件、流式处理的功能。

4. Fis3

Fis3是一个来自百度的优秀国产构建工具。相对于 Grunt、Gulp 这些只提供基本功能的工具,Fis3 集成了 Web 开发中的常用构建功能,如下所述。

读写文件:通过fis.match读文件,release配置文件输出路径。

资源定位:解析文件之间的依赖关系和文件位置。

文件指纹:通过useHash配置输出文件时给文件 URL 加上 md5 戳来优化浏览器缓存。

文件编译:通过parser配置文件解析器做文件转换,例如把 ES6 编译成 ES5。

压缩资源:通过optimizer配置代码压缩方法。

图片合并:通过spriter配置合并 CSS 里导入的图片到一个文件来减少 HTTP 请求数。

大致使用如下:

// 加 md5fis.match('*.{js,css,png}',{useHash:true});// fis3-parser-typescript 插件把 TypeScript 文件转换成 JavaScript 文件fis.match('*.ts',{parser:fis.plugin('typescript')});// 对 CSS 进行雪碧图合并fis.match('*.css',{// 给匹配到的文件分配属性 `useSprite`useSprite:true});// 压缩 JavaScriptfis.match('*.js',{optimizer:fis.plugin('uglify-js')});// 压缩 CSSfis.match('*.css',{optimizer:fis.plugin('clean-css')});// 压缩图片fis.match('*.png',{optimizer:fis.plugin('png-compressor')});

可以看出 Fis3 很强大,内置了许多功能,无须做太多配置就能完成大量工作。

Fis3的优点是集成了各种 Web 开发所需的构建功能,配置简单开箱即用。

Fis3的缺点是目前官方已经不再更新和维护,不支持最新版本的 Node.js。

Fis3 是一种专注于 Web 开发的完整解决方案,如果将 Grunt、Gulp 比作汽车的发动机,则可以将Fis3 比作一辆完整的汽车。

5. Webpack

Webpack是一个打包模块化 JavaScript 的工具,在 Webpack 里一切文件皆模块,通过 Loader 转换文件,通过 Plugin 注入钩子,最后输出由多个模块组合成的文件。Webpack 专注于构建模块化项目。

其官网的首页图很形象的画出了 Webpack 是什么,如下:

一切文件:JavaScript、CSS、SCSS、图片、模板,在 Webpack 眼中都是一个个模块,这样的好处是能清晰的描述出各个模块之间的依赖关系,以方便 Webpack 对模块进行组合和打包。 经过 Webpack 的处理,最终会输出浏览器能使用的静态资源。

Webpack 具有很大的灵活性,能配置如何处理文件,大致使用如下:

module.exports={// 所有模块的入口,Webpack 从入口开始递归解析出所有依赖的模块entry:'./app.js',output:{// 把入口所依赖的所有模块打包成一个文件 bundle.js 输出 filename:'bundle.js'}}

Webpack的优点是

专注于处理模块化的项目,能做到开箱即用一步到位;

通过 Plugin 扩展,完整好用又不失灵活;

使用场景不仅限于 Web 开发;

社区庞大活跃,经常引入紧跟时代发展的新特性,能为大多数场景找到已有的开源扩展;

良好的开发体验。

Webpack的缺点是只能用于采用模块化开发的项目。

Rollup

Rollup是一个和 Webpack 很类似但专注于 ES6 的模块打包工具。 Rollup 的亮点在于能针对 ES6 源码进行 Tree Shaking 以去除那些已被定义但没被使用的代码,以及 Scope Hoisting 以减小输出文件大小提升运行性能。 然而 Rollup 的这些亮点随后就被 Webpack 模仿和实现。 由于 Rollup 的使用和 Webpack 差不多,这里就不详细介绍如何使用了,而是详细说明它们的差别:

Rollup 是在 Webpack 流行后出现的替代品;

Rollup 生态链还不完善,体验不如 Webpack;

Rollup 功能不如 Webpack 完善,但其配置和使用更加简单;

Rollup 不支持 Code Spliting,但好处是打包出来的代码中没有 Webpack 那段模块的加载、执行和缓存的代码。

Rollup 在用于打包 JavaScript 库时比 Webpack 更加有优势,因为其打包出来的代码更小更快。 但功能不够完善,很多场景都找不到现成的解决方案。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 228,936评论 6 535
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,744评论 3 421
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 176,879评论 0 381
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,181评论 1 315
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,935评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,325评论 1 324
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,384评论 3 443
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,534评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,084评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,892评论 3 356
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,067评论 1 371
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,623评论 5 362
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,322评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,735评论 0 27
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,990评论 1 289
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,800评论 3 395
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,084评论 2 375

推荐阅读更多精彩内容