Node.js 模块化规范详解

在 Node.js 中,模块化是开发应用程序的核心概念,它使得代码可以按照功能模块进行分割,易于维护、复用和扩展。Node.js 支持两种模块化规范:

  • CommonJS(CJS):这是 Node.js 最初使用的模块化规范。

  • ECMAScript Modules(ESM):这是现代 JavaScript 的官方模块化规范,自 ECMAScript 2015(ES6)引入。

1. CommonJS 模块化规范

CommonJS 是 Node.js 早期就支持的模块化标准,允许在服务端使用模块。在 CommonJS 中,每个文件都被视为一个独立的模块。你可以通过 module.exports 导出模块内容,并使用 require() 函数引入模块。

1.1. CommonJS 基本用法

  • 导出模块:使用 module.exports 或 exports。

  • 引入模块:使用 require()。

定义模块:

// math.js - 定义模块
function add(a, b) {return a + b;
}function subtract(a, b) {return a - b;
}// 使用 module.exports 导出模块
module.exports = {add,subtract,
};// 或者也可以使用 exports(两者作用相同)
exports.add = add;
exports.subtract = subtract;

引入模块:

// main.js - 引入并使用模块
const math = require('./math');console.log(math.add(5, 3));  // 输出:8
console.log(math.subtract(5, 3));  // 输出:2

1.2. CommonJS 特点

  • 同步加载:require() 是同步的,这意味着模块会在需要时同步加载。这在服务端是可以接受的,但在浏览器中不够高效。

  • 模块缓存:加载的模块会被缓存,因此多次 require() 同一个模块时,模块只会被加载一次。

2. ECMAScript Modules 规范

随着 JavaScript 语言的发展,ECMAScript Modules(ESM)被引入,成为 JavaScript 官方标准的模块系统。Node.js 从版本 12.17 开始支持 ESM,Node.js 通过引入 .mjs 文件扩展名和 package.json 中的 "type": "module" 字段来实现对 ESM 的支持。

2.1. ECMAScript Modules 基本用法

  • 导出模块:使用 export 关键字。

  • 引入模块:使用 import 关键字。

定义模块:

// math.mjs - 定义模块
export function add(a, b) {return a + b;
}export function subtract(a, b) {return a - b;
}

导入模块:

// main.mjs - 引入并使用模块
import { add, subtract } from './math.mjs';console.log(add(5, 3));  // 输出:8
console.log(subtract(5, 3));  // 输出:2

2.2. ESM 特点

  • 静态解析:ESM 是静态的,这意味着在代码编译时就能确定模块的依赖关系(相较于 CommonJS 的动态加载)。

  • 异步加载:import 支持异步加载,这在浏览器中更高效,特别是当你需要懒加载模块时。

  • 严格模式:所有的 ECMAScript 模块都默认处于严格模式("use strict")。

  • 不允许动态导入和导出:ESM 不支持像 CommonJS 那样的动态 require,必须在顶层进行 import/export。

3. 文件后缀与模块加载规则

3.1. CommonJS 文件后缀

对于 CommonJS 模块,文件通常使用 .js 后缀。如果你在 Node.js 中编写 CommonJS 模块,直接使用 .js 文件即可。

3.2. ECMAScript 模块的文件后缀

在 Node.js 中,可以通过以下两种方式启用 ESM:

  • 使用 .mjs 文件后缀:如果文件扩展名是 .mjs,Node.js 会将其视为 ESM。

  • 配置 package.json:在项目的 package.json 中设置 "type": "module",这样即使文件是 .js 后缀,Node.js 也会将其作为 ESM 处理。

3.3. 如何区分 CommonJS 和 ESM

Node.js 根据以下规则来确定模块系统:

  • CommonJS:默认情况下,Node.js 中所有 .js 文件都被视为 CommonJS 模块,除非另有指定。

  • ESM:当你使用 .mjs 扩展名,或者在 package.json 中指定 "type": "module",所有的 .js 文件都会被视为 ESM 模块。

4. require 和 import 互操作性

尽管 Node.js 支持 CommonJS 和 ESM 两种规范,但两者在一起使用时需要注意一些限制:

4.1. 从 CommonJS 中引入 ESM

从 CommonJS 文件中引入 ESM 模块是有一定限制的。require() 无法直接加载 ESM 模块,必须使用 import() 函数(它是一个异步函数)。

// 在 CommonJS 模块中动态引入 ESM 模块
(async () => {const math = await import('./math.mjs');console.log(math.add(5, 3));
})();

4.2. 从 ESM 中引入 CommonJS

ESM 模块可以直接通过 import 引入 CommonJS 模块,因为 Node.js 会将 CommonJS 模块包装成 ESM 格式以供使用。

// 在 ESM 中引入 CommonJS 模块
import math from './math.js';  // 假设 math.js 是一个 CommonJS 模块
console.log(math.add(5, 3));

5. 选择 CommonJS 还是 ESM?

在实际开发中,选择使用 CommonJS 还是 ESM 取决于几个因素:

  • 兼容性:如果你要支持旧的 Node.js 版本(12 之前)或使用大量依赖的第三方库(特别是历史遗留的),CommonJS 可能更合适。

  • 未来发展:ESM 是 JavaScript 官方标准,未来会有更多的支持,因此如果是新项目,推荐使用 ESM。

  • 生态系统:目前 Node.js 生态中的大多数库仍然使用 CommonJS,但越来越多的库开始迁移到 ESM。

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

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

相关文章

前端网络性能优化实践:从 HTTP 请求到 HTTPS 与 HTTP/2 升级

在前端性能优化体系中,服务端与网络层的优化是提升用户体验的关键环节。本文将围绕 HTTP 请求优化、Cookie 管理、服务器缓存配置、gzip 压缩、HTTPS 部署及 HTTP/2 升级等核心内容,系统拆解优化策略与实施方法,为团队技术分享提供完整的知识…

[数据结构——lesson8.树]

目录 引言 学习目标 1.树的概念及结构 1.1树的定义 1.2树的基本概念 1.3 树的表示 (1)双亲表示法 (2)孩子表示法 (3)左孩子右兄弟表示法 1.4 树在实际中的运用(表示文件系统的目录树结构) 结束语: 引言 之前我们学习了栈和队列数…

告别双系统——WSL2+UBUNTU在WIN上畅游LINUX

在Windows 11上配置WSL开发环境指南 最近换工作需要深入研究代码,发现WSL(Windows Subsystem for Linux)是微软为Windows开发者提供的强大工具,可以在Windows上直接运行Ubuntu子系统,无需双系统或虚拟机(满…

Python爬虫实战:研究Ticks and spines模块,构建电商数据采集和分析系统

1. 引言 1.1 研究背景 在信息时代,互联网数据呈现爆炸式增长,涵盖社会、经济、文化等多个领域,具有极高的研究与应用价值。如何高效获取目标数据并进行深度分析,成为信息处理领域的重要课题。Python 凭借其丰富的库支持和简洁的语法,在数据爬取与分析领域得到广泛应用:…

前端基础 —— B / CSS基础

一、CSS 基础概述定义&#xff1a;层叠样式表&#xff08;Cascading Style Sheets&#xff09;作用&#xff1a;美化页面、实现样式与结构分离二、CSS 基本语法与引入方式1. 语法规范选择器 {一条/N条声明}选择器决定针对谁修改 (找谁) 声明决定修改啥. (干啥)<style> p…

智能农机无人驾驶作业套圈路径规划

国产轻量级桌面GIS软件Snaplayers实践&#xff1a;智能农机无人驾驶作业套圈路径规划1、选择地块角点坐标文件2、加载地块到地图中3、设置套圈作业路径规划参数4、生成套圈作业路径5、查看套圈路径6、查看套圈路径8、完成本算法已经在国内外等农场已经使用多年。Snaplayers研发…

Java Collection集合框架:体系、核心与选型

目录 一、集合框架的顶层设计&#xff1a;接口与层次 1. 两大核心接口&#xff1a;Collection 和 Map 2. Collection接口的三大派系 二、核心实现类详解 1. List家族实现 2. Set家族实现 3. Queue/Deque家族实现 PriorityQueue&#xff1a; ArrayDeque&#xff1a; 三…

“计算机基础、软件工程、设计模式、数据结构算法、操作系统、数据库、网络、法律法规”是计算机领域从基础理论到工程实践

“计算机基础、软件工程、设计模式、数据结构算法、操作系统、数据库、网络、法律法规”是计算机领域从基础理论到工程实践、再到合规规范的核心知识体系&#xff0c;覆盖了软件开发、系统架构、技术合规等关键维度。以下将对每个领域进行系统拆解&#xff0c;包括核心内容、学…

利用Rancher平台搭建Swarm集群

一、Rancher概述1、rancher平台Rancher是一个开源的企业级容器管理平台&#xff0c;它可以帮助企业在生产环境中轻松快捷地部署和管理容器&#xff0c;也可以轻松管理各种环境的Kubernetes&#xff0c;并提供对DevOps的支持。Rancher目前已经具备全栈化一键部署应用、各种编排调…

Debezium日常分享系列之:MongoDB 新文档状态提取

Debezium日常分享系列之&#xff1a;MongoDB 新文档状态提取变更事件结构行为配置数组编码嵌套结构展平MongoDB $unset 处理确定原始操作添加元数据字段选择性应用转换的选项配置选项已知限制Debezium MongoDB 连接器会发出数据变更消息&#xff0c;以表示 MongoDB 集合中发生的…

OpenCV:图像透视变换

文章目录一、透视变换是什么&#xff1f;二、透视变换的核心原理1. 关键概念&#xff1a;透视变换矩阵2. 核心条件&#xff1a;4对对应点三、OpenCV实现透视变换的关键步骤步骤1&#xff1a;读取并预处理图像步骤2&#xff1a;寻找目标物体的4个顶点步骤3&#xff1a;计算透视变…

commons-csv

maven依赖<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-csv --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-csv</artifactId><version>1.14.1</version></dependency…

LeetCode 1446.连续字符

给你一个字符串 s &#xff0c;字符串的「能量」定义为&#xff1a;只包含一种字符的最长非空子字符串的长度。 请你返回字符串 s 的 能量。 示例 1&#xff1a; 输入&#xff1a;s “leetcode” 输出&#xff1a;2 解释&#xff1a;子字符串 “ee” 长度为 2 &#xff0c;只包…

CTFHub SSRF通关笔记9:302跳转 Bypass 原理详解与渗透实战

目录 一、SSRF与302跳转 1、SSRF 2、302响应 3、SSRF与302结合 &#xff08;1&#xff09;SSRF源码分析 &#xff08;2&#xff09;攻击链条&#xff08;Flow of Exploit&#xff09; 二、渗透实战 1、打开靶场 2、尝试127.0.0.1访问 3、file协议分析源码 &#xff…

Windows-Use实战:AI驱动的Windows自动化

Windows-Use实战:AI驱动的Windows自动化 前言 项目介绍与准备工作 Windows-Use是什么? 系统要求 必需环境 步骤一:安装Python和基础环境 1.1 安装Python 检查Python版本 Python安装步骤 1.2 创建项目目录 步骤二:安装Windows-Use 2.1 使用pip安装(推荐) 步骤三:运行和基…

STM32-FreeRTOS操作系统-二值信号量与计数信号量

引言在嵌入式开发领域&#xff0c;任务同步与通信是系统稳定运行的核心。STM32配合FreeRTOS操作系统&#xff0c;为开发者提供了强大的工具支持。其中&#xff0c;二值信号量和计数信号量作为FreeRTOS的关键同步机制&#xff0c;分别用于任务间的简单同步和资源计数控制。二值信…

MarTech营销技术全景解析:概念、图谱与最新实践案例

一、引言&#xff1a;为什么企业越来越依赖MarTech&#xff1f;在数字化浪潮下&#xff0c;企业营销环境正发生深刻变化&#xff1a;客户触点增加&#xff1a;从官网、社交媒体到短视频、展会&#xff0c;信息渠道呈指数级增长。决策链条复杂&#xff1a;B2B客户通常需要多轮调…

服务器 - 从一台服务器切换至另一台服务器(损失数十条访客记录)

服务器 - 从一台服务器切换至另一台服务器(损失数十条PV记录为代价) 看着四年的服务器正式到期&#xff0c;没什么轰轰烈烈的告别&#xff0c;就像目送老朋友转身走远&#xff0c;只默默记下&#xff1a;哦&#xff0c;原来它陪了我这么久啊。 前言 一台陪伴了我4年的服务器昨…

《云原生边缘与AI训练场景:2类高频隐蔽Bug的深度排查与架构修复》

在云原生技术向边缘计算与AI训练场景渗透的过程中&#xff0c;基础设施层的问题往往会被场景特性放大——边缘环境的弱网络、异构硬件&#xff0c;AI训练的高资源依赖、分布式协作&#xff0c;都可能让原本隐藏的Bug以“业务故障”的形式爆发。这些问题大多不具备直观的报错信息…

【51单片机】【protues仿真】基于51单片机数控直流稳压电源系统

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 一、主要功能 1、数码管显示输出电压值 2、滑动电阻调节输出电压 3、电压输出范围0-15V&#xff0c;步进值1 二、使用步骤 基于51单片机的数控直流稳压电源是一种通过数字控制实现电压调节的智…