当前位置: 首页 > 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…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...