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代码演示 需求 代码演示ÿ…...
Spring WebFlux与Spring MVC
Spring WebFlux 是对 Spring Boot 项目中传统 Spring MVC 部分的一种替代选择,主要是为了解决现代 Web 应用在高并发和低延迟场景下的性能瓶颈。 1.WebFlux 是对 Spring MVC 的替代 架构替代: Spring MVC 使用的是基于 Servlet 规范的阻塞式模型…...
【深度学习基础】一篇入门模型评估指标(分类篇)
🌈 个人主页:十二月的猫-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以后,可以使用Scrapy自带的命令来创建一个工程模板。 一、创建项目 使用Scrapy创建工程的命令为: scrapy startproject <工程名> 例如,创建一个抓取百度的Scrapy项目,可以将命令写为: scrapy s…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
