最近从新复习的模块化的相关知识,总结一下,仅供本身理解和你们参考。javascript
可维护性:根据定义,每一个模块都是独立的。良好设计的模块会尽可能与外部的代码撇清关系,以便于独立对其进行改进和维护。维护一个独立的模块比起一团凌乱的代码来讲要轻松不少。html
命名空间:在JavaScript
中,最高级别的函数外定义的变量都是全局变量(这意味着全部人均可以访问到它们)。也正因如此,当一些无关的代码碰巧使用到同名变量的时候,咱们就会遇到“命名空间污染”的问题。java
如今比较流行的模块化规范主要有
commomJS
,AMD
,CMD
,ES6
,如今逐一说明一下.node
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规范异步
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
是国内玉伯大神在开发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
在语言规格的层面上,实现了模块功能,并且实现得至关简单,彻底能够取代现有的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 目前能够拿来即用的模块少,生态差 |
对比学习,效果更好哦~~~