前端构建工具比较

在一些简单的项目中我们仍有能力把所有JS依赖联系起来,但越来越复杂复杂的JS依赖很可能会成为困扰着我们。而且单页面应用( single-page applications, SPA, 单页面应用简介)依赖 many hefty libraries 。所以前辈们发明出了很多的构建工具,这些工具能够让我们方便的按需加载依赖,Webpack 就提供了很多这样的策略。而现在很流行的Node和他的包管理器npm让我们能更舒服的管理依赖。还有很多工具可以自动化地进行代码的语法检查、压缩等等。

Task Runners

历史上有很多的构建工具,其中 Make 或许是最出名的,到现在还是一种切实可行的选择。而 Grunt 和 Gulp 作为专业的 Task Runner 是在特别考虑到JS开发人员的情况下创建的。
通过NPM提供的插件使 Task Runner 既强大又可扩展。甚至可以使用npm script作为Task Runner,这在Webpack中尤其常见。
从名字上可以看出 Task Runner 就是运行一个一个的任务,这些任务可以是检查语法、编译、压缩等等。

Make

Make首次发布于1977年,主要用于C语言项目,但它与C语言没有任何联系。同样可以用于网页的构建工具,使用 Make 构建网站—阮一峰 这篇文章简单介绍了 Make 命令和使用方法,作者还分享了为什么构建大型项目首选 Make ,而不是 npm script、Grunt 或 Gulp。

npm scripts as a Task Runner

尽管npm CLI的主要设计目的不是用作 Task Runner,但由于package.json脚本字段的缘故,它的工作方式也是如此。请考虑下面的示例:

"scripts": {
  "start": "webpack-dev-server --env development",
  "build": "webpack --env production",
  "build:stats": "webpack --env production --json > stats.json"
},

这些脚本可以使用npm run列出,然后使用npm run <script>执行。你还可以使用类似test:watch的约定为脚本命名。 !!#ff0000 这种方法的问题在于它要注意保持跨平台。!!

(您可能希望使用诸如 rimraf [ 以包的形式包装rm -rf命令 ] 等实用程序,而不是rm-rf。这里可以调用其他Task Runner来隐藏您实际使用的那一个。通过这种方式,您可以重构工具,同时保持接口不变。)

Grunt

这是前端开发人员的第一个有名的 Task Runner。采用了插件架构,配置复杂,难以理解。

sample:

module.exports = grunt => {
  grunt.initConfig({
    lint: {
      files: ["Gruntfile.js", "src/**/*.js", "test/**/*.js"],
      options: {
        globals: {
          jQuery: true,
        },
      },
    },
    watch: {
      files: ["<%= lint.files %>"],
      tasks: ["lint"],
    },
  });

  grunt.loadNpmTasks("grunt-contrib-jshint");
  grunt.loadNpmTasks("grunt-contrib-watch");

  grunt.registerTask("default", ["lint"]);
};

grunt-webpack plugin allows you to use webpack in a Grunt environment while you leave the heavy lifting to webpack.

Gulp

Gulp采取了不同的方法。不是依赖每个插件的配置,而是处理实际的代码。

sample:

const gulp = require("gulp");
const coffee = require("gulp-coffee");
const concat = require("gulp-concat");
const uglify = require("gulp-uglify");
const sourcemaps = require("gulp-sourcemaps");
const del = require("del");

const paths = {
  scripts: ["client/js/**/*.coffee", "!client/external/**/*.coffee"],
};

// Not all tasks need to use streams.
// A gulpfile is another node program
// and you can use all packages available on npm.
gulp.task("clean", () => del(["build"]));
gulp.task("scripts", ["clean"], () =>
  // Minify and copy all JavaScript (except vendor scripts)
  // with source maps all the way down.
  gulp
    .src(paths.scripts)
    // Pipeline within pipeline
    .pipe(sourcemaps.init())
    .pipe(coffee())
    .pipe(uglify())
    .pipe(concat("all.min.js"))
    .pipe(sourcemaps.write())
    .pipe(gulp.dest("build/js"))
);
gulp.task("watch", () => gulp.watch(paths.scripts, ["scripts"]));

// The default task (called when you run `gulp` from CLI).
gulp.task("default", ["watch", "scripts"]);

配置就是处理的代码,因此遇到问题时你可以随时 hack 。可以 wrap 已有的 Node 包作为 Gulp 的插件,相较于Grunt来说你能更加清楚看到发生了什么。但是你还是需要为一些临时任务编写大量的样本文件,That is where newer approaches come in。

webpack-stream allows you to use webpack in a Gulp environment.

模块化运行时编译方案

代表是Require.js/sea.js,在 前端模块化 中已经讨论过,使用预编译会优于运行时编译。

模块化预编译方案

代表是Browserify/Webpack,和Task Runners 不同的是他们是模块化方案,而Gulp/Grunt是工具,webpack 因为loader和plugin这一配置项让他可以完成一些Gulp/Grunt的工作(虽然完成的工作有重复,但本质上他们是不同的)。Gulp/Grunt完全可以同webpack结合使用。
Browserify和Webpack相比较的话各有利弊。

总结

前端需要规范代码组织,实现模块化,所以出现了诸如webpack之类的模块化编译方案。前端需要在部署上线的时候进行检查压缩合并转换,所以出现了诸如Gulp之类的专业构建工具。而使用他们这一切都会是自动进行的。

不同的技术从不同的角度去解决问题,我们有时候可以一起使用他们。

注:在查阅资料过程中还发现了很多工具,如jspm,SystemJS、Brunch、Parcel、FIS

参考链接:Comparison of Build Tools

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

推荐阅读更多精彩内容