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

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

原文地址:

初稿地址:

在往日,是可以将你的脚本写在联名。
时代一度改成,现在将JavaScript代码分开来或许是一个复杂的工作。
随着单页应用程序(SPA)的起来,这多少个题目早已升级。他们补助于依靠一些使得的体系(来解决这一个题材)。

 

 

出于这个缘故,有多种方针来加载它们。您可以立时加载它们,或者考虑需要它们时加载。Webpack补助广大那样的策略。

在原先,是足以将您的台本写在一齐。
时代一度转移,现在将JavaScript代码分开来或者是一个复杂的办事。
随着单页应用程序(SPA)的起来,这几个题目早已提高。他们帮忙于依靠一些行之有效的系统(来解决那一个题材)。

在原先,是可以将您的本子写在一起。
时代早就改变,现在将JavaScript代码分开来或许是一个复杂的做事。
随着单页应用程序(SPA)的勃兴,这多少个问题早就升级。他们协助于依靠一些有效的系列(来化解那个题目)。

Node和npm的盛行,给它的包管理器提供了更多的接纳条件。在npm普及从前,很难使用依赖项。有一段时间,人们开发出了前者特定的包管理器,但npm最后拿到了战胜。现在凭借管理比原先更易于了,尽管还亟需制伏一些挑衅。

鉴于那个缘故,有多种国策来加载它们。您能够立时加载它们,或者考虑需要它们时加载。Webpack帮忙广大如此的政策。

出于那个原因,有多种方针来加载它们。您可以立时加载它们,或者考虑需要它们时加载。Webpack补助广大这么的策略。

职责运行程序与包装

正史上,已经有那一个构建工具。
Make可能是最着名的,它仍旧是一个使得的挑选。
专门的职责运行程序,如Grunt和Gulp,是专门为JavaScript开发人士创造的。
通过npm提供的插件使得任务运行程序都强大而且可扩展。
甚至足以应用npm脚本作为任务运行程序。 这很宽泛,特别是webpack。

职责运行程序是高水准的巨大工具。 它们允许你以跨平台情势举行操作。
当您需要将各样资源拼接在联名并生育时,问题就会起头。
出于此原因,存在资源整合程序,如Browserify,Brunch或webpack。

有一段时间,RequireJS很受欢迎。
它的要旨是提供一个异步模块的形式并建立在此之上。
Intel的格式在后头将会有更详细的介绍。
幸运的是,这个规范早已境遇了,而且RequireJS似乎是一个很好的开导。

Node和npm的盛行,给它的包管理器提供了更多的选择条件。在npm推广从前,很难使用看重项。有一段时间,人们开发出了前者特定的包管理器,但npm最后赢得了打败。现在依靠管理比原先更便于了,即便还亟需打败一些挑衅。

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。 其最大的吸重力是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等实用程序。
在这里可以调用其他自动化构建工具来掩藏你正在选取的现实性细节。
这样,您可以在保障界面相同的图景下采取重构工具。

历史上,已经有好多构建工具。
Make可能是最着名的,它还是是一个有效的取舍。
专门的任务运行程序,如Grunt和Gulp,是特地为JavaScript开发人士创造的。
通过npm提供的插件使得任务运行程序都有力而且可扩展。
甚至足以利用npm脚本作为天职运行程序。 这很广泛,特别是webpack。

野史上,已经有许多构建工具。
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。

职责运行程序是高品位的皇皇工具。 它们允许你以跨平台情势进行操作。
当您需要将各类资源拼接在联名并生育时,问题就会先导。
出于此原因,存在资源整合程序,如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很受欢迎。
它的骨干是提供一个异步模块的章程并树立在此之上。
Intel的格式在后面将会有更详尽的介绍。
幸运的是,这一个专业早已遭遇了,而且RequireJS似乎是一个很好的启迪。

有一段时间,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

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或运行测试。
您可以在成千上万其余工具中找到同样的法子。

就像1977年底期宣布的这样,Make回去了。虽然它是一个旧工具,但它如故是不无关系的。
Make允许你为各个目标编写单独的任务。
例如,您可以有不同的职责来创立生产构建,压缩JavaScript或运行测试。
您可以在不少另外工具中找到同样的办法。

Webpack

您可以说Webpack应用比Browserify更单一的章程。
Browserify由五个小工具组成,而Webpack提供了一个骨干,它提供了过多创制性的效益。

Webpack要旨可以采用一定的加载程序和插件举行扩张。
它可以控制什么化解模块,使您可以调整你的构建以配合特定情景和解决无法正常运行的软件包。

与其他工具比较,Webpack具有初阶复杂性,但因而其广大的效劳集成可以弥补这或多或少。
这是一个索要耐心的尖端工具。
可是一旦明白了幕后的基本思路,webpack就变得很强大。

尽管Make首要用于C项目,但它并不以任何措施与C绑定。 詹姆斯(James)Coglan详细座谈了怎么利用在JavaScript中应用马克(Mark)。
看一下底下的詹姆士(詹姆斯(James))帖子里介绍的收缩代码的格局:

虽然Make重要用以C项目,但它并不以任何方法与C绑定。 詹姆士Coglan详细探究了怎么采纳在JavaScript中应用马克(Mark)。
看一下底下的詹姆士(詹姆士(James))帖子里介绍的压缩代码的措施:

另外拔取

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

  • pundle鼓吹自己当作下一代打包工具,并特别注意其属性。
  • Rollup最首要关注打包es6的代码。Tree
    shaking是其卖点之一。您可以行使Rollup与webpack的加载程序rollup-loader。
  • AssetGraph使用完全不同的艺术,建立在HTML语义之上,使其变成超链接分析或布局解析的不错采纳。webpack-assetgraph-plugin将webpack和AssetGraph结合在共同。
  • FuseBox是一个小心于速度的包装工具。
    它采取零配置模式,目的在于开箱即用。
  • StealJS是一个凭借加载器,一个只顾于性能和易用性的构建工具。
  • Flipbox将多个捆绑打包在一个联合的界面前面。

Makefile

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
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集成。

采取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)撰写了一篇关于什么从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等实用程序。
在这边可以调用其他自动化构建工具来掩藏你正在使用的求实细节。
这样,您可以在维持界面相同的情景下行使重构工具。

 

RequireJS

RequireJS或是是第一个变为真正受欢迎的脚本加载程序。
它首先科学地引入了模块化JavaScript。 其最大的重力是英特尔。
它引入了一个定义包装器:

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。

 

Grunt

图片 2

 

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

图片 3

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暴发器。

 

 

Gulp

图片 4

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

图片 5

处理JavaScript模块平素是一个题目。 js语言本身没有模块的定义,直到ES6。
Ergo,这几个语言在90年代被用在浏览器环境中。
已经提议了席卷AMD在内的各类解决方案。

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

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

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

 

Browserify

图片 6

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

Browserify是模块问题的一个化解方案。
它可以将CommonJS模块捆绑在联名。
您可以将其与Gulp挂钩,您可以找到较小的转移工具,使您能够超过基本用法。
例如,watchify提供了一个在支付空闲的办事期间为您创设捆绑包的文本监视器。

Browserify生态系统由众多小模块组成。 这样,Browserify就符合Unix的见地。
Browserify比webpack更易于采取,实际上它是一个很好的替代品。

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

 

JSPM

图片 7

使用JSPM与原先的工具截然不同。
它附带了一个祥和的命令行工具,用于将新的软件包安装到花色中,创建一个生产包,等等。
它匡助SystemJS插件,可以将各样格式加载到花色中。

 

JSPM

图片 8

使用JSPM与在此往日的工具截然不同。
它附带了一个和好的命令行工具,用于将新的软件包安装到品种中,创造一个生产包,等等。
它补助SystemJS插件,可以将各个格式加载到项目中。

 

Brunch

图片 9

与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有一个实验性的热模块重新加载程序。

 

Brunch

图片 10

与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

图片 11

您可以说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应用程序。
  • 有些新生技术从不同的角度解决问题。
    有时候它们创立在其它工具之上,有时它们可以一起行使。

 

Webpack

图片 12

您可以说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应用程序。
  • 部分新生技术从不同的角度解决问题。
    有时候它们建立在任何工具之上,有时它们得以协同利用。

 

相关文章