前者构建工具的相比,前端构建工具的可比

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

初稿地址: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绑定。 詹姆士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(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很受欢迎。
它的着力是提供一个异步模块的方法并创制在此之上。
英特尔的格式在前面将会有更详细的介绍。
幸运的是,那么些标准早已遭逢了,而且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绑定。 詹姆士Coglan详细谈论了怎么着使用在JavaScript中行使马克
看一下底下的詹姆斯(James)帖子里介绍的削减代码的章程:

其他选项

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

  • 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。 其最大的吸引力是Intel。
它引入了一个定义包装器:

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)(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

图片 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

图片 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

图片 3

拍卖JavaScript模块一贯是一个题材。 js语言本身并未模块的概念,直到ES6。
Ergo,这些语言在90年份被用在浏览器环境中。
已经提议了包括AMD在内的各个解决方案。

Browserify是模块问题的一个缓解方案。
它能够将CommonJS模块捆绑在一块儿。
您可以将其与Gulp挂钩,您能够找到较小的更换工具,使你可以抢先基本用法。
例如,watchify提供了一个在开发空闲的行事之间为你创设捆绑包的公文监视器。

Browserify生态系统由许多小模块组合。 这样,Browserify就适合Unix的理念。
Browserify比webpack更便于选取,实际上它是一个很好的替代品。

注意:Splittable是一个Browserify包装器,允许代码分割,扶助ES6开箱即用,Tree
shaking等等。

 

JSPM

图片 4

使用JSPM与从前的工具截然不同。
它附带了一个友好的命令行工具,用于将新的软件包安装到品种中,创立一个生产包,等等。
它襄助SystemJS插件,可以将各个格式加载到品种中。

 

Brunch

图片 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

图片 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应用程序。
  • 部分新兴技术从不同的角度解决问题。
    有时候它们创立在其余工具之上,有时它们得以同步利用。