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

▒ 目录 ▒

    • 🛫 问题
      • 描述
      • 环境
    • 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.hqwc.cn/news/517454.html

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

相关文章

数据结构(二)——线性表

二、线性表 2.1线性表的定义和基本操作 2.1.1 线性表的基本概念 线性表:是具有相同数据类型的 n 个数据元素的有限序列。(Eg:所有的整数按递增次序排列,不是顺序表,因为所有的整数是无限的)其中n为表长,当n0时线性表是一个空表…

SpringCloudRibbon负载均衡原理与实践

文章目录 4.1.负载均衡原理4.2.源码跟踪1)LoadBalancerIntercepor2)LoadBalancerClient3)负载均衡策略IRule4)总结 4.3.负载均衡策略4.3.1.负载均衡策略4.3.2.自定义负载均衡策略 4.4.饥饿加载 实际的开发中 我们在使用 OpenFeign…

性能对比:mysql 5.7-8.0-TiDB 7.5-OceanBase 4.2-MariaDB 10.11-机械硬盘-固态硬盘-

1.mysql 5.7-8.0 5.7比8.0优秀 结果:5.7比8.0优秀 10% 2.机械硬盘和固态硬盘 影响不大,主要是CPU 3. JAVA MYSQL 分开 4.『直属 MySQL 』vs 『Docker MySQL』 vs 『Podman MySQL』 直属最好 ,其次是Podman,最后是DOCKER 5.MySQL …

java在cmd中乱码的问题解决

本文深入探讨了在使用 Java 命令行(cmd)时可能出现的中文乱码问题,并提供了两种解决方案。首先,通过临时的方式,用户可以执行命令 chcp 936 选择字符集,然后再运行 Java 命令,确保在选择字符集过…

开源模型应用落地-工具使用篇-Spring AI(七)

一、前言 在AI大模型百花齐放的时代,很多人都对新兴技术充满了热情,都想尝试一下。但是,实际上要入门AI技术的门槛非常高。除了需要高端设备,还需要面临复杂的部署和安装过程,这让很多人望而却步。不过,随着…

学习Java的第一天

一、Java简介 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。由 James Gosling和同事们共同研发,并在 1995 年正式推出。 后来 Sun 公司被 Oracle (甲骨文)公司收购,Jav…

嵌入式开发的常用软件、学习资源网站推荐

1、软件推荐 1.1、文本编辑软件 ——Notepad 1、适合编写和查看文本文件,也可以安装插件来查看二进制文件、对比文件 2、参考博客:《Notepad实用小技巧》; 1.2、PDF文件阅读软件——福昕PDF阅读器 福昕PDF阅读器,在官网就可以下载…

xinput1_3.dll丢失都有什么办法可以有效的解决、xinput1_3.dll导致游戏不能启动怎么办?

使用电脑的过程中是不是会遇到关于某个dll文件丢失的提示,今天想和大家聊的是xinput1_3.dll文件,如果电脑提示xinput1_3.dll丢失有什么办法可以有效的解决,解决办法都有哪些,如果xinput1_3.dll丢失会对电脑有什么影响。&#xff0…

LeetCode-第137题-只出现一次的数||

1.题目描述 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 2.样例描述 3.思路描述 先把数组排序&am…

01_Maven

文章目录 Maven安装MavenMaven的工作流程配置MavenMaven的使用module和project的关系如何用Maven导包 如何用Maven进行项目构建指令介绍clean指令compile指令package指令install指令 Maven的依赖管理如何导包scope作用域依赖传递依赖冲突 使用Maven开发项目Junit如何使用Junit …

深圳市萨科微半导体有限公司一直研究新材料新工艺,不断推出新产品,驱动公司不断发展

深圳市萨科微半导体有限公司一直研究新材料新工艺,不断推出新产品,驱动公司不断发展。最近萨科微推出SL40T120FL系列IGBT单管,和CMOS运算放大器SLA333等产品,为新能源汽车、太阳能光伏、交流电机、变频器、开关电源和工业伺服器行…

更快更强,Claude 3全面超越GPT4,能归纳15万单词

ChatGPT4和Gemini Ultra被Claude 3 AI模型超越了? 3月4日周一,人工智能公司Anthropic推出了Claude 3系列AI模型和新型聊天机器人,其中包括Opus、Sonnet和Haiku三种模型,该公司声称,这是迄今为止它们开发的最快速、最强…