(翻译)前端构建工具的可比。(翻译)前端构建工具的比较。

有多种策略来加载它们,有多种策略来加载它们

原文地址:https://survivejs.com/webpack/appendices/comparison/

初稿地址:https://survivejs.com/webpack/appendices/comparison/

当原先,是好将你的剧本写于共。
时代曾变更,现在将JavaScript代码分开来或者是一个犬牙交错的劳作。
随着单页应用程序(SPA)的起来,这个题材已经升任。他们支持于依靠一些卓有成效的系(来解决之题目)。

 

由这缘故,有多种国策来加载它们。您可以立即加载它们,或者考虑要她常加载。Webpack支持多这样的方针。

当此前,是好以你的台本写于一块儿。
时代已经改变,现在将JavaScript代码分开来或许是一个扑朔迷离的干活。
随着单页应用程序(SPA)的勃兴,这个题目都升任。他们支持被依靠一些可行之系(来化解之题目)。

Node和npm的风行,给其的保管理器提供了重多之用环境。在npm推广之前,很不便使依赖项。有一段时间,人们开发出了前者特定的包管理器,但npm最终赢得了凯。现在乘管理于原先又易于了,尽管还需克服一些挑战。

由于此原因,有多策来加载它们。您可就加载它们,或者考虑要它经常加载。Webpack支持广大这么的国策。

任务运行程序与包装

历史上,已经闹不少构建工具。
Make可能是不过着名之,它依旧是一个得力之取舍。
专门的天职运行程序,如Grunt和Gulp,是特别为JavaScript开发人员创建的。
通过npm提供的插件使得任务运行程序都强而只是扩大。
甚至可采取npm脚本作为天职运行程序。 这生常见,特别是webpack。

任务运行程序是强水准的宏伟工具。 它们允许你为过平台方式实施操作。
当您需要以各种资源拼接在协同并生育时,问题即见面开。
出于这原因,存在资源整合程序,如Browserify,Brunch或webpack。

来一段时间,RequireJS深受欢迎。
它的核心是供一个异步模块的方式并确立在这个之上。
AMD的格式在末端将会见时有发生再详细的介绍。
幸运的是,这些专业已经遇到了,而且RequireJS似乎是一个深好之迪。

Node和npm的盛行,给其的保管管理器提供了双重多的用环境。在npm推广之前,很不便用依赖项。有一段时间,人们开发出了前者特定的管教管理器,但npm最终收获了赢。现在凭借管理于原先更易于了,尽管还待克服一些挑战。

Make

即如1977年初发表的那样,Make归来了。尽管其是一个原来工具,但它还是息息相关的。
Make允许而吗各种目的编写单独的天职。
例如,您可有两样之职责来创造生产构建,压缩JavaScript或运行测试。
您可以过剩其他工具被找到同样之法子。

尽管Make主要用来C项目,但她并无因为另外方法和C绑定。 James
Coglan详细座谈了争使在JavaScript中使用Mark。
看一下底下的詹姆斯帖子里介绍的抽代码的方式:

Makefile

PATH  := node_modules/.bin:$(PATH)
SHELL := /bin/bash

source_files := $(wildcard lib/*.coffee)
build_files  := $(source_files:%.coffee=build/%.js)
app_bundle   := build/app.js
spec_coffee  := $(wildcard spec/*.coffee)
spec_js      := $(spec_coffee:%.coffee=build/%.js)

libraries    := vendor/jquery.js

.PHONY: all clean test

all: $(app_bundle)

build/%.js: %.coffee
    coffee -co $(dir $@) $<

$(app_bundle): $(libraries) $(build_files)
    uglifyjs -cmo $@ $^

test: $(app_bundle) $(spec_js)
    phantomjs phantom.js

clean:
    rm -rf build

使用Make,您可行使Make-specific语法和顶峰命令为您的天职建模,使其可以同webpack集成。

 

RequireJS

RequireJS也许是率先只变为真正让欢迎的本子加载程序。
它首先是地引入了模块化JavaScript。 其最特别的吸引力是AMD。
它引入了一个概念包装器:

define(['./MyModule.js'], function (MyModule) {
  return function() {}; // 模块入口
});

// 或者
define(['./MyModule.js'], function (MyModule) {
  return {
    hello: function() {...}, // 导出为模块函数
  };
});

顺手说一下,可以以包装器中动用require:

define(['require'], function (require) {
  var MyModule = require('./MyModule.js');

  return function() {...};
});

继一致种植方式更简短一点。 但您还是会逢多余的代码。
ES6等专业解决了之题材。

顾:Jamund
Ferguson撰写了扳平篇关于怎样从RequireJS移植到webpack的良好博客系列。

任务运行程序与包装

npm脚本作为自动化构建工具

不畏npm
CLI(命令行界面)并非要用来作为任务运行的程序,由于生package.json的下面论字段是之成为可能。
考虑下的例子:

package.json

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

这些本子可以使npm run列出,然后使npm run <script>执行。
您还得使用诸如test:watch这样的预定命名空间。
这种方式可以假设它们保持跨平台。

取代使用rm -rf,您或许重新愿意下诸如rimraf等实用程序。
在这里可以调用其他自动化构建工具来掩藏而在利用的求实细节。
这样,您可于保障界面相同的气象下下重构工具。

历史上,已经发为数不少构建工具。
Make可能是最好着名的,它依然是一个实用的抉择。
专门的职责运行程序,如Grunt和Gulp,是特别为JavaScript开发人员创建的。
通过npm提供的插件使得任务运行程序都强大而只是扩大。
甚至足以行使npm脚本作为天职运行程序。 这十分广泛,特别是webpack。

Grunt

Grunt在前端开发人员受到凡是极让欢迎之。它的插件架构有助于其的兴,插件本身便是复杂的,因此,当配置增加时,很麻烦了解到底出了啊。

以下是Grunt文档的言传身教。
在是布局中,您定义一个linting和一个观察任务。
当watch任务运行时,它为会见触发lint任务。
这样,当您运行Grunt时,您可以于编写源代码时当顶峰中实时发出警示。

Gruntfile.js

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有因此底一个最主要组成部分是她隐藏了大量的细节。

于多来说,这或会见来问题。从Grunt的构建过程,你特别麻烦掌握她引擎工作之具体情况。

注意:grunt-webpack插件允许你在Grunt环境遭受以webpack,同时用动用阶段提升及Webpack。

职责运行程序是强品位的英雄工具。 它们允许你为过平台方式实施操作。
当您得将各种资源拼接在联名并生育时,问题不怕见面开始。
出于这原因,存在资源整合程序,如Browserify,Brunch或webpack。

Gulp

Gulp采取两样之法门。
您不欲依靠每个插件的布局,而是处理实际的代码。
Gulp建立于管道概念之上。 如果您熟悉Unix,这里吧是一样的。
您要依照以下概念:

  • 来源匹配文件。
  • 针对来执行操作的过滤器(例如,转换为JavaScript)
  • 接过模块库(例如,您的构建目录)在哪里管理构建结果。

随即是一个示范的Gulpfile,可以给您还好地打听从品种的README中得之法门。
它叫缩写为一个接口:

Gulpfile.js

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']
};

// 并不是所有的任务都需要使用流
// 一个gulpfile是另一个节点程序
// 你也可以在npm上使用所有的软件包
gulp.task(
  'clean',
  del.bind(null, ['build']
);

gulp.task(
  'scripts',
  ['clean'],
  () => (
    // 压缩和复制所有的JavaScript(除了供应商脚本)
    // 源代码一路下来
    gulp.src(paths.scripts)
      // 管道内
      .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.bind(null, paths.scripts, ['scripts'])
);

// 默认任务(从CLI运行`gulp`时调用)
gulp.task(
  'default',
  ['watch', 'scripts']
);

是因为配置是代码,如果遇上麻烦,您总是可以拿该去。
您可将现有的节点包作为Gulp插件,等等。
与Grunt相比,您得重清楚地了解有了呀。
尽管如此,你还最终写了过多模板作为闲时任务。 那就是是创新的办法。

注意:webpack-stream兴你于Gulp环境受到采取webpack。

注意:Fly凡是和Gulp类似之家伙。
它依靠让ES6发生器。

产生一段时间,RequireJS酷为欢迎。
它的骨干是提供一个异步模块的艺术并确立在此之上。
AMD的格式在背后将会见发双重详实的牵线。
幸运的凡,这些规范既遇到了,而且RequireJS似乎是一个老大好的启发。

Browserify

拍卖JavaScript模块一直是一个问题。 js语言本身并未模块的定义,直到ES6。
Ergo,这个语言在90年间为用当浏览器环境被。
已经提出了连AMD在内的各种解决方案。

Browserify大凡模块问题之一个化解方案。
它可以CommonJS模块捆绑于共同。
您可以用那同Gulp挂钩,您得找到较小之变换工具,使您可超越基本用法。
例如,watchify提供了一个每当开空闲之做事中为而创建捆绑包的文本监视器。

Browserify生态系统由多有些模块组成。 这样,Browserify就适合Unix的观。
Browserify比webpack更便于使,实际上它们是一个万分好之替代品。

注意:Splittable举凡一个Browserify包装器,允许代码分割,支持ES6开始箱即用,Tree
shaking等等。

 

JSPM

使用JSPM跟原先的家伙截然不同。
它附带了一个融洽的命令行工具,用于将新的软件包安装及项目中,创建一个生产包,等等。
它支持SystemJS插件,可以将各种格式加载到项目被。

Make

Brunch

与Gulp相比,Brunch于重强层次之架空上运行。
它采用类于webpack的声明方法。
以示范为例,您可以设想由Brunch网站改编以下配置:

module.exports = {
  files: {
    javascripts: {
      joinTo: {
        'vendor.js': /^(?!app)/,
        'app.js': /^app/,
      },
    },
    stylesheets: {
      joinTo: 'app.css',
    },
  },
  plugins: {
    babel: {
      presets: ['es2015', 'react'],
    },
    postcss: {
      processors: [require('autoprefixer')],
    },
  },
};

Brunch包括像brunch new, brunch watch –server, and brunch build
–production。 它含有了广大创造性的职能,可以运用插件扩展。

瞩目:Brunch有一个试验性的热模块重新加载程序。

尽管比如1977年首发表之那样,Make回去了。尽管它们是一个本来工具,但它还是是不无关系的。
Make允许你吗各种目的编写单独的任务。
例如,您可来不同之职责来创造生产构建,压缩JavaScript或运行测试。
您可以群其他工具被找到同样之主意。

Webpack

公可说Webpack动比Browserify更单一的法。
Browserify由多独稍器组成,而Webpack提供了一个骨干,它提供了许多创造性的功用。

Webpack核心可以应用一定的加载程序及插件进行扩张。
它好控制什么化解模块,使您可调动你的构建以相当特定情景跟缓解无法正常运作的软件包。

与另外工具相比,Webpack有初始复杂性,但通过该周边的功用并可以弥补这或多或少。
这是一个急需耐心的高等级工具。
但是要是了解了偷的基本思路,webpack就换得挺强劲。

尽管Make主要用来C项目,但其并无为另外方法跟C绑定。 James
Coglan详细讨论了什么运用以JavaScript中采取Mark。
看一下下面的詹姆斯帖子里介绍的抽代码的主意:

旁选择

公可以找到更多替代品,如下所列:

  • pundle鼓吹自己看成下一样代表包工具,并特别注意其特性。
  • Rollup重中之重关注打包es6的代码。Tree
    shaking是该卖点之一。您可以下Rollup与webpack的加载程序rollup-loader。
  • AssetGraph使完全不同之主意,建立于HTML语义之上,使其变为超链接分析或组织分析的佳选择。webpack-assetgraph-plugin拿webpack和AssetGraph结合在一起。
  • FuseBox凡一个专注于快的包装工具。
    它采取零配置方式,旨在开箱即用。
  • StealJS凡一个依加载器,一个小心于性能和易用性的构建工具。
  • Flipbox用大半只扎打包在一个统一之界面后面。

Makefile

结语

历史及早已生成千上万JavaScript的构建工具。
每个人且计较以相好的法子化解一个一定的问题。
这些规范既开始迎头撞,基本语义的求吗再也不见了。
相反,工具得以于重新胜层次上竞争,并推再好的用户体验。
通常,您得齐行使几独独立的解决方案。

总的看:

  • 自动化构建工具与打包工具解决不同的问题。
    您可以透过双方实现类似的结果,但常见最好以它一起利用来互补充。
  • 正如早的工具(如Make或RequireJS)仍然有影响力,即使其当前端开发中不如以往那么让欢迎。
  • Bundinner如Browserify或webpack解决了一个至关重要之问题,并拉你管理复杂的Web应用程序。
  • 有的新生技术由不同之角度解决问题。
    有时候它成立于外工具之上,有时她可一并下。

本博客备份

PATH  := node_modules/.bin:$(PATH)
SHELL := /bin/bash

source_files := $(wildcard lib/*.coffee)
build_files  := $(source_files:%.coffee=build/%.js)
app_bundle   := build/app.js
spec_coffee  := $(wildcard spec/*.coffee)
spec_js      := $(spec_coffee:%.coffee=build/%.js)

libraries    := vendor/jquery.js

.PHONY: all clean test

all: $(app_bundle)

build/%.js: %.coffee
    coffee -co $(dir $@) $<

$(app_bundle): $(libraries) $(build_files)
    uglifyjs -cmo $@ $^

test: $(app_bundle) $(spec_js)
    phantomjs phantom.js

clean:
    rm -rf build

运Make,您得用Make-specific语法和终极命令为而的职责建模,使该得以同webpack集成。

 

RequireJS

RequireJS唯恐是首先单变成真正被欢迎之台本加载程序。
它首先是地引入了模块化JavaScript。 其尽充分之吸引力是AMD。
它引入了一个定义包装器:

define(['./MyModule.js'], function (MyModule) {
  return function() {}; // 模块入口
});

// 或者
define(['./MyModule.js'], function (MyModule) {
  return {
    hello: function() {...}, // 导出为模块函数
  };
});

附带说一下,可以当包装器中动用require:

define(['require'], function (require) {
  var MyModule = require('./MyModule.js');

  return function() {...};
});

 后一致栽方法更简单一点。 但您还是会遇见多余的代码。
ES6等标准解决了这个问题。

瞩目:Jamund
Ferguson撰写了相同首关于怎样自RequireJS移植到webpack的漂亮博客系列。

 

npm脚本作为自动化构建工具

即使npm
CLI(命令行界面)并非要用以作为任务运行的程序,由于有package.json的下论字段是之变成可能。
考虑下的例证:

package.json

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

这些本子可以下npm run列出,然后运npm run <script>执行。
您还可使用诸如test:watch这样的预定命名空间。
这种方法可使其保持跨平台。

替使用rm -rf,您可能再度想利用诸如rimraf等实用程序。
在这里可以调用其他自动化构建工具来藏而正在用的切实可行细节。
这样,您可以于保界面相同的状下以重构工具。

 

Grunt

lovebet爱博 1

 

Grunt当前端开发人员遭遇凡不过让欢迎的。它的插件架构有助于其的风靡,插件本身便是复杂的,因此,当配置增加时,很为难理解到底发生了哟。

以下是Grunt文档的演示。
在这个安排中,您定义一个linting和一个相任务。
当watch任务运行时,它吧会见触发lint任务。
这样,当你运行Grunt时,您得于编写源代码时当巅峰中实时发出警告。

Gruntfile.js

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有因此之一个第一片段是它们隐藏了汪洋底细节。

自从多来说,这也许会见生出问题。从Grunt的构建过程,你特别不便了解它引擎工作的具体情况。

注意:grunt-webpack插件允许你当Grunt环境被利用webpack,同时以运阶段提升到Webpack。

 

Gulp

lovebet爱博 2

Gulp用不同的章程。
您不待负每个插件的配置,而是处理实际的代码。
Gulp建立在管道概念之上。 如果你熟悉Unix,这里为是均等的。
您得按照以下概念:

  • 根源匹配文件。
  • 对来执行操作的过滤器(例如,转换为JavaScript)
  •  接收模块库(例如,您的构建目录)在哪管理构建结果。

即是一个演示的Gulpfile,可以被你更好地打听从品类之README中获取之章程。
它给缩写为一个接口:

Gulpfile.js

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']
};

// 并不是所有的任务都需要使用流
// 一个gulpfile是另一个节点程序
// 你也可以在npm上使用所有的软件包
gulp.task(
  'clean',
  del.bind(null, ['build']
);

gulp.task(
  'scripts',
  ['clean'],
  () => (
    // 压缩和复制所有的JavaScript(除了供应商脚本)
    // 源代码一路下来
    gulp.src(paths.scripts)
      // 管道内
      .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.bind(null, paths.scripts, ['scripts'])
);

// 默认任务(从CLI运行`gulp`时调用)
gulp.task(
  'default',
  ['watch', 'scripts']
);

由于配置是代码,如果遇到麻烦,您总是好将该删除。
您得以长存的节点包作为Gulp插件,等等。
与Grunt相比,您可以更了解地了解有了呀。
尽管如此,你还是最终写了重重模板作为闲时任务。 那就是创新的点子。

注意:webpack-stream许你当Gulp环境遭到行使webpack。

注意:Fly凡同Gulp类似的家伙。
它借助让ES6发生器。

 

 

Browserify

lovebet爱博 3

处理JavaScript模块一直是一个题目。 js语言本身没有模块的概念,直到ES6。
Ergo,这个语言在90年代被用在浏览器环境受到。
已经提出了连AMD在内的各种解决方案。

Browserify是模块问题的一个解决方案。
它好用CommonJS模块捆绑于一块儿。
您可拿其和Gulp挂钩,您可以找到较小之变工具,使你得超越基本用法。
例如,watchify提供了一个以开空闲的工作中间也您创建捆绑包的公文监视器。

Browserify生态系统由许多小模块组合。 这样,Browserify就可Unix的视角。
Browserify比webpack更便于采取,实际上它是一个老好之替代品。

注意:Splittable是一个Browserify包装器,允许代码分割,支持ES6上马箱即用,Tree
shaking等等。

 

JSPM

lovebet爱博 4

使用JSPM暨以前的工具截然不同。
它附带了一个要好之命令行工具,用于将新的软件包安装到品种蒙,创建一个生产包,等等。
它支持SystemJS插件,可以将各种格式加载到路受到。

 

Brunch

lovebet爱博 5

及Gulp相比,Brunch以更强层次之泛上运行。
它采用类于webpack的扬言方法。
以示范为例,您可考虑于Brunch网站改编以下配置:

module.exports = {
  files: {
    javascripts: {
      joinTo: {
        'vendor.js': /^(?!app)/,
        'app.js': /^app/,
      },
    },
    stylesheets: {
      joinTo: 'app.css',
    },
  },
  plugins: {
    babel: {
      presets: ['es2015', 'react'],
    },
    postcss: {
      processors: [require('autoprefixer')],
    },
  },
};

Brunch包括像brunch new, brunch watch –server, and brunch build
–production。 它含有了重重创造性的力量,可以使插件扩展。

留意:Brunch有一个实验性的热模块重新加载程序。

 

Webpack

lovebet爱博 6

汝可以说Webpack运用比Browserify更单一的措施。
Browserify由多个小器组成,而Webpack提供了一个着力,它提供了许多创造性的效用。

Webpack核心可以以一定的加载程序及插件进行扩张。
它可以决定什么化解模块,使你得调你的构建以相当特定情景和解决无法正常运转的软件包。

跟另外工具相比,Webpack有初始复杂性,但通过其大的效应集成可以弥补这或多或少。
这是一个需耐心的尖端工具。
但是要了解了偷的基本思路,webpack就转换得生强大。

 

另选项

君得找到更多替代品,如下所列:

  • pundle宣传好看做下一样替代包工具,并特别注意其性质。
  • Rollup要关注打包es6的代码。Tree
    shaking是彼卖点之一。您得运用Rollup与webpack的加载程序rollup-loader。
  • AssetGraph运用完全不同的道,建立于HTML语义之上,使该变成超链接分析或布局分析的精良选择。webpack-assetgraph-plugin拿webpack和AssetGraph结合在一起。
  • FuseBox举凡一个在意让速度的包工具。
    它应用零配置方式,旨在开箱即用。
  • StealJS是一个因加载器,一个只顾于性能与易用性的构建工具。
  • Flipbox用大半只捆绑打包于一个集合的界面后面。

 

结语

历史上已经发生那么些JavaScript的构建工具。
每个人且待为自己的艺术解决一个一定的题目。
这些标准已起迎头撞,基本语义的求吗再少了。
相反,工具得以在又胜层次上竞争,并促进再好之用户体验。
通常,您可以同步使用几个单身的化解方案。

如上所述:

  • 自动化构建工具与包装工具解决不同的问题。
    您可透过两岸实现类似的结果,但普通最好用她并利用来互加。
  • 较早的家伙(如Make或RequireJS)仍然具有影响力,即使她于前端开发中不如以往那么为欢迎。
  • Bundinner如Browserify或webpack解决了一个重中之重的问题,并拉扯而管理复杂的Web应用程序。
  • 有些新生技术于不同之角度解决问题。
    有时候它建立在外工具之上,有时她得以同利用。