模块化总结
近来从新温习的模块化的相干学问,总结一下,仅供本身明白和人人参考。
模块化的长处
可保护性:依据定义,每一个模块都是自力的。优越设想的模块会只管与外部的代码抛清关联,以便于自力对其举行革新和保护。保护一个自力的模块比起一团缭乱的代码来讲要轻松许多。
定名空间:在
JavaScript
中,第一流别的函数外定义的变量都是全局变量(这意味着所有人都能够访问到它们)。也正因如此,当一些无关的代码恰巧运用到同名变量的时刻,我们就会碰到“定名空间污染”的题目。
模块化范例
如今比较盛行的模块化范例主要有
commomJS
,AMD
,CMD
,ES6
,如今一一申明一下.
commonJS
commonJS
是服务器端的模块化范例,node.js
就是参照commonJS
范例完成的。commonJS
中有一个全局的要领require()
用来加载模块。
function myModule(){
this.hello = function(){
return "hello";
}
this.goodbye = function(){
return "gooodbye!";
}
}
module.exports = myModile;
实在module
变量代表当前模块.
如许就能够在其他模块中运用这个模块
var myModule = require('myModule');
var myModuleInstance = new myModule();
myModuleInstance.hello();
myModuleInstance.goodbye();
关于commonJS的更多,见CommonJS范例
AMD
commonJS
定义模块的体式格局和引入模块的体式格局照样比较简朴的,但不合适浏览器端,由于commonJS
是同步加载的。而AMD
是异步加载的,下面我们来讲说AMD
的誊写范例。
经由过程define()
来定义模块
//main.js
define(['mylib'],function(mylib){
function foo(){
mylib.doSomething();
}
return {
foo:foo;
}
})
define
的第一个参数是依靠的模块,必需是一个数组。经由过程return
来暴露接口。
经由过程require()
来加载模块,模块的名字默以为模块加载器要求的指定剧本的名字。
require(['main'],function(main){
alert(main.foo());
})
require.js
就是依据AMD
范例完成的,长处为:
完成js文件的异步加载,防止网页落空相应;
治理模块之间的依靠性,便于代码的编写和保护。
CMD
CMD
是国内玉伯大神在开辟SeaJS
的时刻提出来的,也是异步模块定义。 CMD
和AMD
的区分: CMD
相称于按需加载,定义一个模块的时刻不须要马上制订依靠模块,在须要的时刻require
就能够了,比较轻易;而AMD
则相反,定义模块的时刻须要制订依靠模块,并以形参的体式格局引入回调函数中。
// CMD
define(function(require, exports, module) {
var a = require('./a')
a.doSomething()
// 此处略去 100 行
var b = require('./b') // 依靠能够就近誊写
b.doSomething()
// ...
})
// AMD 默许引荐的是
define(['./a', './b'], function(a, b) { // 依靠必需一开始就写好
a.doSomething()
// 此处略去 100 行
b.doSomething()
...
})
关于 require.js
和 sea.js
的区分详见SeaJS与RequireJS最大的区分
ES6
ES6
在言语规格的层面上,完成了模块功用,而且完成得相称简朴,完全能够庖代现有的CommonJS
和AMD
范例,成为浏览器和服务器通用的模块解决计划。
ES6
模块主要有两个功用:export
和import
export
用于对外输出本模块(一个文件能够明白为一个模块)变量的接口
import
用于在一个模块中加载另一个含有export
接口的模块。
// a.js
var sex="boy";
var echo=function(value){
console.log(value)
}
export {sex,echo}
// b.js
//经由过程import猎取a.js文件的内部变量,{}括号内的变量来自于a.js文件export出的变量标识符。
import {sex,echo} from "./a.js"
console.log(sex) // boy
echo(sex) // boy
种种模块化计划优瑕玷对照:
模块化计划 | 长处 | 瑕玷 |
---|---|---|
commonJS | 复用性强 ,运用简朴 ,完成简朴 有不少能够拿来即用的模块,生态不错 | 同步加载不合适浏览器 浏览器的要求都是异步加载 不能并行加载多个模块。 |
AMD | 异步加载合适浏览器 可并行加载多个模块 | 模块定义体式格局不文雅,不符合规范模块化 |
ES6 | 可静态剖析,提早编译 面向未来的规范 | 浏览器原生兼容性差,所以平常都编译成ES5 现在能够拿来即用的模块少,生态差 |
对照进修,结果更好哦~~~