ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 模块化规范 分为两种Common.js和AMD ## Common.js 2009年,美国程序员[`Ryan Dahle`](https://cloud.tencent.com/developer/article/1407904) `nodejs`项目。这标志 `JavaScript模块化编程`正式诞生,当时在浏览器环境下,没有模块也不是特别大的问题,毕竟网页程序的复杂性有限; 但是在服务器端,一定要有模块,与操作系统和其他应用程序互动,否则根本没法编程。 `node.js`的模块系统,就是参照 `CommonJS`规范实现的。 在 `CommonJS require`.用于加载模块假定有一个数学模块 math js,就可以像下面这样加载 ``` var math = require(math); math.add(2, 3): //5 ``` ## AMD 有了服务器端模块以后,很自然地,大家就想要客户端模块而且最好两者能够兼容,一个模块不用修改,在服务器和浏览器都可以运行但是,由于一个重大的局限,使得 CommonJS规范不适用于浏览器环境执行。 解释: ``` var math = require(math) math.add(2, 3): ``` 第二行math.add(2.3)在第一行requiremath math jst加载完成。也就是说,如果加载时间很长,整个应用就会停在那里等 这对服务器端不是一个问题,因为所有的模块都存放在本地硬盘可以同步加载完成等待时间就是硬盘的读取时间。但是,对于浏览器这却是个大问题因为模块都放在服务器端,等待时间取决于网速的快慢可能要等很长时间浏览器处于假死状态 因此,浏览器端的模块,不能采用同步加载`synchronous`只能采用异步加载(`asynchronous`)这就是AMD规范证生的背景 `AMD`是 `Asynchronous Module Definition`的缩写意思就是异步模块定义。 ## ES6模块化 在 `ES6`之前,社区制定了一些模块加载方案,最主要的有 `CommonJS`和 `AMD`两种。前者用于服务器,后者用于浏览器。`ES6`在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 `CommonJS`和 `AMD`规范,成为浏览器和服务器通用的模块解决方案。 ES6 模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。`CommonJS`和 `AMD`模块,都只能在运行时确定这些东西。比如,`CommonJS`模块就是对象,输入时必须查找对象属性。 [http://es6.ruanyifeng.com/#docs/module](http://es6.ruanyifeng.com/#docs/module)