zoukankan      html  css  js  c++  java
  • javascript模块化

    在有 Babel 的情况下,我们可以直接使用 ES6 的模块化

    // file a.js
    export function a() {}
    export function b() {}
    // file b.js
    export default function() {}
    
    import {a, b} from './a.js'
    import XXX from './b.js'
    

    CommonJS规范

    CommonJs 是 Node 独有的规范,浏览器中使用就需要用到 Browserify 解析了

    // a.js
    module.exports = {
        a: 1
    }
    // or
    exports.a = 1
    
    // b.js
    var module = require('./a.js')
    module.a // -log 1
    

    在上述代码中,module.exports 和 exports 很容易混淆,让我们来看看大致内部实现

    
    var module = require('./a.js')
    module.a
    // 这里其实就是包装了一层立即执行函数,这样就不会污染全局变量了,
    // 重要的是 module 这里,module 是 Node 独有的一个变量
    module.exports = {
        a: 1
    }
    // 基本实现
    var module = {
      exports: {} // exports 就是个空对象
    }
    // 这个是为什么 exports 和 module.exports 用法相似的原因
    var exports = module.exports
    var load = function (module) {
        // 导出的东西
        var a = 1
        module.exports = a
        return module.exports
    };
    

    再来说说 module.exports 和 exports,用法其实是相似的,但是不能对 exports 直接赋值,不会有任何效果。

    对于 CommonJS 和 ES6 中的模块化的两者区别是:

    • 前者支持动态导入,也就是 require(${path}/xx.js),后者目前不支持,但是已有提案
    • 前者是同步导入,因为用于服务端,文件都在本地,同步导入即使卡住主线程影响也不大。而后者是异步导入,因为用于浏览器,需要下载文件,如果也采用同步导入会对渲染有很大影响
    • 前者在导出时都是值拷贝,就算导出的值变了,导入的值也不会改变,所以如果想更新值,必须重新导入一次。但是后者采用实时绑定的方式,导入导出的值都指向同一个内存地址,所以导入值会跟随导出值变化
    • 后者会编译成 require/exports 来执行的

    AMD

    AMD 是由 RequireJS 提出的

    // AMD
    define(['./a', './b'], function(a, b) {
        a.do()
        b.do()
    })
    define(function(require, exports, module) {
        var a = require('./a')
        a.doSomething()
        var b = require('./b')
        b.doSomething()
    })
    

    参考资料:
    前端进阶之道

  • 相关阅读:
    洛谷 P1508 Likecloud-吃、吃、吃
    Codevs 1158 尼克的任务
    2017.10.6 国庆清北 D6T2 同余方程组
    2017.10.6 国庆清北 D6T1 排序
    2017.10.3 国庆清北 D3T3 解迷游戏
    2017.10.3 国庆清北 D3T2 公交车
    2017.10.3 国庆清北 D3T1 括号序列
    2017.10.4 国庆清北 D4T1 财富
    2017.10.7 国庆清北 D7T2 第k大区间
    2017.10.7 国庆清北 D7T1 计数
  • 原文地址:https://www.cnblogs.com/guangzan/p/11270618.html
Copyright © 2011-2022 走看看