本系列文章实际上就是官网文档的翻译加上自己实践过程中的理解。
伴随着websites演化至web apps的过程,有三个现象是很明显的:
这些现象导致了什么?大量的前端代码。
庞大的代码库需要被高效的组织。而Module(组件式)开发的系统即为大多数开发者采取的途径。
有很多种定义依赖,导出变量的标准或者说方法:
在非组件系统中,我们的模块化后的代码是这样被组织的。
<script src="module1.js"></script> <script src="module2.js"></script> <script src="libraryA.js"></script> <script src="module3.js"></script>
各个组件向全局变量提供了一个个接口(如:浏览器环境的 window对象)。之后,借助全局对象,我们就能使用这些组件。
痛点
这种风格的组件系统使用同步的形式来加载依赖项,并返回导出的接口。每一个组件可以借助exports对象或者配置module.exports来导出接口(Node.js开发者再熟悉不过了)。
require("module"); require("../file.js"); exports.doStuff = function() {}; module.exports = someValue;
优点
痛点
典例
AMD的全称是Asynchronous Module Definition,很多需要用到组建式系统,但又感受到它们在前端的痛点的开发者建设了AMD。
require(["module", "../file"], function(module, file) { /* ... */ }); define("mymodule", ["dep1", "dep2"], function(d1, d2) { return someExportedValue; });
优点
痛点
典例
From EcmaScript6
import "jquery"; export function doStuff() {} module "localModule" {}
虽然是标准,但是被浏览器广泛支持还需要一段时间。
组件虽然被执行于客户端,但不可避免需要经由服务器传送。
关于组件的传送,有两个极端:
让我们在两者间做一个妥协。在大多数情况下,以下的方法将更为适用:
->在编译所有的组件时,将组件分为多种批次(chunks or batches)。
再某个批次再被需要的时候,再发送他们。
解决了前者带来的请求的高延迟、高负载,后者带来的无必要信息的传送。
那么,问题来了,这个分批次由谁来做?
webpack。
当然,gulp,grunt也是时下很火的可选项。具体工具的选型,仁者见仁,智者见智。
组件化系统难道就只能为javascript服务吗?前端还需要解决的问题有
没错,这些,webpack也能搞定
require("./style.css"); require("./style.less"); require("./template.jade"); require("./image.png");