前者创设筑工程具的可比lovebet爱博

有多种策略来加载它们

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

在原先,是足以将您的台本写在共同。
时代已经转移,未来将JavaScript代码分开来或许是叁个繁杂的办事。
随着单页应用程序(SPA)的起来,这么些标题已经进步。他们支持于依附一些有效的系统(来化解这些主题材料)。

是因为那个缘故,有各类布署来加载它们。您能够登时加载它们,大概思索要求它们时加载。Webpack扶助广大这么的国策。

Node和npm的风行,给它的包管理器提供了越来越多的利用情状。在npm实施从前,很难使用注重项。有一段时间,大家开垦出了前者特定的包管理器,但npm最后获得了胜利。今后依附管理比原先更便于了,纵然还索要克制一些挑衅。

职分运营程序与包装

正史上,已经有众多塑造筑工程具。
Make或许是最着名的,它照旧是一个实用的挑三拣四。
特地的任务运维程序,如Grunt和居尔p,是特地为JavaScript开拓职员创立的。
通过npm提供的插件使得职务运转程序都有力而且可扩充。
乃至足以使用npm脚本作为天职运转程序。 那很常见,特别是webpack。

任务运营程序是高品位的巨大工具。 它们允许你以跨平台格局举办操作。
当您须求将种种能源拼接在一块并生育时,难点就能开始。
出于此原因,存在财富整合程序,如Browserify,Brunch或webpack。

有一段时间,RequireJS异常受接待。
它的主导是提供叁个异步模块的主意并确立在此之上。
速龙的格式在背后将会有更详细的牵线。
幸运的是,那一个标准早已蒙受了,而且RequireJS如同是二个很好的开导。

Make

就像1978年先前时代发布的那样,Make回去了。即便它是二个旧工具,但它照旧是不毫无干系系的。
Make允许你为各类目标编写单独的职务。
比方,您能够有两样的天职来制造生产营造,压缩JavaScript或运行测试。
您能够在好多任何工具中找到一样的不二秘诀。

即便Make首要用来C项目,但它并不以任何情势与C绑定。 詹姆士Coglan详细商讨了什么利用在JavaScript中采取马克
看一下下边的詹姆士帖子里介绍的削减代码的情势:

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等实用程序。
在此地能够调用其余自动化构建筑工程具来掩藏你正在利用的切切实实细节。
那样,您能够在维持分界面同样的景况下行使重构工具。

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。

Gulp

Gulp动用两样的格局。
您无需依赖每种插件的安顿,而是管理实际的代码。
居尔p建设构造在管道概念之上。 假让你熟谙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']
);

出于配置是代码,如若超过麻烦,您总是能够将其删除。
您能够将长存的节点包作为居尔p插件,等等。
与Grunt比较,您能够更明白地明白爆发了什么。
尽管如此,你依然最终写了累累模板作为闲时任务。 那正是革新的措施。

注意:webpack-stream允许你在居尔p景况中使用webpack。

注意:Fly是与居尔p类似的工具。
它借助于ES6发生器。

Browserify

拍卖JavaScript模块一向是四个问题。 js语言本身并未有模块的定义,直到ES6。
Ergo,那几个语言在90年间被用在浏览器境况中。
已经建议了归纳AMD在内的各样化解方案。

lovebet爱博,Browserify是模块难点的一个解决方案。
它能够将CommonJS模块捆绑在一同。
您能够将其与居尔p挂钩,您能够找到非常小的更改工具,令你能够超越基本用法。
比如,watchify提供了贰个在付出空闲的行事之间为你创立捆绑包的文本监视器。

Browserify生态系统由众多小模块组成。 那样,Browserify就符合Unix的视角。
Browserify比webpack更易于选用,实际上它是三个很好的代替品。

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

JSPM

使用JSPM与原先的工具大相径庭。
它附带了八个和好的命令行工具,用于将新的软件包安装到品种中,创立三个生产包,等等。
它协理SystemJS插件,能够将种种格式加载到花色中。

Brunch

与居尔p比较,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

你能够说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应用程序。
  • 一些新生手艺从分化的角度消除难题。
    一时候它们创设在任何工具之上,一时它们能够一同行使。

原博客备份