这是我参与8月更文挑战的第二十四天,活动详情查看:8月更文挑战”
刚和朋友在外面小吃了一顿。然后步行回家,大概走到5km,说实话很久没有运动了。走这么远。感觉脚好酸,看来以后自己还是要好好锻炼锻炼了,咱今天就废话不多说,直接进入正题。Let's go!
模块化
ES6 的模块化
在有 Babel 的情况下,我们可以直接拿起 ES6 的模块化语法直接用,干他丫的
// file a.js
export function a() {}
export function b() {}
// file b.js
export default function() {}
// file c.js 导入
import {a, b} from './a.js'
import XXX from './b.js
CommonJS
CommonJs 是 Node 独有的规范,写node的同学相比是日常见到的,嗯哈
// a.js
module.exports = {
value: 1
}
// or
exports.value = 1
// b.js
var module = require('./a.js')
module.value
// 1
上述代码中,我们发现module.exports 和 exports 都可以实现,那他两有啥区别呢?
// 这⾥其实就是包装了⼀层⽴即执⾏函数,避免污染全局变量,
module.exports = {
value: 1
}
// 基本实现
var module = {
exports: {} // exports 就是个空对象
}
// 这个是为什么 exports 和 module.exports ⽤法相似的原因
var exports = module.exports
var load = function (module) {
// 导出的东⻄
var value = 1
module.exports = value
return module.exports
};
再来说说module.exports 和 exports ,⽤法其实是相似的,但是不能对exports直接赋值,不会有任何效果。
-
对于 CommonJS 和 ES6中的模块化的两者区别是:
-
前者⽀持动态导⼊,也就是require(${path}/xx.js) ,后者⽬前不⽀持,
-
⽽后者是异步导⼊
-
但是后者采⽤引用的形式,导⼊导出的值都指向同⼀个内存地址,所以导⼊值会跟随导出值变化
-
后者会编译成require/exports 来执⾏的
-
AMD
AMD 是由RequireJS 提出的
// AMD
define(['./a', './b'], function(index, indexy) {
index.did()
indey.did()
})
define(function(require, exports, module) {
var index = require('./a')
index.doSomething()
var indey = require('./b')
indey.doSomething()
})
END~~~