深入剖析CommonJS modules和ECMAScript modules

目录

  • 前言
  • CommonJS:服务器端模块化的先驱
    • 背景与起源
    • 语法与机制
  • ECMAScript Modules:现代前端的基石
    • 背景与起源
    • 语法与机制
  • 比较与权衡
    • 语法差异
    • 加载机制
    • 编译时与运行时
    • 运行时行为
    • 构建第三方库
    • 现代开发环境
  • 结论

前言

在 JavaScript 生态系统中,模块化编程已经成为构建大型、可维护应用的关键技术。CommonJS 和 ECMAScript Modules (ESM) 作为两种主要的模块化标准,各自承载着历史的重量和未来的愿景。本文将深入探讨这两种模块系统的设计哲学、语法差异、运行时行为以及在现代开发环境中的地位变迁。

CommonJS:服务器端模块化的先驱

背景与起源

CommonJS 规范最初设计用于服务器端 JavaScript,特别是针对 Node.js 平台。它的出现解决了早期 JavaScript 应用中缺乏模块化支持的问题,使得开发者能够编写可重用、可维护的代码。

语法与机制

在 CommonJS 中,每个文件都被视为一个模块,拥有自己的作用域。模块的导出和导入通过 module.exports 和 require 函数实现:
创建一个module

// math.js
// 通过module.exports的形式导出模块
function add(a, b) {return a + b;
}
module.exports = {add: add
};//或者通过exports的形式导出
exports.add = function (a, b) {return a + b;
}

其他js文件中使用

// app.js
const math = require('./math');
console.log(math.add(1, 2)); // 输出:3

ECMAScript Modules:现代前端的基石

背景与起源

随着前端技术的发展,浏览器开始支持 ECMAScript Modules,这是一种更加现代化的模块化标准,旨在提供跨平台、跨环境的模块化解决方案。ESM 设计时考虑了浏览器和服务器端的通用性,同时也优化了模块的加载性能。

语法与机制

ESM 使用 import 和 export 关键字来定义模块的导出和导入:
创建模块

// math.mjs
export function add(a, b) {return a + b;
}

使用模块

// app.mjs
import { add } from './math.mjs';
console.log(add(1, 2)); // 输出:3

比较与权衡

语法差异

CommonJS 使用 require 和 module.exports,语法较为冗长。
ESM 使用 import 和 export,语法更为简洁,易于阅读和编写。

加载机制

CommonJS 是同步加载,适合于需要立即访问所有依赖的场景。
ESM 是异步加载,更适合于按需加载和性能优化。

编译时与运行时

CommonJS 的依赖解析发生在运行时,可能引入不确定性和性能开销。
ESM 的依赖解析发生在编译时,提高了加载效率和可预测性。

运行时行为

与 CommonJS 不同,ESM 的导入是异步的,这意味着 import 语句不会阻塞执行流程。ESM 还支持动态导入 (import()),允许在运行时按需加载模块,进一步提高了应用的性能和响应速度。

构建第三方库

在构建三方库时需要注意,如果构建ECMAScript Modules,那么在package.json里面需要配置type字段为 “module” ,如果构建CommonJS模块,则不需要配置type或者将type配置为 “commonjs”

现代开发环境

随着 Node.js 对 ESM 的原生支持,以及现代浏览器对 ESM 的广泛采纳,ESM 正逐渐成为 JavaScript 社区的首选模块化方案。然而,由于历史原因,许多现有的 Node.js 包仍然使用 CommonJS,这要求开发者在新旧模块系统间进行适当的桥接和转换。

结论

无论是 CommonJS 还是 ESM,它们都在各自的领域内发挥了重要作用。随着 JavaScript 生态系统的不断演进,ESM 凭借其现代特性和性能优势,正逐步成为行业标准。然而,CommonJS 的影响力不容忽视,尤其是在庞大的 Node.js 生态系统中。未来,我们期待看到更多的工具和框架能够无缝地支持两种模块系统,促进 JavaScript 社区的持续繁荣和发展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/48057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ学习实践一:MQ的安装

文章是本人在学习springboot实现消息队列功能时所经历的过程的记录,仅供参考,如有侵权请随时指出。 参考文章地址: RabbitMQ安装与入门_rabbitmq win11配置-CSDN博客 RabbitMQ入门到实战一篇文章就够了-CSDN博客 RabbitMQ系列&#xff08…

【LeetCode】十五、回溯法:括号生成 + 子集

文章目录 1、回溯法2、leetcode22:括号生成3、leetcode78:子集 1、回溯法 使用场景,如找[1,2,3]的所有子集: 2、leetcode22:括号生成 以n2为例,即两个左括号、两个右括号&#xff0c…

汇编实验5

本实验在32位Linux虚拟机中完成(点击查看安装教程) 实验内容 二进制炸弹实际是由C语言源程序生成的可执行目标代码,主程序可参考bomb.c。运行时,会按次序提示用户输入3个不同的字符串。如果输入的字符串有误,炸弹就会…

随手记:vsCode修改主题色为自定义颜色

因为工作需要长时间面对vscode,视力不好,想要把工具改成护眼色,于是就把vscode改成了自定义的护眼色 效果图: 操作步骤: 快捷键打开设置页面: 按住ctrlshiftp 选择Open setting 按回车键 打开setting页面编…

FlagEval 7月榜丨新增29个模型评测结果,智源发布评估技术报告《AI大模型能力全景扫描》

智源研究院FlagEval 7月榜单新增29个语言、多模态和文生图开源与闭源模型评测结果,包括阿里巴巴、OpenAI、快手、智谱等厂商近期发布的新模型。 本次评测发现,大语言模型,国产模型主观能力整体有所提升;视觉语言新模型的能力有所…

ArduPilot开源代码之AP_DAL_RangeFinder

ArduPilot开源代码之AP_DAL_RangeFinder 1. 源由2. 框架设计2.1 枚举 Status2.2 公有方法2.3 私有成员变量 3. 重要例程3.1 应用函数3.1.1 ground_clearance_cm_orient3.1.2 max_distance_cm_orient3.1.3 has_orientation3.1.4 get_backend 3.2 其他函数3.2.1 AP_DAL_RangeFind…

git config

文章目录 1.简介2.格式3.选项4.示例参考文献 1.简介 安装完 Git 后,需要对 Git 环境进行一次配置,且只需要配置一次。程序升级时会保留配置信息。 你可以在任何时候再次通过运行命令来修改它们。 Git 自带一个 git config 的工具来设置控制 Git 外观和…

AI(Adobe lliustrator)教程+软件包

简介: 软件主要应用于印刷出版、海报书籍排版、专业插画、多媒体图像处理和互联网页面的制作等,也可以为线稿提供较高的精度和控制,适合生产任何小型设计到大型的复杂项目。 通常用于创建LOGO(商标或徽标),图标,插图…

【数据结构】线性结构——数组、链表、栈和队列

目录 前言 一、数组(Array) 1.1优点 1.2缺点 1.3适用场景 二、链表(Linked List) 2.1优点 2.2缺点 2.3适用场景 三、栈(Stack) 3.1优点 3.2缺点 3.3适用场景 四、队列(Queue) 4.1优点…

根目录满迁移docker文件

在 Ubuntu 下,迁移 Docker 的数据存储位置到另一个挂载点需要按照以下步骤进行操作。确保在操作之前备份重要数据,以防止意外情况发生。 步骤概述 停止 Docker 服务: bash sudo systemctl stop docker创建新的存储位置: 假设你有…

递归式函数

在java中&#xff0c;函数递归是会报编译错误的。比如我定义一个斐波那契函数&#xff1a; public class RecursiveFunction {public static void main(String[] args) {fibonacci x -> x < 3 ? 1 : fibonacci.apply(x - 1) fibonacci.apply(x - 2);} }它就报了这个错…

设计模式-三大分类

软件七大设计原则 1、单一职责 定义&#xff1a;每个类应该只有一个引起它变化的原因。 解释&#xff1a;一个类只负责一个功能&#xff0c;这样可以减少类之间的耦合&#xff0c;提高系统的可维护性和可扩展性。 2、开闭原则 定义&#xff1a;软件实体&#xff08;类、模块…

使用Dockerfile构建镜像

通过基础镜像 centos:7&#xff0c;在该镜像中安装 jdk 和 tomcat 以后将其制作为一个新的镜像 mscentos:7 创建目录 mkdir -p /kong/docker/dockerfile编写 Dockerfile 文件 vim DockerfileDockerfile 文件内容如下&#xff1a; # 指明构建的新镜像是来自于 centos:7 基础…

广义可加模型和光滑曲线拟合的R代码

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

jvm-并发-java基础-数据结构小测

这篇文章是一些练习题&#xff0c;答案后续更新。 请简述银行家算法 请简述死锁产生的条件 解决死锁的几种方式 简述synchronized锁的膨胀 什么是cas cas 的问题如何解决 jmm 简单理解 volatile 单例模式 线程安全的两种代码 懒汉&恶汉 线程池的7个参数分别是什么…

ABAQUS细观混凝土周期性边界(PBC)表征体元(REV)界面层(ITZ)及砂浆塑性损伤(CDP)模拟

混凝土的细观结构决定着其宏观破坏行为&#xff0c;对混凝土在结构尺度上采用细观模型将导致巨大的计算量而难以实现&#xff0c;表征体元&#xff08;‌REV&#xff09;‌方法可选取一定的平均范围来描述混凝土的性质和行为&#xff0c;这对于理解和模拟混凝土的损伤机理至关重…

构建高可用应用的设计模式与实践

高可用性&#xff08;High Availability, HA&#xff09;是现代分布式系统中必不可少的特性之一。高可用应用能够在面对系统故障、网络分区或资源压力等多种情况下&#xff0c;依然保证服务的连续性和稳定性。本文将介绍构建高可用应用的常见设计模式与实践&#xff0c;并提供J…

测试用例的设计方法

等价类 等价类概念&#xff1a;在所有测试的数据中&#xff0c;具有某种共同特征的数据子集 边界值 边界值分析是对程序输入或输出的边界值进行测试的一种黑盒测试方法 边界值是作为等价类的补充&#xff0c;其主要区别是&#xff1a; 边界值测试设计不是从某一个等价类中…

nacos注释配置未生效?

遇到的问题 Nacos中修改配置将配置的key 的注释&#xff0c;配置未发生变更问题 NacosValueAnnotationBeanPostPorcessor中有&#xff0c;获取key&#xff0c;是获取的所有注解上的值&#xff0c;而values是enviroment中的属性值 当我们注释掉nacos中的属性时&#xff0c;ke…

15. 【C++】详解搜索二叉树 | KV模型

目录 1.定义 初始化 插入 查找 删除 完整代码 2.运用 K 模型和 KV 模型详解 K 模型 KV 模型 代码解释 为了更好地理解 map 和 set 的特性&#xff0c;和后面讲解查找效率极高的平衡搜索二叉树&#xff0c;和红黑树去实现模拟&#xff0c;所以决定在这里对搜索二叉树…