【nodejs】“__dirname is not defined”错误修复

news2024/10/22 13:58:57

▒ 目录 ▒

    • 🛫 问题
      • 描述
      • 环境
    • 1️⃣ 原理
      • CommonJS vs ESM
      • 错误原因
    • 2️⃣ 禁用 ESM 模式并改用 CommonJS
      • 方案一:项目
      • 方案二:单文件
    • 3️⃣ 在 ESM 模式下自实现__dirname
    • 📖 参考资料

🛫 问题

描述

从网上找了一份代码,其中包含了__dirname变量的使用,结果运行的时候报错:__dirname is not defined

环境

版本号描述
文章日期2023-06-
操作系统Ubuntu 20.04.4 LTSCSDN开发云
node -vv16.17.0npm -v (8.15.0)
Cloud IDE1.71.0
操作系统Win11 - 21H2 - 22000.1335
Python3.7.1
frida.exe15.0.18

1️⃣ 原理

CommonJS vs ESM

讨论__dirname报错,首先要分清楚CommonJS 和 ESM的区别。
CommonJS 和 ESM(ECMAScript Modules) 都是 JavaScript 模块系统的规范,用于组织和管理代码。它们之间有一些区别,下面简要介绍一下:

特点CommonJSESM
加载方式同步加载异步加载
导出/引入关键字module.exports 和 require()export 和 import
支持环境Node.js 默认支持现代浏览器和最新版本的 Node.js 支持
应用范围主要用于服务器端开发,如 Node.js在浏览器端和 Node.js 中有广泛应用,是未来趋势

错误原因

在 CommonJS 模式下,__dirname 是包含当前文件目录变量。 许多Node.js项目都依赖于此变量。
但不能在 ESM 模式下使用(ESM模式不提供 __dirname 变量)。 您有两种选择:

  • 禁用 ESM 模式并改用 CommonJS
  • 聚填充__dirname

2️⃣ 禁用 ESM 模式并改用 CommonJS

在 JavaScript 中,通常文件扩展名 “.js” 用于表示普通的 JavaScript 文件,
而 “.mjs” 用于表示 ECMAScript 模块(ESM)文件。这两种文件扩展名的区别在于它们所代表的 JavaScript 模块类型。

  • .js 文件:通常用来表示普通的 JavaScript 文件,其中可能包含常规的 JavaScript 代码,采用 CommonJS 或其他模块加载方案。
  • .mjs 文件:表示 ECMAScript 模块,这种文件中的代码采用了 ECMAScript Modules(ESM)规范,即使用 “import” 和 “export” 关键字来定义模块。

要使用 “.mjs” 文件,您需要确保在 Node.js 中启用了对 ECMAScript 模块的支持。您可以通过以下几种方式之一实现:

方案一:项目

Node.js 项目中的 package.json 文件是一个用于描述项目信息、依赖关系和脚本命令的 JSON 文件。它位于项目根目录下,是 Node.js 项目的重要配置文件之一。
在 Node.js 项目中的 package.json 文件中,“type” 字段不要设置为 “module”,以明确告知 Node.js 不使用 ESM 规范(或者直接删除)
在这里插入图片描述

方案二:单文件

对于单文件运行node,即不包含 package.json 文件的情况。node是根据文件后缀判断运行模式的。
我们确保文件后缀是.js,而不是.mjs即可使用__dirname。

3️⃣ 在 ESM 模式下自实现__dirname

在 ECMAScript 模块(ESM)中,与 CommonJS 不同,没有像 __dirname 这样的内置变量来表示当前模块的目录路径。不过,您可以通过一些方法来模拟实现类似的功能。

一种常见的方法是使用 import.meta.url 属性来获取当前模块的 URL,然后从中提取出目录路径。下面是一个示例代码,演示如何在 ESM 模式下自实现类似 __dirname 的功能:

import path from 'path';
import { fileURLToPath } from 'url';

const __dirname = path.dirname(fileURLToPath(import.meta.url));

在这个示例中,我们首先导入了 Node.js 中的 fileURLToPath 和 dirname 函数,然后使用 import.meta.url 获取当前模块的 URL。接着,通过 fileURLToPath 将 URL 转换为文件路径,并最终通过 dirname 获取该文件路径的目录部分,从而模拟实现了类似 __dirname 的功能。
请注意,这种方法依赖于 Node.js 提供的 url 和 path 模块,确保您的项目中已安装这些模块。这样,您就可以在 ESM 模式下获取当前模块的目录路径,类似于 CommonJS 中的 __dirname 变量。

📖 参考资料

  • How To Fix “__dirname is not defined” Error in Node.js https://masteringjs.io/tutorials/node/__dirname-is-not-defined

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

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

相关文章

O2O:Offline Meta-Reinforcement Learning with Online Self-Supervision

ICML 2022 paper Introduction 元强化学习(Meta RL)结合O2O。元RL需要学习一个探索策略收集数据,同时还需学习一个策略快速适应新任务。由于策略是在固定的离线数据集上进行元训练的,因此在适应探索策略收集的数据时,它可能表现得不可预测&…

Tomcat源码解析(三):LifeCycle生命周期管理

Tomcat源码系列文章 Tomcat源码解析(一):Tomcat整体架构 Tomcat源码解析(二):Bootstrap和Catalina Tomcat源码解析(三):LifeCycle生命周期管理 目录 前言一、LifeCycle接口1、接口介绍2、生命周期状态 二、LifecycleBase抽象类1、监听器2、…

JavaEE之volatile关键字

一.内存可见性问题 什么是内存可见性问题 计算机运行的程序/代码,往往需要访问数据。这些数据往往存在于内存中。 cup使用此变量时,就会把内存中的数据先读出来,加载到cpu寄存器中,再去参与运算。 但是,关键是cpu读…

opengl 学习(三)-----着色器

着色器 分类demo效果解析教程 分类 OPengl C demo #include "glad/glad.h" #include "glfw3.h" #include <iostream> #include <cmath> #include <vector>#include <string> #include <fstream> #include <sstream>…

Spring源码:手写AOP

文章目录 一、概念1、AOP是什么&#xff1f;2、相关概念1&#xff09;目标对象Target2&#xff09;通知Advice3&#xff09;连接点Joinpoint4&#xff09;切点Pointcut5&#xff09;切面Aspect6&#xff09;织入Weaving 二、分析三、实现1、实现Advice1&#xff09;前置通知2&a…

IDEA中新增文件,弹出框提示是否添加到Git点错了,怎么重新设置?

打开一个配置了Git的项目&#xff0c;新增一个文件&#xff0c;会弹出下面这个框。提示是否将新增的文件交给Git管理。 一般来说&#xff0c;会选择ADD&#xff0c;并勾选Dont ask agin&#xff0c;添加并不再询问。如果不小心点错了&#xff0c;可在IDEA中重新设置&#xff08…

经典语义分割(二)医学图像分割模型UNet

经典语义分割(二)医学图像分割模型UNet 我们之前介绍了全卷积神经网络( FCN) &#xff0c;FCN是基于深度学习的语义分割算法的开山之作。 今天我们介绍另一个语义分割的经典模型—UNet&#xff0c;它兼具轻量化与高性能&#xff0c;通常作为语义分割任务的基线测试模型&#x…

海格里斯HEGERLS助力服装业领域数智化转型 配备7000个托盘位 仓库容量增超110%

近年来&#xff0c;用工荒成为服装制造行业的一大痛点。对此&#xff0c;整个生产体系就要不断地向智能化、自动化生产设备进行转型&#xff0c;甚至在研发设计上都要面向自动化做一些新一代服装制造业的开发。 作为较早入局物流赛道的河北沃克&#xff0c;目前已构建起以AI赋能…

P2241 统计方形(数据加强版) python解法

求n*m网格内矩形的数目 - tenos - 博客园 (cnblogs.com) 法一&#xff08;题解推规律暴力枚举得到&#xff09;&#xff1a; n,mmap(int,input().split()) sqr,rec0,0 #正方形和长方形个数 #以长宽做循环&#xff0c;每次求n*m大小的矩形的个数 #题解是从0开始的&#xff0c;我…

Java二级--操作题详解(1)

目录 1.第一套&#xff1a; 1.1 基本操作&#xff1a; 1.2 题解分析&#xff1a; 2.1 简单应用&#xff1a; 2.2 解题分析&#xff1a; 3.1 综合应用&#xff1a; 3.2解题分析&#xff1a; 1.第一套&#xff1a; 1.1 基本操作&#xff1a; 在考生文件夹中存有文件名为J…

浅析扩散模型与图像生成【应用篇】(八)——BBDM

8. BBDM: Image-to-Image Translation with Brownian Bridge Diffusion Models 本文提出一种基于布朗桥&#xff08;Brownian Bridge&#xff09;的扩散模型用于图像到图像的转换。图像到图像转换的目标是将源域 A A A中的图像 I A I_A IA​&#xff0c;映射到目标域 B B B中得…

【重要!!退税!退税!】一年一度个人所得税综合年度汇算开始了!

目录标题 如何退税&#xff1f;2023年度个人所得税综合所得汇算清缴操作指南汇算准备标准申报 退税骗局&#xff1f;1.“您有一笔退税待领取”骗局2.“专业人员帮你多退税”骗局3.“诱导填报虚假个税信息”骗局4.“税务稽查人员联系你”骗局 如何退税&#xff1f; 2023年度个人…

【elementplus】el-image图片预览的显示不全问题(和el-table、el-dialog组合使用时)

问题&#xff1a; 在和el-table、el-dialog组合使用时&#xff0c;el-image图片预览的时候&#xff0c;会可能出现显示不全图片的情况。 解决方法&#xff1a; <el-image-viewer:z-index"3000":teleported"true"/>element文档中有属性&#xff1a;…

【SpringBoot3.x教程03】SpringBoot自动配置详解

前言&#xff1a;什么是自动配置 自动配置的原理 Spring Boot自动配置尝试根据添加到项目中的jar依赖、定义的bean以及各种属性设置来自动配置Spring应用。这是通过EnableAutoConfiguration注解实现的&#xff0c;该注解通常是通过SpringBootApplication注解间接应用的。Spring…

如何实现数据中心布线变更管理?

前言 随着科技的不断发展&#xff0c;数据中心作为企业的核心基础设施之一&#xff0c;承载着大量重要的业务数据。在数据中心运维过程中&#xff0c;变更管理流程变得尤为重要&#xff0c;它是确保数据中心基础设施稳定运行和保障数据安全的关键环节。变更管理的定义是指在维…

阿珊解说Vue中`$route`和`$router`的区别

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

栈和队列OJ题:有效的括号,用栈实现队列,用队列实现栈,设计循环队列(C语言版,图文并茂,超级详细)

目录 前言 1. 有效的括号 &#xff08;1&#xff09;题目及示例 &#xff08;2&#xff09;思路及解法 2.用栈实现队列 &#xff08;1&#xff09;题目及示例 &#xff08;2&#xff09;解析及思路 &#xff08;3&#xff09;各部分代码 2.3.1 数据结构设计和创造队列…

官网:随便搞个?那不如不搞,搞不好就给公司减分了。

官网建设确实需要认真对待&#xff0c;不能随便搞。一个粗制滥造的官网可能会给公司带来负面影响&#xff0c;降低品牌形象和用户体验。以下是一些官网建设的重要原则&#xff1a; 专业性&#xff1a;官网应该展示公司的专业性和专业知识。它应该以专业的设计、内容和功能来展示…

1.4 Word2Vec是如何工作的? Word2Vec与LDA 的区别和联系?

1.4 Word2Vec&#xff1a;词嵌入模型之一 场景描述 谷歌2013年提出的Word2Vec是目前最常用的词嵌入模型之一。 Word2Vec实际是一种浅层的神经网络模型,它有两种网络结构&#xff0c;分别是CBOW(Continues Bag of Words)和Skip-gram。 知识点 Word2Vec,隐狄利克雷模型(LDA),…

nginx部署前端工程替代方案gateway

nginx部署前端工程替代方案gateway 有市场要求部署的前端vue工程不使用nginx中间件。想弄国产替代的东方通之类的&#xff0c;公司没有购买该产品&#xff0c;我参考了网上的一些java网关框架&#xff0c;springcloud组件&#xff1a;gateway实现代替。 注意后台都是用java编…