• CommonJS和ES Module


    CommonJS

    关键词:

    • 社区标准
    • 使用函数实现
    • 仅node环境支持
    • 动态依赖(需要代码运行后才能确定依赖)
    • 动态依赖是同步执行的

    原理:

    // require函数的伪代码
    function require(path){
      if(该模块有缓存吗){
        return 缓存结果;
      }
      function _run(exports, require, module, __filename, __dirname){
        // 模块代码会放到这里
      }
      
      var module = {
        exports: {}
      }
      
      _run.call(
        module.exports, 
        module.exports, 
        require, 
        module, 
        模块路径, 
        模块所在目录
      );
      
      把 module.exports 加入到缓存;
      return module.exports;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    ES Module

    关键词:

    • 官方标准

    • 使用新语法实现

    • 所有环境均支持

    • 同时支持静态依赖和动态依赖

      静态依赖:在代码运行前就要确定依赖关系

    • 动态依赖是异步的

    • 符号绑定

    关于符号绑定:

    // module a.js
    export var a = 1;
    export function changeA(){
      a = 2;
    }
    
    // index.js
    // 导入位置的符号和导出的符号并非赋值,它们完全是一个东西
    import {a, changeA} from './a.js';
    console.log(a); // 1
    changeA();
    console.log(a); // 2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    面试题

    1. commonjs 和 es6 模块的区别是什么?

      参考答案:

      1. CMJ 是社区标准,ESM 是官方标准
      2. CMJ 是使用 API 实现的模块化,ESM 是使用新语法实现的模块化
      3. CMJ 仅在 node 环境中支持,ESM 各种环境均支持
      4. CMJ 是动态的依赖,同步执行。ESM 既支持动态,也支持静态,动态依赖是异步执行的。
      5. ESM 导入时有符号绑定,CMJ 只是普通函数调用和赋值
    2. export 和 export default 的区别是什么?

      参考答案:

      export 为普通导出,又叫做具名导出,顾名思义,它导出的数据必须带有命名,比如变量定义、函数定义这种带有命名的语句。在导出的模块对象中,命名即为模块对象的属性名。在一个模块中可以有多个具名导出

      export default 为默认导出,在模块对象中名称固定为 default,因此无须命名,通常导出一个表达式或字面量。在一个模块中只能有一个默认导出。

    3. 下面的模块导出了什么结果?

      exports.a = 'a';
      module.exports.b = 'b';
      this.c = 'c';
      module.exports = {
        d: 'd'
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      参考答案:

      { d: 'd' }
      
      • 1
    4. 下面的代码输入什么结果?

      // module counter
      var count = 1;
      export {count}
      export function increase(){
        count++;
      }
      
      // module main
      import { count, increase } from './counter';
      import * as counter from './counter';
      const { count: c } = counter;
      increase();
      console.log(count);// 2
      console.log(counter.count);// 2
      console.log(c);// 1
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
  • 相关阅读:
    Web3 治理实践探讨:如何寻找多元化发展路径?
    TinyRenderer学习笔记--Lesson 3、4
    206. 反转链表
    Unity环境下实现Camera高帧率RTMP推送
    Java Integer compareTo()方法具有什么功能呢?
    SVG <pattern> 标签的用法和应用场景
    新型基础测绘与实景三维中国建设技术文件【3】基础地理实体空间身份编码规则
    腾讯云免费SSL证书申请流程_2023更新教程
    pyhon项目中,使用pip安装第三方插件之后,明明使用pip list可以查到,但是在项目中import时仍然找不到怎么办?
    二项队列----数据结构与算法分析6.8
  • 原文地址:https://blog.csdn.net/qq_53461589/article/details/133025061