Node.js中不支持require和import两种导入模块的混用

最近在整理Node.js相关的知识点,发现通过Node.js支持的两个模块导入语句require和import在同时使用时会发生错误,而且错误非常诡异。
例如,在先使用require导入模块,在使用import导入模块时,出现require无法识别,
在先使用import导入模块,在使用require导入模块时,同样出现了require无法识别,建议使用import代替。

ReferenceError: require is not defined in ES module scope, you can use import instead
const readFile = require('fs').readFile;^ReferenceError: require is not defined in ES module scope, you can use import insteadat file:///d:/Software/Electron/JavaScript/LearnProject/NodeJsProject/BasicModules/FileOperation.js:10:18at ModuleJob.run (node:internal/modules/esm/module_job:271:25)at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:547:26)at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:116:5)Node.js v22.13.1
'use strict'
//const {randomInt} = require('node:crypto');
import {randomInt} from 'node:crypto';
const n = randomInt(0,100);
console.log('BasicModules.js: randomInt:', n);//import {readFile} from 'node:fs';
const readFile = require('fs').readFile;
console.log("BasicModules.js: readFile start");readFile('BasicModules.js', 'utf-8', (err, data)=>{if (err) {console.log('BasicModules.js: readFile error:', err);} else {console.log('BasicModules.js: readFile data:', data);}
});console.log("BasicModules.js: readFile End");

Node.js 中无法同时使用 require 和 import 的根本原因在于两种模块系统的设计差异。以下是具体原因和解决方案的总结:

模块系统差异

  1. CommonJS(require)
    Node.js 原生支持的模块系统,同步加载模块,适用于服务端开发。
    通过 module.exports 导出,require() 导入,本质是运行时加载。
  2. ES 模块(import/export)
    官方标准化模块系统,异步加载,支持静态分析,适用于浏览器和现代 Node.js 环境。
    通过 export 导出,import 导入,编译时确定依赖关系。

报错原因分析

当文件被识别为 ES 模块 时(文件中使用了import就会自动识别为ES模块)

Node.js 默认禁用 require,因为 ES 模块设计上要求代码静态化,而 require 是动态的[[1][3]6。
错误 ReferenceError: require is not defined in ES module scope 表明当前文件被识别为 ES 模块,但尝试使用了 CommonJS 语法。

1. 解决方案

1.1 统一模块类型

方法一:显式声明模块类型
在 package.json 中添加 “type”: “module”,所有 .js 文件默认视为 ES 模块;使用 .cjs 扩展名表示 CommonJS 模块。

方法二:动态兼容
在 ES 模块中通过 createRequire 引入 require:

import { createRequire } from 'module';
const require = createRequire(import.meta.url); 
// 之后可使用 require()

此方式允许在 ES 模块中局部使用 CommonJS 语法[[1][7]10。

1.2 模块互操作

导入 CommonJS 模块到 ES 模块
使用 import 导入时,CommonJS 模块会被包装为默认导出:

import fs from 'fs';  // 等同于 require('fs').default 

导入 ES 模块到 CommonJS
需使用动态 import():

const loadModule = async () => {const esModule = await import('./es-module.mjs'); 
};

1.3 环境配置

Node.js 版本要求
确保版本 ≥ 14,并启用实验性 ES 模块支持(旧版本需添加 --experimental-modules 标志)。

文件扩展名
ES 模块建议使用 .mjs,CommonJS 使用 .cjs,避免解析歧义。

2. 最佳实践

项目级统一规范
新项目优先使用 ES 模块,老项目逐步迁移,避免混用。
工具链适配
使用 Babel 或 TypeScript 编译代码,兼容不同模块系统。

3. 总结

Node.js 中 require 和 import 的冲突源于模块系统的底层差异。通过统一模块类型、动态兼容或工具链适配,可解决这一问题。建议根据项目需求选择合适的模块方案,并遵循 Node.js 官方文档的模块互操作指南。

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

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

相关文章

Ubuntu22.04配置cuda/cudnn/pytorch

Ubuntu22.04配置cuda/cudnn/pytorch 安装cuda官网下载.run文件并且安装/etc/profile中配置cuda环境变量 cudnn安装官网找cuda版本对应的cudnn版本下载复制相应文件到系统文件中 安装pytorch官网找cuda对应版本的pytorchpython代码测试pytorch-GPU版本安装情况 安装cuda 官网下…

动态规划算法篇:枚举的艺术

那么本篇文章就正式进入了动态规划的算法的学习,那么动态规划算法也可谓是算法内容中的一座大山,那么在大厂算法笔试乃至算法比赛中出现的频率也逐渐变高,那么可见学习好动态规划算法的一个重要性,那么对于动态规划最难理解的&…

从入门到精通:Postman 实用指南

Postman 是一款超棒的 API 开发工具,能用来测试、调试和管理 API,大大提升开发效率。下面就给大家详细讲讲它的安装、使用方法,再分享些实用技巧。 一、安装 Postman 你能在 Postman 官网(https://www.postman.com )下…

Android平台基于SmartPlayer实现多实例RTSP|RTMP播放器

在 Android开发中,实现多实例的RTSP或RTMP直播播放器是一个常见的需求,本文将介绍如何利用大牛直播SDK的SmartPlayer模块接口,快速实现Android平台上的多实例播放器。通过合理的架构设计和 API 调用,我们可以轻松地管理多个播放实…

Linux中进程的状态3 进程的优先级1

目录 X(dead) && Z(zombie) 僵尸进程 && 孤儿进程 进程的优先级 如何修改进程的优先级 我们至此还剩两种状态没有查看,X和Z状态。 X(dead) && Z(zombie) X状态是进程死亡状态,Z状态依照这个词可知是进程处于僵死状态&…

基于语音的阿尔茨海默病检测识别

摘要 阿尔茨海默病 (AD) 是一种进行性神经退行性疾病,会严重损害认知功能,导致记忆力减退和其他行为改变。它是全球第七大死因,有数百万人受到影响。早期准确检测 AD 对于改善患者预后和减缓疾病进展至关重要。机器学习…

Ubuntu添加桌面快捷方式

以idea为例 一. 背景 在ubuntu中,很多时候是自己解压的文件并没有桌面快捷方式,需要自己找到对应的目录的执行文件手动打开,很麻烦 而只需要在 /usr/share/applications 中创建自定义的desktop文件就能自动复制到桌面 二. 添加方法 创建desk…

pycharm社区版虚拟环境如何配置、如何验证配置成功

1、无配置直接新建按照以下步骤: 新建——自定义环境——类型确定为虚拟 2、以前设置过的只需要将虚拟环境配置上就行了 选择文件——设置——对应文件下的解释器——选择带.ven的解释器 如何检查安装成功? 看终端开头是否显示.venv

【有啥问啥】DeepSeek 技术原理详解

DeepSeek 技术原理详解 DeepSeek 是一款具有突破性技术的大型语言模型,其背后的技术原理涵盖了多个方面,以下是对其主要技术原理的详细介绍: 架构创新 多头潜在注意力机制(MLA) 传送门链接: DeepSeek V3中的Multi-…

Java通过ollama平台接入DeepSeek

1、配置适配jdk8的依赖 <dependency><groupId>io.github.lnyo-cly</groupId><artifactId>ai4j-spring-boot-stater</artifactId><version>0.7.0</version> </dependency>2、配置bootstrap.yml ai:ollama:api-host: http://loc…

【Ai】使用AnythingLLM访问DeepSeek,界面友好,API调用

本文假设已经安装好Ollama 如果还没安装可以看见这个https://blog.csdn.net/wlddhj/article/details/145418880 AnythingLLM是Mintplex Labs推出的一款功能强大的全栈AI应用程序&#xff1a; 功能特点 支持多种LLM和数据库&#xff1a;支持OpenAI、Azure OpenAI、AWS Bedrock…

猿大师播放器与其他网页播放RTSP方案对比有哪些优势?

1. 超低延迟播放&#xff08;300毫秒级&#xff09; - 基于VLC/FFPLAY引擎直接调用本地硬件解码&#xff0c;无需服务器转码&#xff0c;延迟低至300毫秒&#xff0c;远低于传统转码方案&#xff08;通常1-3秒&#xff09;。在消防、安防等场景中&#xff0c;毫秒级延迟可显著…

Breakout Tool

思科 CML 使用起来还是很麻烦的&#xff0c;很多操作对于习惯了 secure crt 或者 putty 等工具的网络工程师都不友好。 Breakout Tool 提供对远程实验室中虚拟机控制台与图形界面的本地化接入能力&#xff0c;其核心特性如下&#xff1a; Console 访问&#xff1a;基于 Telnet…

c语言易错题(选择)

这里给大家讲一下c语言部分遗留的选择题&#xff0c;用来巩固知识&#xff0c;一共13道题 1 答案解析 A&#xff1a;正确 不同的函数属于不同的作用域&#xff0c;因此不同的函数中定义相同名字的变量不会冲突 B&#xff1a;正确 在C语言中&#xff0c;函数的形参一般都是通过参…

《Python实战进阶》专栏 No2: Flask 中间件与请求钩子的应用

专栏简介 《Python实战进阶》专栏共68集&#xff0c;分为 模块1&#xff1a;Web开发与API设计&#xff08;共10集&#xff09;&#xff1b;模块2&#xff1a;数据处理与分析&#xff08;共10集&#xff09;&#xff1b;模块3&#xff1a;自动化与脚本开发&#xff08;共8集&am…

机器学习:k近邻

所有代码和文档均在golitter/Decoding-ML-Top10: 使用 Python 优雅地实现机器学习十大经典算法。 (github.com)&#xff0c;欢迎查看。 K 邻近算法&#xff08;K-Nearest Neighbors&#xff0c;简称 KNN&#xff09;是一种经典的机器学习算法&#xff0c;主要用于分类和回归任务…

初识Linux(9):程序地址空间

实验&#xff1a; 1 #include <stdio.h>2 #include <sys/types.h>3 #include <unistd.h>4 #include <string.h>5 6 int g_val 100;7 8 int main()9 {10 printf("我是一个进程: pid:%d,ppid:%d\n",getpid(),getppid());11 pid_t id for…

RadASM环境,win32汇编入门教程之六

;运行效果 ;RadASM环境&#xff0c;win32汇编入门教程之六 ;在上一个教程里面&#xff0c;我们学习了如何定义数据&#xff0c;那么在这一章节里面&#xff0c;我们来学习一下&#xff0c;再说明怎么把这些数据显示出来 ;下列就是显示出这些数据的示例程序&#xff0c;可以直接…

Flutter

项目文件目录结构介绍 注&#xff1a;创建 Flutter 项目名称不要包含特殊字符&#xff0c;不要使用驼峰标识 // TODO 开发中运行一个 Flutter 三种启动方式&#xff1a; Run 冷启动从零开始启动Hot Reload 热重载执行 build 方法Hot Restart 热重启重新运行整个 APP 代码分析…

【基础架构篇十一】《DeepSeek日志体系:ELK+Prometheus监控方案》

各位被日志淹没的工程师们,是否经历过这些抓狂时刻?——凌晨三点被报警短信吵醒,打开系统却看到: 日志文件以每秒100MB的速度疯狂膨胀关键报错信息在10TB日志里玩捉迷藏监控图表像心电图一样上蹿下跳服务器硬盘在报警声中发出垂死呻吟今天我们不聊什么基础的日志收集,直接…