题目1: 为什么要使用模块化?
使用模块化的主要目的:解决命名冲突和依赖管理
还有可以提高代码的可读性,代码解耦,提高复用性。
题目2: CMD、AMD、CommonJS 规范分别指什么?有哪些应用
AMD,Asynchronous Module Definition,异步模块定义。AMD规范指定一种机制,在该机制下模块和依赖可以异步加载。这对浏览器端的异步加载尤其适用。
语法:define(id?,dependencies?,factory)
id:定义中模块的名字,可选参数,如果没有提供,则默认为模块加载器请求的指定脚本的名字。
denpendencies:依赖参数,可选。
factory:需要执行的函数或对象,必选。
例:
define('modal',['jQuery','dialog'],function($,Dialog){
$('.modal').show()
Dialog.open()
})
表示,定义的模块名为modal,使用了jQuery和Dialog方法,调用模块'jQuery','dialog'。
实现AMD的库:'RequireJS','curl','Dojo'
CommonJS 是服务器端模块的规范,Node.js采用这个规范。
require和exports
require,一个自由变量,是一个函数,接收一个模块标识符,返回该模块所输出的API
exports,一个自由变量,是一个函数,模块输出的唯一表示方法,即将各种输出(API)加入到exports中
例:
//math.js
exports.add = function(){
var sum = 0,i = 0, args = arguments, l = args.length
while(i < l){
sum += args[i++]
}
return sum
} //写一个add方法加入到exports中
//increment.js
var add = require('math').add //通过require接收math模块,并执行,调用里面的add方法
exports.increment = function(val){
return add(val,1)
} //写一个increment方法加入到exports中
//program.js
vat inc = require('increment').increment
//通过require接收increment模块,并执行,increnment模块里面的require接收math模块并执行,最终实现add,math.js为increment.js的依赖模块。
var a = 1
inc(a) // 2
CMD,Common Module Definition,也是一种模块化思想。一个模块就是一个文件
语法:define(factory)
例:
//math.js
define(function(require,exports,module){
exports.add = function(){
var sum = 0,i = 0, args = arguments, l = args.length
while(i < l){
sum += args[i++]
}
return sum
}
})
//increment.js
define(function(require,exports,module){
var add = require('math').add
exports.increment = function(val){
return add(val,1)
}
})
//program.js
define(function(require,exports,module){
vat inc = require('increment').increment
var a = 1
inc(a) // 2
module.id == "program"
})
