模块化

作者: 行走的蛋白质 | 来源:发表于2019-12-19 15:15 被阅读0次
    • 为什么要使用模块化,都有哪几种方式可以实现模块化,各有什么特点?
    • Proxy 可以实现什么功能?数据响应式
    模块化的好处
    • 解决命名冲突
    • 提供复用性
    • 提高代码可维护性
    实现模块化的方法
    • 立即执行函数
    // 在早期,使用立即执行函数实现模块化是常见的手段,通过函数作用域解决了命名冲突、污染全局作用域的问题
    (function(globalVariable){
       globalVariable.test = function() {}
       // ... 声明各种变量、函数都不会污染全局作用域
    })(globalVariable)
    
    • AMD 和 CMD
    // AMD
    define(['./a', './b'], function(a, b) {
      // 加载模块完毕可以使用
      a.do()
      b.do()
    })
    // CMD
    define(function(require, exports, module) {
      // 加载模块
      // 可以把 require 写在函数体的任意地方实现延迟加载
      var a = require('./a')
      a.doSomething()
    })
    
    • CommonJS
    // a.js
    module.exports = {
        a: 1
    }
    // or 
    exports.a = 1
    
    // b.js
    var module = require('./a.js')
    module.a // -> log 1
    
    • ES Module
    // 引入模块 API
    import XXX from './a.js'
    import { XXX } from './a.js'
    // 导出模块 API
    export function a() {}
    export default function() {}
    
    ES Module 是原生实现的模块化方案,与 CommonJS 有以下几个区别
    • CommonJS 支持动态导入,也就是 require(${path}/xx.js),后者目前不支持,但是已有提案
    • CommonJS 是同步导入,因为用于服务端,文件都在本地,同步导入即使卡住主线程影响也不大。而后者是异步导入,因为用于浏览器,需要下载文件,如果也采用同步导入会对渲染有很大影响
    • CommonJS 在导出时都是值拷贝,就算导出的值变了,导入的值也不会改变,所以如果想更新值,必须重新导入一次。但是 ES Module 采用实时绑定的方式,导入导出的值都指向同一个内存地址,所以导入值会跟随导出值变化
    • ES Module 会编译成 require/exports 来执行的

    相关文章

      网友评论

          本文标题:模块化

          本文链接:https://www.haomeiwen.com/subject/qewmnctx.html