CommonJS和ES Module

news/2024/7/19 14:35:35 标签: 前端, 笔记, js

CommonJS

关键词:

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

原理:

js">// 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;
}

ES Module

关键词:

  • 官方标准

  • 使用新语法实现

  • 所有环境均支持

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

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

  • 动态依赖是异步的

  • 符号绑定

关于符号绑定:

js">// 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. 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. 下面的模块导出了什么结果?

    js">exports.a = 'a';
    module.exports.b = 'b';
    this.c = 'c';
    module.exports = {
      d: 'd'
    }
    

    参考答案:

    js">{ d: 'd' }
    
  4. 下面的代码输入什么结果?

    js">// 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
    

http://www.niftyadmin.cn/n/5044449.html

相关文章

博客摘录「 dubbo接口超时和重试次数问题」2023年9月23日

如果不设置dubbo解救超时时间,默认是1s,重试次数是2次,在调用dubbo接口时,会存在超过1s的接口响应时间,这时,就会重新发送请求,而在dubbo提供方逻辑还没有走完,就会由于接口响应时间…

学习Shader中的光前了解光学简史

文章目录 前言一、光学的定义在这里插入图片描述 二、光的重要性和视觉息息相关 三、萌芽时期在这里插入图片描述 四、几何光学时期五、波动光学时期六、量子光学时期七 、现代光学时期 前言 引入光之前,我们只能使用Shader制作一些特效Shader、屏幕后处理Shader、…

vue如何使用socket与服务端进行通信

1、定义socket var ws new WebSocket(wss://地址); 2、进行连接,同时每5秒钟发送心跳一次 ws.onopen () > {console.log(open);// params为与服务端定义好的参数ws.send(JSON.stringify(params));this.sendTimmer setInterval(function () {ws.send(Hi Ser…

树莓派环境配置

树莓派开启SSH 在命令行中开启服务 打开终端输入以下指令: sudo systemctl start ssh关闭树莓派防火墙: systemctl stop firewalldSSH软件连接树莓派 首先查看树莓派的ip地址 命令行输入: ifconfig找到树莓派的ip后 打开MobaXterm 配…

EasyEdit: An Easy-to-use Knowledge Editing Framework for Large Language Models

本文是LLM系列文章,针对《EasyEdit: An Easy-to-use Knowledge Editing Framework for Large Language Models》的翻译。 EasyEdit:一个易于使用的大型语言模型知识编辑框架 摘要1 引言2 背景3 设计和实现4 评估5 实验6 结论和未来工作 摘要 大型语言模…

el-table 指定层级展开

先来看看页面默认全部展开时页面的显示效果&#xff1a;所有节点被展开&#xff0c;一眼望去杂乱无章&#xff01; 那么如何实现只展开指定的节点呢&#xff1f;最终效果如下&#xff1a;一眼看去很舒爽。 干货上代码&#xff1a; <el-table border v-if"refreshTabl…

解决jetbrains-toolbox缺失修改安装路径默认安装C盘问题

前一阵子使用 ToolBox 的时候还可以修改 IDEA 的安装路径&#xff0c;但是过了一段时间在家里电脑发现无法没有了修改安装路径这一选项&#xff0c;庞大的 IDEA 软件累积起来C盘的空间也日趋臃肿&#xff0c;有强迫症的程序员怎么会让它安装在C盘呢&#xff1f; 如图所示&…

【送面试题】构建高可用的秒杀系统:应对Redis集群崩溃的终极指南

AIGC专栏/AI绘画教程/java面试题领取 引言 秒杀系统是电子商务领域的一个热门应用场景&#xff0c;它要求在极短的时间内处理大量用户请求&#xff0c;确保高可用性和数据一致性。其中&#xff0c;Redis是一个常用的数据存储组件&#xff0c;但在极端情况下&#xff0c;Redis…