一、模块化的来源
随着ie6推出,浏览器有了js引擎,js代码量越来越多。为了适应大型项目并解决重复代码。
(1)以页面为参考,将公用的js代码放进单独js文件,这样还有两个问题
a.js文件的引入是阻塞的,前面js文件代码执行后,才能引入右面的文件,因此必须遵守引入顺序。
b.全局污染 es5中可以用IIFE,返回一个闭包,立即执行函数来解决,
//圆括号可以调用表达式,如果是函数声明,则会报错,可以将函数声明用圆括号包起来。
//立即执行函数前后最好都打上分号,以免后面遇到圆括号当成表达式调用了报错
var moduleA = (function(module){
let obj = {}
return obj
})(moduleB);
//将moduleB注入到moduleA中,作为函数中临时变量,很多jquery插件也是这么做的
;(function($){})(Jquery)
//这样做依然没有解决引入顺序的问题
(2)nodeJs中产生了commonJS,实现了js的模块化。实现了js文件之间的模块化。html只需引入单个整合完成的js文件即可。
a.导出:module.exports =
b.引入:let module = require(‘./moduleA.js’)
require后,会创建一个模块化实例,而且具有缓存机制,如果模块有变化,才会重新require,就算写再多个require也不会重复引入。
引入生成的module是立即执行函数,并不是全局变量。
(3)用户端也可以用的模块化 - AMD规范 - requireJs
//现在html中配置各模块的路径,然后引入
require.config({
paths:{
'moduleA' : './moduleA.js',
'moduleB' : './moduleB.js'
})
require(['moduleA','moduleB'],function(moduleA,moduleB){
console.log(moduleA.a, moduleB.b)
})
特点:异步加载模块,前置依赖,所有模块加载后,才会执行回调函数
(4)CMD 依赖前置
需要的时候就用引入
(5)es6中引入的标准模块化
export 导出
import 引入
(6)commonJs、AMD和es6模块化比较
a.commonJs、AMD是运行时加载,CommonJs的模块是一个对象
b.es6模块是编译时加载或静态加载,es6模块可以在编译时完成加载,比CommonJs加载效率高,也可以在编译时进行’静态优化‘。es6的模块是通过export指定的代码,再通过import引入