题目1: 为什么要使用模块化?
- 最主要目的
- 解决命名冲突
- 依赖管理
- 其他价值
- 提高代码可读性
- 代码解耦,提高复用性
题目2: CMD、AMD、CommonJS 规范分别指什么?有哪些应用
- CommonJS 规范
定义模块: 根据CommonJs规范,一个单独的文件就是一个模块。每一个模块都是一个单独的作用域,也就是说,在该模块内部定义的变量,无法被其他模块读取,除非定义为global对象的属性
模块输出: 模块只有一个出口, module.exports 对象,我们需要把模块希望输出的内容放入该对象
3.加载模块:加载模块使用require 方法,该方法读取一个文件执行,返回文件内部的 module.exports 对象
//定义模块 a.js
var people = {
name: 'ruoyu',
sayName: function(){
console.log(this.name);
}
}
module.exports = people;
//加载模块 b.js
var p = require('./a');
p.sayName();
- AMD 规范
AMD 是 “Asynchronous Module Definition” 的缩写,意思就是“异步模块定义”。是 RequireJS 在推广过程中的规范化产出。该规范定义了一个函数define,它是全局变量。
requireJS主要解决两个问题
- 多个js文件可能有依赖关系,被依赖的文件需要早于依赖它的文件加载到浏览器
- js加载的时候浏览器会停止页面渲染,加载文件越多,页面失去响应时间越长
// 定义模块 myModule.js
define(['dependency'], function(){
var name = 'Byron';
function printName(){
console.log(name);
}
return {
printName: printName
};
});
// 加载模块
require(['myModule'], function (my){
my.printName();
});
- CMD 规范
CMD 是 SeaJS 在推广过程中的规范化产出。
与 AMD 的区别:
- 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。
- CMD 推崇依赖就近,AMD 推崇依赖前置
define(function(require, exports, module) {
var a = require('./a')
a.doSomething()
// 此处略去 100 行
var b = require('./b')
// 依赖可以就近书写
b.doSomething()
// ...
})
- 应用
CommonJS 适用于服务器端,基于Node,可用于Glup、Webpack之类的打包压缩再用于浏览器环境
AMD 用于浏览器环境, 如RequireJS
3.CMD 用于浏览器环境, SeaJS推广中产出