题目1: 为什么要使用模块化?
- web应用越来越复杂,代码复杂度增加
- 代码需要复用和解耦合
- 性能优化,需要更少的http请求。
模块化能够解决命名冲突、文件依赖管理的问题,并且能够提供代码的复用性
题目2: CMD、AMD、CommonJS 规范分别指什么?有哪些应用
前端的模块化首先是在服务器端出现的。CommonJS规范是在nodeJS的发展中发展起来的。由于Node.js环境有四个变量module,exports,require,global
所以它能提供一种简单方式进行模块的输出与引入.在node环境下打印出module
和exports
结果如下
Module { id: '.', exports: {}, parent: null, filename: 'E:\\jirengu\\模块化\\AMD-requireJS\\app.js', loaded: false, children: [], paths: [ 'E:\\jirengu\\模块化\\AMD-requireJS\\node_modules', 'E:\\jirengu\\模块化\\node_modules', 'E:\\jirengu\\node_modules' ] }{}
但是在浏览器中就没有以上变量。接下来看看Commonjs如何的定义模块和引入模块定义模块
//main.js
function add(num){ return num + 3}
module.exports = {add:add}
引入模块
//app.jsvar
add = require('math');
console.log(add(2));
require的引入逻辑有很多种,具体的实现方法可以参考阮一峰老师的文章不难发现这是require引入的方式是同步的,在服务器端没问题,但是在浏览器端可能会造成长时间的卡顿,并且浏览器端引入代码是通过动态插入script标签的方式,而动态插入的script标签默认是async异步特性,所以不能保证各加载文件的执行顺序。所以在浏览器端出现了AMD/CMD规范。
AMD(异步模块定义),它采用一种回调的方式进行依赖加载,即先加载模块再执行代码。最典型的就是requireJS。定义和加载模块-语法define('ID',[dependencies],factory function)
CMD规范由来源于玉伯开发的Sea.js,一个文件便是一个模块。定义模块语法:
define(function(require,exports,module) { exports.methodOne = function(){ //暴露methodOne方法 } module.id = 'methodOne'})
加载模块
define(function(require,exports) {
//需要时
require var log = require('methodOne')
;})
AMD与CMD的差别是:AMD是首先加载所有模块,再执行,而CMD是按需加载。如今requireJS和seaJS都已经是过去时,webpack和Browserify成为主流
网友评论