ES6的模块、构建工具及应用的发布

作者:寸志
链接:https://zhuanlan.zhihu.com/p/19569085
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

总的说来就是按照将来的标准书写,现在使用工具来适配。

我们已经有了服务端的依赖管理方案

  1. 安装并声明依赖;
  2. 在代码中获取(require)依赖;
  3. 将通用的代码打包并发布到同一个地方。(npm、gems等等)

浏览器端的依赖管理远远没有完成,并且现在情况看上去很糟糕

  1. 有各种各样的模块规范;
  2. 有很多包管理工具;
  3. 通用的代码被打包,到处发布,用户用起来还是很不方便。

这很重要

我们需要把这个问题解决掉——当有人搞了一个Angular的directive、一个Ember组件、一个web组件抑或一个老的但是有用javascript类库,他们需要一种简单方式来分享这些代码。Node在这方面很成功,因为npm使用起来很简单。

在Node中使用第三方的代码很简单。

  1. 在cli中运行$ npm install backbone来安装backbone;
  2. 在你的程序中通过var Backbone = require(‘backbone‘)来使用backbone。

我想在浏览器端也这么做,但是首先:

我们有三种分发的方式

  1. (通常的做法是)一次加载整个程序;
  2. 逐步加载部分打包(也很常见);
  3. 完全不打包(虽然可行,但是最坑爹)。

程序打包策略不一样

  1. 配置合并
    1. 加载整个目录;
    2. 添加显示的配置,指定加载顺序。
  2. 依赖分析(r.js、browserify)
    1. 这正是服务端使用的方式,只是不打包而已;
    2. 整个打包背后的关键,就是为浏览器创建一个模块的运行时。

程序分发表

根据程序的分发方式和打包策略,我们得到下面这张表:

CJS/globals也可以通过$.getScript或者类似的工具来实现程序的局部加载,但这并不是模块规范的一部分。

以前,如你所见,我支持AMD,因为它支持所有的场景。虽然AMD获得了大量的关注,但是并没有被所有的类库作者、包管理器和JavaScript运行环境所接受。

现存的工具并不能处理所有这些使用场景。你必须使用你依赖的工具使用的规范,你所依赖的类库也需要这样做。

我们需要一种模块规范,能适配现存的工具

  1. global,非申明式的,无法使用工具来分析依赖,不行;
  2. AMD,坑爹,不是所有的人都适配它;
  3. CJS,并不能满足所有的程序分发方式。

所以,不管你为你的程序选择什么,你都必须为这那些第三方模块整点hack,因为这些模块并不满足你使用的模块系统

直到UMD“横空出世”。

什么是UMD!

很久之前,我和少数几个童鞋(https://github.com/umdjs?tab=members)提出了一种最绝望的JavaScript模块规范——Universal Module Definition

和它名字的意思一样,这种规范基本上可以在任何一个模块环境中工作。

如果Backbone、Ember、moment、angular,或者某人的某段代码都是以UMD规范写的,那你在它们上使用任何现有前端工具。例如,你可以:

  1. 选择AMD,用bower安装,用r.js构建;
  2. 和1一样,不构建;
  3. 选择CommonJS,用npm安装,用browserify安装;
  4. 选择AMD,用npm安装,r.js构建;
  5. 什么规范都不用,直接使用script在页面中引用;
  6. 使用那些有支持UMD的组件。

我可以弄出一个交叉的表格,包含所有的模块格式、包管理器以及构建工具。但是你应该清楚了,因为它支持了所有现有的工具,所以支持所有程序分发的方式。

但是有一个问题,umd让自动修正变得很乱,我没有撒谎,举个例子,这里有一种非常糟糕的使用backbone的方式:

(function (root, factory) {
  if (typeof define === ‘function‘ && define.amd) {
    // AMD
    define(‘backbone‘, [‘jquery‘, ‘underscore‘], function (jQuery, _) {
      return factory(jQuery, _);
    });
  } else if (typeof exports === ‘object‘) {
  // Node.js
    module.exports = factory(require(‘jquery‘), require(‘underscore‘));
  } else {
    // Browser globals
    root.Backbone = factory(root.jQuery, root._);
  }
}(this, function (jQuery, _) {
  var Backbone = {};
  // Backbone code that depends on jQuery and _
  return Backbone;

}));

你看得出为什么这无法流行起来,它太恐怖了,没有人会这样写,看着它,我只想咒骂。

使用ES6,编译成UMD,到处使用

ES6模块规范出现,于是类库开发者可以使用ES6来编写代码,然后转成UMD格式,发到哪里都可以(npm、bower等等)。

  1. 这与非结构化的CJS一样优秀,甚至超过CJS;
  2. 这是未来,无论如何,你最终要使用这种模式。

现在还差的就是给umdjs/es6-module-transpiler · GitHub添加对UMD支持就好了,这正是https://twitter.com/machty和我正在做的事情。

这需要类库作者的支持

这可能是一场艰苦卓绝的战斗,但是:

  1. 任何关注浏览器端模块化的人看得出它的好处;
  2. 最终ES6会落地,有一个平台鼓励人们这么做;
  3. 我们可以fork或者shim他们的repos,然后让模块管理器使用这个fork或者shim(bower一直都是这么干的)。

未来

第一步,让类库作者支持ES6;

第二步,让模块管理器支持es5,并为我们编译;

第三步,坐等es6落地。

我们可以!

请关注umdjs/es6-module-transpiler · GitHub,等着我们搞定UMD,接下来会给出几个例子。

原文:ES6 Modules, Build Tools and Browser App Delivery ? Ryan Florence Online

JavaScriptNode.jsECMAScript 6

时间: 2024-09-30 03:31:31

ES6的模块、构建工具及应用的发布的相关文章

前端工程构建工具之Yeoman

一.Yeoman 简介 通常在开发新项目时我们都需要配置工程环境,开发目录,需要下载一些库.框架文件(如 jQuery.Backbone 等),配置编译环境(Less.Sass.Coffeescript等),甚至还要配置单元测试框架,过程非常繁琐,还没开始编码时间就耗了大半天.为了解决这个问题 Paul Irish.Addy Osmani.Sindre Sorhus.Mickael Daniel.Eric Bidelman 和 Yeoman 社区共同开发的一个项目--Yeoman. Yeoman

构建工具Gulp

前面的话 与grunt类似,gulp也是构建工具,但相比于grunt的频繁IO操作,gulp的流操作能更快更便捷地完成构建工作.gulp借鉴了Unix操作系统的管道(pipe)思想,前一级的输出,直接变成后一级的输入,使得在操作上非常简单.通过本文,我们将学习如何使用Gulp来改变开发流程,从而使开发更加快速高效 入门 如果会使用grunt,则gulp学起来,并不困难.主要包括以下几步 1. 全局安装 gulp $ npm install --global gulp 2. 作为项目的开发依赖(d

前端自动化构建工具Webpack开发模式入门指南

Webpack Webpack是时下最流行的模块打包器 它的主要任务就是将各种格式的JavaScript代码,甚至是静态文件 进行分析.压缩.合并.打包,最后生成浏览器支持的代码 特点: 代码拆分方案:webpack可以将应用代码拆分成多个块,每个块包含一个或多个模块,块可以按需异步加载,极大提升大规模单页应用的初始加载速度 智能的静态分析:webpack的智能解析器几乎可以处理任何第三方库 Loader加载器:webpack只能处理原生js模块,但是loader可以将各种资源转换为js模块 p

前端开发自动化工作流工具:JavaScript自动化构建工具grunt、gulp、webpack介绍

前端开发自动化工作流工具,JavaScript自动化构建工具grunt.gulp.webpack介绍 前端自动化,这样的一个名词听起来非常的有吸引力,向往力.当今时代,前端工程师需要维护的代码变得及为庞大和复杂,代码维护.打包.发布等流程也变得极为繁琐,同时浪费的时间和精力也越来越多,当然人为的错误也随着流程的增加而增加了更多的出错率.致使每一个团队都希望有一种工具,能帮助整个团队在开发中能精简流程.提高效率.减少错误率.随之讨论自动化部署也越来越多,并且国内很多大型团队也都有自己成熟的自动化部

前端构建工具之争——Webpack vs Gulp 谁会被拍死在沙滩上

.table tr>td:nth-child(1){width: 2em !important;padding-left: .6rem !important;padding-right: .6rem !important;} 本文组织结构 理想的前端开发流程 Gulp 为何物 Webpack 又是从哪冒出来的 结论 文章有点长,总共 1800 字,阅读需要 18 分钟.哈哈,没耐心的直接戳我到高潮部分. 理想的前端开发流程 在说构建工具之前得先说说咱期望的前端开发流程是怎样的? 写业务逻辑代码(

ES6 实战项目构建 ES6+glup+express

ES6推出已经有几个年头了,平时也有学过一些基本语法,无奈实践经验太少.而且前端早已脱离了刀耕火种的时代,一些自动化构建工具像gulp.webpack等也需要熟练掌握.最近刚签了三方,闲暇之余就找了个ES6实战视频系统学习了一下,然而,由于视频中用到的打包工具和编译工具版本不同,导致在按照视频进行项目构建时遇到了很多坑.在此写篇文章记录一下,边学习边填坑,希望帮助到一些人吧. 项目名称:ES6 彩票项目实战 项目搭建环境:win10 任务自动化工具(gulp)编译工具(babel.webpack

前端构建工具gulpjs的使用介绍及技巧

gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学习起来很容易,而且gulpjs使用的是nodejs中stream来读取和操作数据,其速度更快.如果你还没有使用过前端构建工具,或者觉得gruntjs太难用的话,那就尝试一下gulp吧. 本文导航: gulp的安装 开始使用gulp gulp的API介绍 一些常用的gulp插件 1.gulp的安装 首先确保你已经正确安装了nodejs环境.然后以全局方式安装gulp: npm inst

构建工具的发展及Android Gradle快速上手

前话: 最近谷歌宣布官方不再维护Eclipse ADT了,之后将更加专注于Android Studio的功能和性能上的改进,早在2013年的Google IO大会上首次推出了Android Studio,当时刚出来的时候我就好奇的去下载体验了一下,想看一下新开发工具的优势在哪里,据官方介绍,最吸引我的一点就是使用Studio使用了Gradle编译系统,可以支持很灵活的定制需求,而我当时正在研究当成库使用的APK(就是现在的aar文件,不过当时还没有出身),刚好遇到了ADT编译系统的限制,所以当时

python的构建工具——setup.py文件

一.构建工具setup.py的应用场景 在安装python的相关模块和库时,我们一般使用"pip install  模块名"或者"python setup.py install",前者是在线安装,会安装该包的相关依赖包:后者是下载源码包然后在本地安装,不会安装该包的相关依赖包.所以在安装普通的python包时,利用pip工具相当简单.但是在如下场景下,使用python setup.py install会更适合需求: 在编写相关系统时,python 如何实现连同依赖包