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

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

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

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

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...