JavaScript进阶(三)模块化

221 阅读2分钟

这是我参与8月更文挑战的第二十四天,活动详情查看:8月更文挑战

JavaScript进阶

JavaScript进阶(二)

刚和朋友在外面小吃了一顿。然后步行回家,大概走到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~~~