题目1: 为什么要使用模块化?
- 解决命名冲突
- 解决依赖管理
- 提高代码可读性
- 代码解耦,提高复用性
CMD、AMD、CommonJS 规范分别指什么?有哪些应用
CMD、AMD、CommonJS规范明确了模块的基本书写格式和基本交互规则。
1、CMD(Common Module Definition)是 SeaJS推广过程中产生的。CMD并不是异步加载,而是松散加载,只有当需要加载模块的时候,再用require方法引用模块。
语法:
define(function(require, exports, module) { // 模块代码 });
- CMD 推崇一个文件一个模块,所以经常将文件名作为模块id(不用再- define参数里面写)
- CMD 依赖就近,所以一般不在define的参数中写依赖,在factory中写
factory 方法在执行时,默认会传入三个参数:require、exports 和 module
- require 是一个方法,接受 模块标识 作为唯一参数,用来获取其他模块提供的接口。默认是同步往下执行,也可以用require.async去规定异步回调执行
// 异步加载多个模块,在加载完成时,执行回调 require.async(['./c', './d'], function(c, d) { c.doSomething(); d.doSomething(); });
exports是一个对象,用来向外提供模块接口,还可以直接用return向外提供接口。
define(function(require, exports) { // 对外提供 foo 属性 exports.foo = 'bar'; // 对外提供 doSomething 方法 exports.doSomething = function() {}; }); define(function(require) { // 或者通过 return 直接提供接口 return { foo: 'bar', doSomething: function() {} }; });
module 是一个对象,上面存储了与当前模块相关联的一些属性和方法。
2、AMD是”Asynchronous Module Definition”的缩写,意思就是”异步模块定义”。在web端采用异步方式加载模块。
用define定义模块
语法:define(id?, dependences?, factory);
- id:可选参数,用来定义模块的标识
- dependencies:是一个当前模块依赖的模块名,是数组的形式
- factory:工厂方法,模块初始化要执行的函数或对象。如果为函数,它应该只被执行一次。如果是对象,此对象应该为模块的输出值
对外提供接口的方式和CMD规范类似
用require加载模块
require([dependencies], function(){});
require()函数接受两个参数:
- 第一个参数是一个数组,表示所依赖的模块
- 第二个参数是一个回调函数,当前面指定的模块都加载成功后,它将被调用。加载的模块会以参数形式传入该函数,从而在回调函数内部就可以使用这些模块
require()函数在加载依赖的函数的时候是异步加载的,这样浏览器不会失去响应,它指定的回调函数,只有前面的模块都加载成功后,才会运行,解决了依赖性的问题。
3、CommonJS是服务器端模块的规范,Node.js采用了这个规范。Node.JS首先采用了js模块化的概念。它的主要内容:
定义模块 根据CommonJS规范,一个单独的文件就是一个模块。每一个模块都是一个单独的作用域,也就是说,在该模块内部定义的变量,无法被其他模块读取,除非定义为global对象的属性
模块输出: 模块只有一个出口,module.exports对象,我们需要把模块希望输出的内容放入该对象
加载模块: 加载模块使用require方法,该方法读取一个文件并执行,返回文件内部的module.exports对象
3、
预览
代码
mock数据瀑布流加载效果