当前位置: 首页 > news >正文

CommonJS 和 ES Modules 的 区别

CommonJS 和 ES Modules 的 区别

  • 1. CommonJS 和 ES Modules 区别?
    • 1.1 语法差异
      • CommonJS:
      • ES Modules:
    • 1.2. 加载机制
      • CommonJS:
      • ES Modules:
    • 1.3. 运行时行为
      • CommonJS:
      • ES Modules:
    • 1.4. 兼容性和使用场景
      • CommonJS:
      • ES Modules:
    • 1.5 总结
  • 2. node 从什么版本开始支持 ES Modules
  • 3. 那高版本还区分 ES Modules 和 commonjs 吗?是否可以共存
    • 3.1 区分 ESM 和 CommonJS
    • 3.2 互操作性
      • 从 CommonJS 模块导入 ES Module:
      • 从 ES Module 导入 CommonJS 模块:
    • 3.3 共存的注意事项
    • 3.4 总结

说明:本文内容通过和 chatgpt 对话而来。

1. CommonJS 和 ES Modules 区别?

CommonJS 和 ES Modules 是 JavaScript 中最常用的两种模块系统,它们在语法、加载机制和用途上有一些关键的区别。了解这些差异对于开发现代 JavaScript 应用程序非常重要。

1.1 语法差异

CommonJS:

  • 使用 require() 来导入模块。
  • 使用 module.exports 或 exports 来导出模块。
// 导入模块
const express = require('express');// 导出模块
module.exports = someFunction;

ES Modules:

  • 使用 import 和 export 语法。
  • 支持导入和导出多个值,以及导入整个模块。
// 导入模块
import express from 'express';// 导出模块
export default someFunction;
// 或导出多个命名导出
export { someFunction, anotherFunction };

1.2. 加载机制

CommonJS:

  • 同步加载模块,这意味着模块在被 require() 调用时立即加载和执行。
  • 适用于服务器端,因为模块文件通常在本地磁盘上,可快速访问。

ES Modules:

  • 支持异步加载,使其更适合用于浏览器端,可以实现动态的导入。
  • 静态结构,可以在编译时进行分析,这有助于进行“树摇”(tree-shaking)以移除未使用的代码。
// 动态导入示例
import('some-module').then((module) => {// 使用模块
});

1.3. 运行时行为

CommonJS:

  • 每个模块在第一次被加载时执行,然后其导出的结果被缓存,后续的 require() 调用将返回同一份实例,即模块的单例。
  • 这种缓存机制有助于避免模块的重复执行。

ES Modules:

  • 导入的绑定是实时的,即导入的是一个活的连接,如果模块内部的值变了,导入它的模块也会得到更新的值。
  • 这种行为更类似于引用而非复制,使得模块间的交互更加动态。

1.4. 兼容性和使用场景

CommonJS:

  • 主要用于 Node.js。
  • 在 Node.js 中,CommonJS 是默认的模块系统,直到最近 Node.js 开始支持 ES Modules。

ES Modules:

  • 旨在成为 JavaScript 的官方模块系统。
  • 在现代浏览器中得到原生支持,并且现在 Node.js 也支持 ES Modules,但需要特定的配置(如 type: “module” 在 package.json 中)或使用 .mjs 扩展名。

1.5 总结

选择哪种模块系统通常取决于你的项目需求、目标平台(Node.js、浏览器或两者)以及个人或团队的偏好。ES Modules 由于其设计和特性,被视为未来的标准,但 CommonJS 由于其在 Node.js 中的深入使用和简单性,仍然非常重要和广泛使用。

2. node 从什么版本开始支持 ES Modules

Node.js 对 ECMAScript Modules (ESM) 的支持是逐步实现的,经历了多个版本的迭代和改进。以下是关于 Node.js 如何并在何时开始支持 ES Modules 的简要历史:

Node.js v8.5.0 (2017年): 这个版本首次引入了对 ECMAScript Modules (ESM) 的实验性支持。这需要在运行 Node.js 时使用 --experimental-modules 标志,并且模块文件需要使用 .mjs 扩展名。

Node.js v12.x (2019年): 从 Node.js v12 开始,ESM 的支持得到了进一步增强,并且在 Node.js 12 的后期版本中(特别是 v12.17.0 之后),对 ES Modules 的支持不再需要实验性标志(–experimental-modules)。

Node.js v13.2.0 (2019年): 从这个版本开始,Node.js 允许直接使用 .js 扩展名或 “type”: “module” 在 package.json 中声明来使用 ES Modules,而无需实验性标志。

Node.js v14 (2020年): Node.js v14 将 ES Modules 支持标记为稳定。从这个版本开始,ESM 在 Node.js 中被认为是稳定的,可以在生产环境中安全使用。

因此,可以说 Node.js 从版本 14 开始正式全面支持 ES Modules,而在此之前的版本中,ESM 支持要么是实验性的,要么是有限的。如果你打算在项目中使用 ES Modules,建议使用 Node.js v14 或更高版本以确保最佳兼容性和稳定性。

3. 那高版本还区分 ES Modules 和 commonjs 吗?是否可以共存

在 Node.js 的高版本中,ES Modules (ESM) 和 CommonJS (CJS) 仍然是两种不同的模块系统,它们可以在同一个项目中共存,但是有一些限制和特定的互操作方式需要遵守。下面是一些关键点,帮助理解如何在 Node.js 中同时使用这两种模块系统:

3.1 区分 ESM 和 CommonJS

文件扩展名和package.json的角色:

  • .mjs 文件总是被当作 ES Modules 处理。
  • .cjs 文件总是被当作 CommonJS 模块处理。
  • .js 文件的处理方式取决于其所在的 package.json 中的 “type” 字段。如果 “type” 设置为 “module”,则 .js 文件被当作 ES Modules;如果没有设置或设置为 “commonjs”,则 .js 文件被当作 CommonJS 模块。

3.2 互操作性

从 CommonJS 模块导入 ES Module:

  • 你可以使用 import() 函数动态地从 CommonJS 模块中导入 ES Module。这是一个返回 Promise 的异步操作。
  • 静态 import 语句(例如 import x from ‘module’)不能直接在 CommonJS 模块中使用来导入 ESM。

从 ES Module 导入 CommonJS 模块:

  • 在 ES Module 中,你可以使用静态 import 语句来导入 CommonJS 模块。Node.js 会自动处理 CommonJS 的默认导出,使其可通过默认导入使用。

例如,如果有一个 CommonJS 模块 module.cjs,你可以在 ES Module 中通过 import x from ‘./module.cjs’ 来导入它。

3.3 共存的注意事项

  • 设计和维护:尽管 ESM 和 CommonJS 可以在同一个项目中共存,但建议在新的 Node.js 项目中优先使用 ES Modules,因为它是未来的标准,提供了更好的静态分析和树摇(tree-shaking)能力。
  • 异步与同步加载:ES Modules 总是异步加载的,而 CommonJS 模块是同步加载的。这种差异可能会影响到模块加载和执行的顺序。
  • 依赖管理:在混合使用两种模块系统时,需要特别注意依赖管理和模块解析的规则,以避免出现运行时错误。

3.4 总结

总结来说,虽然 Node.js 支持在同一个项目中同时使用 ES Modules 和 CommonJS,但开发者需要了解两种系统的差异,并小心处理它们之间的互操作性。在长远来看,随着生态系统的发展,逐渐向 ES Modules 过渡将是一个趋势。

相关文章:

CommonJS 和 ES Modules 的 区别

CommonJS 和 ES Modules 的 区别 1. CommonJS 和 ES Modules 区别?1.1 语法差异CommonJS:ES Modules: 1.2. 加载机制CommonJS:ES Modules: 1.3. 运行时行为CommonJS:ES Modules: 1.4. 兼容性和使用场景Com…...

科技为翼 助残向新 高德地图无障碍导航规划突破1.5亿次

今年12月03日是第33个国际残疾人日。在当下科技发展日新月异的时代,如何让残障人士共享科技红利、平等地参与社会生活,成为当前社会关注的热点。 中国有超过8500万残障人士,其中超过2400万为肢残人群,视力障碍残疾人数超过1700万…...

Flink四大基石之Time (时间语义) 的使用详解

目录 一、引言 二、Time 的分类及 EventTime 的重要性 Time 分类详述 EventTime 重要性凸显 三、Watermark 机制详解 核心原理 Watermark能解决什么问题,如何解决的? Watermark图解原理 举例 总结 多并行度的水印触发 Watermark代码演示 需求 代码演示&#xff…...

Spring WebFlux与Spring MVC

Spring WebFlux 是对 Spring Boot 项目中传统 Spring MVC 部分的一种替代选择,主要是为了解决现代 Web 应用在高并发和低延迟场景下的性能瓶颈。 1.WebFlux 是对 Spring MVC 的替代 架构替代: Spring MVC 使用的是基于 Servlet 规范的阻塞式模型&#xf…...

【深度学习基础】一篇入门模型评估指标(分类篇)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. 模…...

D80【 python 接口自动化学习】- python基础之HTTP

day80 requests请求加入headers 学习日期:20241126 学习目标:http定义及实战 -- requests请求加入headers 学习笔记: requests请求加入headers import requestsurlhttps://movie.douban.com/j/search_subjects params{"type":…...

⽂件操作详解

⽬录 一 文件操作的引入 1 为什么使⽤⽂件? 2 什么是⽂件? 3 文件分类(1 从⽂件功能的⻆度来分类:程序⽂件/数据⽂件 2根据数据的组织形式:为⽂本⽂件/⼆进制⽂件) 二 ⽂件的打开和关闭 1 …...

双高(高比例新能源发电和高比例电力电子设备)系统宽频振荡研究现状

1 为什么会形成双高电力系统 (1)新能源发电比例增加 双碳计划,新能源革命,可再生能源逐步代替传统化石能源,未来新能源发电将成为最终能源需求的主要来源。 (2)电力电子设备数量增加 为了实…...

TorchMoji使用教程/环境配置(2024)

TorchMoji使用教程/环境配置(2024) TorchMoji简介 这是一个基于pytorch库,用于将文本分类成不同的多种emoji表情的库,适用于文本的情感分析 配置流程 从Anaconda官网根据提示安装conda git拉取TorchMoji git clone https://gi…...

使用 Python 中的 TripoSR 根据图像创建 3D 对象

使用 Python 中的 TripoSR 根据图像创建 3D 对象 1. 效果图2. 步骤图像到 3D 对象设置环境导入必要的库设置设备创建计时器实用程序上传并准备图像处理输入图像生成 3D 模型并渲染下载.stl 文件展示结果3. 源码4. 遇到的问题及解决参考这篇博客将引导如何使用Python 及 TripoSR…...

Spring 框架中AOP(面向切面编程)和 IoC(控制反转)

在 Spring 框架中,AOP(面向切面编程)和 IoC(控制反转)是两个核心概念,它们分别负责不同的功能。下面我将通过通俗易懂的解释来帮助你理解这两个概念。 IoC(控制反转) IoC 是 Inver…...

电机瞬态分析基础(7):坐标变换(3)αβ0变换,dq0变换

1. 三相静止坐标系与两相静止坐标系的坐标变换―αβ0坐标变换 若上述x、y坐标系在空间静止不动,且x轴与A轴重合,即,如图1所示,则为两相静止坐标系,常称为坐标系,考虑到零轴分量,也称为αβ0坐标…...

Open3D (C++) 生成任意3D椭圆点云

目录 一、算法原理1、几何参数2、数学公式二、代码实现三、结果展示一、算法原理 1、几何参数 在三维空间中,椭圆由以下参数定义: 椭圆中心点 c = ( x 0 , y 0 , z...

5.利用Pandas以及Numpy进行数据清洗

1、缺失值处理 import pandas as pd import numpy as np#创建一张7行5列带有缺失值的表,表中的数据0-100随机生成,索引是python1. df pd.DataFrame(datanp.random.randint(0,100,size(7,5)), index [i for i in pythonl])df.iloc[2,3] Nonedf.iloc[4…...

@Bean注解详细介绍以及应用

目录 一、概念二、应用(一)代码示例1、首先创建一个简单的 Java 类User2、然后创建一个配置类AppConfig3、在其他组件中使用Bean创建的 bean4、通过 Spring 的ApplicationContext来获取UserService并调用其方法 (二)bean的方法名详…...

基于SpringBoot的预制菜销售系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...

从 EXCEL 小白到 EXCEL 高手的成长之路

在职场与日常生活中,Excel 作为一款强大的数据处理与分析工具,扮演着不可或缺的角色。无论是初学者还是资深职场人士,掌握 Excel 技能都能极大地提高工作效率。那么,从一个 Excel 小白蜕变成为 Excel 高手,究竟需要多久…...

【纸飞机串口调试工具】数值显示器及四则运算

目录 纸飞机串口工具介绍软件下载适用场合功能介绍 纸飞机串口工具介绍 纸飞机一款性能强劲且专业的串口/网络/HID调试助手,具有多窗口绘图、关键字高亮、数据分窗和数据过滤等众多功能,可以极大的方便嵌入式开发人员的调试过程。本文介绍数值显示器的四…...

浅谈volatile

volatile有三个特性: (1)可见性 (2)不保证原子性 (3)禁止指令重排 下面我们一一介绍 (一)可见性 volatile的可见性是说共享变量只要修改,就可以被其他线…...

Python3 爬虫 Scrapy的使用

安装完成Scrapy以后&#xff0c;可以使用Scrapy自带的命令来创建一个工程模板。 一、创建项目 使用Scrapy创建工程的命令为&#xff1a; scrapy startproject <工程名> 例如&#xff0c;创建一个抓取百度的Scrapy项目&#xff0c;可以将命令写为&#xff1a; scrapy s…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...