首页 > 其他分享 >请说说commonJS模块与ES模块的差异有哪些?

请说说commonJS模块与ES模块的差异有哪些?

时间:2024-12-03 09:46:48浏览次数:6  
标签:commonJS 作用域 CommonJS module 模块 import ES

CommonJS 模块和 ES 模块是 JavaScript 中两种不同的模块系统,它们在语法、执行时机、动态导入等方面存在显著差异。

1. 语法:

  • CommonJS: 使用 require() 同步加载模块,使用 module.exportsexports 导出模块成员。

    // 模块A
    const add = (a, b) => a + b;
    module.exports = { add };
    
    // 模块B
    const { add } = require('./moduleA'); 
    
  • ES 模块: 使用 import 语句导入模块,使用 export 语句导出模块成员。

    // 模块A
    export const add = (a, b) => a + b;
    
    // 模块B
    import { add } from './moduleA';
    

2. 执行时机:

  • CommonJS: 模块加载和执行是同步的。require() 会阻塞代码执行,直到模块加载完成。这意味着 CommonJS 模块的执行顺序与它们在代码中出现的顺序一致。

  • ES 模块: 模块加载和执行是异步的。import 语句不会阻塞代码执行,浏览器会在后台加载模块。ES 模块的执行顺序取决于模块之间的依赖关系和浏览器的加载策略。 所有导入的模块都会在当前模块的顶层作用域之前执行。

3. 动态导入:

  • CommonJS: 支持动态导入,但需要使用 require(),并且是同步的。

    const modulePath = './module' + someVariable;
    const myModule = require(modulePath);
    
  • ES 模块: 支持动态导入,使用 import() 函数,并且是异步的,返回一个 Promise。

    const modulePath = './module' + someVariable;
    import(modulePath).then(module => {
        // 使用 module
    });
    

4. 顶层作用域:

  • CommonJS: 每个模块都有自己的顶层作用域。在一个模块中定义的变量、函数等不会污染全局作用域,也不会被其他模块直接访问,除非显式导出。

  • ES 模块: ES 模块的顶层作用域是共享的。这意味着在 ES 模块顶层声明的变量、函数等,在其他导入该模块的地方是可见的,类似于全局变量。 但是,ES 模块的设计理念仍然鼓励尽可能地使用 exportimport 来管理模块之间的依赖关系,而不是依赖共享的顶层作用域。

5. 兼容性:

  • CommonJS: 主要用于 Node.js 环境,浏览器端需要使用构建工具(如 Webpack、Browserify)进行转换。

  • ES 模块: 是 JavaScript 的标准模块系统,现代浏览器都原生支持 ES 模块。

总结:

特性 CommonJS ES 模块
语法 require(), module.exports, exports import, export
执行时机 同步 异步
动态导入 require() (同步) import() (异步)
顶层作用域 模块私有 模块共享 (但建议使用 export/import)
兼容性 Node.js 现代浏览器

选择哪种模块系统取决于你的项目环境和需求。 对于新的前端项目,推荐使用 ES 模块,因为它更现代化,性能更好,并且是 JavaScript 的标准。 对于 Node.js 项目,CommonJS 仍然是主流,但 ES 模块的支持也越来越好。 许多项目会混合使用两种模块系统,尤其是在过渡阶段。

标签:commonJS,作用域,CommonJS,module,模块,import,ES
From: https://www.cnblogs.com/ai888/p/18583380

相关文章

  • 【双堆懒删除】codeforces 1294 D. MEX maximizing
    前言双堆懒删除当需要维护若干元素中的最大值(或最小值)时,可以用一个堆维护,但是堆只擅长处理堆顶元素,对堆中任意元素的处理就束手无策了。此时,可以引入另外一个堆,我们定义原来的堆为保存堆\(ex\),新的堆为懒删除堆\(de\)。那么当需要从保存堆中删除任意一个元素时,可以先将元素放......
  • [PaperReading] HuBERT: Self-Supervised Speech Representation Learning by Masked
    目录HuBERT:Self-SupervisedSpeechRepresentationLearningbyMaskedPredictionofHiddenUnitsTL;DRMethodLearningtheHiddenUnitsforHuBERTRepresentationLearningviaMaskedPredictionLearningwithClusterEnsemblesImplementationExperiment效果可视化总结与......
  • kube-proxy的iptables工作模式分析
    系列文章目录iptables基础知识文章目录系列文章目录前言一、kube-proxy介绍1、kube-proxy三种工作模式2、iptables中k8s相关的链二、kube-proxy的iptables模式剖析1.集群内部通过clusterIP访问到pod的流程1.1.流程分析2.从外部访问内部serviceclusterIP后端pod的流......
  • Wireshark网络协议抓包解析(二)分析TCP HTTP协议
    实验分析前准备通过curl-I baidu.com 分析TCP HTTP协议在http捕捉中找到目的ipip.addr==110.242.68.66(换成对应目的ip)过滤以下是对每个步骤的详细解释:TCP三次握手建立连接:数据包25:源IP 192.168.76.18 向目标IP 110.242.68.66 发送一个TCPSYN包,请求建......
  • CS61B srping 2018 examprep01(?02) https://sp18.datastructur.es/
    1.写出第21、24行的运行结果。(画出box-pointer指示图会对答题很有帮助)1publicclassShock{2publicstaticintbang;3publicstaticShockbaby;4publicShock(){5this.bang=100;6}7publicShock(intnum){8this.bang=num;9baby=starter();10this......
  • test plateform-00-测试平台设计蓝图规划
    前言大家好,我是老马。最近想设计实现一个测试平台,基本的拼图已经收集的差不多了。后续就是一步步来落地实践了!设计蓝图技术生态测试开源组件data-factory:Autogeneratemockdataforjavatest.(便于Java测试自动生成对象信息)junitperf:Junitperformancerelyo......
  • Task04 :Variables and Functions
    变量在Python中,变量是用来存储数据的。它不需要像C语言中需要对变量的类型进行定义,Python会根据赋值自动确认变量的类型。变量的命名规则:必须以字母或下划线开头。只能包含数字、字母、下划线。变量只是一个名称,用于与数据进行联系。定义变量时,现在内存空间中申请一块地......
  • 6570USST Ladder Based State Design Exercise
    SchoolofEngineeringCourseworkTitle:  StateDrivenDesignofaSequentialLadderDiagramProgram.ModuleName:AutomationandIoTModuleCode:6570USSTLevel:6Weighting:Pass/FailtoSupportthe20%QuizComponentLmentisanexerciseinStateDrive......
  • 几种将word/wps文本中的英文/数字设置为Times New Roman格式的方法
        本文将简短介绍一下如何快速将word/wps中既有中文又有英文/数字文本中的英文/数字设置为TimesNewRoman格式,并且中文格式保持不变。    我们很多人在用word写文件、论文和报告时会碰到这种问题,我的正文或者标题部分有中文、英文和数字,中文的格式要求一般......
  • testnet 资产管理系统 侦察|扫描|信息收集|网络空间搜索
    TestNet简介TestNet资产管理系统旨在提供全面、高效的互联网资产管理与监控服务,构建详细的资产信息库。该系统能够帮助企业安全团队或渗透测试人员对目标资产进行深入侦察和分析,提供攻击者视角的持续风险监测,协助用户实时掌握资产动态,识别并修复安全漏洞,从而有效收敛攻击面,提升......