为什么有前端模块化:
前端代码的日益增多,避免命名冲突,更高复用性,更好的分离,按需加载。
模块化的历史:
全局function模式(命名冲突) -> namespace,简单对象封装(外部可以直接修改内部数据)->IIFE问题(依赖)->IIFE增强(引入依赖),现代模块化的基石。
模块化规范的必要性:引入多个script出现的问题->请求过多,依赖模糊,难以维护。
CommonJS:
特点:同步加载,适用于服务端,加载一次缓存结果。浏览器端需要编译后执行。
语法:
暴露模块:
module.exports = value或exports.value = value
引入模块:
require(xxx)
AMD:
特点:异步加载,允许指定回调函数,适用于浏览器端。
语法:
定义:
define(['module1','module2'], function(m1, m2){
return 模块
})
使用:
require(['module1', 'module2'], function(m1, m2){
使用m1, m2
})
借助工具:RequireJS
CMD:
特点:用于浏览器端,模块加载是异步的,模块使用时才会加载执行。结合了CommonJS和AMD规范的特点。
定义暴露模块:
define(function(require, exports, module){
//引入依赖模块(同步)
var module2 = require('./module2')
//引入依赖模块(异步)
require.async('./module3', function (m3) {
})
//暴露模块
exports.xxx = value
})
引入模块:
define(function (require) {
var m1 = require('./module1')
var m4 = require('./module4')
m1.show()
m4.show()
})
借助工具:sea.js
ES6模块化: 特点:编译时确定依赖关系。