报错: __dirname is not defined in ES module scope

前言

新版 NodeJS 支持通过 ESM 方式导入模块,代码如:

// CommonJS 规范(旧)
const { readFileSync, writeFileSync } = require('fs')
const path = require('path')
// ESModule 规范(新)
import { readFileSync, writeFileSync } from 'fs'
import path from 'path'
// ESModule 规范(最新)
import { readFileSync, writeFileSync } from 'node:fs'
import path from 'node:path'

在最新 ESModule 规范中,CommonJS 规范的全局方法和全局变量均无法使用:

require()  //  ESM 规范报错,未定义不能使用
module.exports // 报错,不能使用
exports // 报错,不能使用
__dirname // 报错,不能使用
__filename // 报错,不能使用

报错:ReferenceError: __dirname is not defined in ES module scope

报错原因:现在是 ESM 规范,没有全局变量 __dirname ,在 ESM 规范中需要自己定义变量才能使用。

// 最新 node 核心包的导入写法
import { fileURLToPath } from 'node:url'
import { dirname } from 'node:path'
// 获取 __filename 的 ESM 写法
const __filename = fileURLToPath(import.meta.url)
// 获取 __dirname 的 ESM 写法
const __dirname = dirname(fileURLToPath(import.meta.url))

报错:ReferenceError: require is not defined in ES module scope, you can use import instead

requireESM 规范中未定义,使用 ESM 规范的 import 代替。

// ESModule 规范(新)
import fs from 'fs'
// CommonJS 规范(旧)
const fs = require('fs')

报错:ReferenceError: exports is not defined in ES module scope

exportsESM 规范中未定义,可使用 ESM 规范的 export 导出代替。

// ESModule 规范(新)
export const name = 'Megasu'
export const age = 18
// CommonJS 规范(旧)
exports.name = 'Megasu'
exports.age = 18

报错:ReferenceError: module is not defined in ES module scope

moduleESM 规范中未定义,可使用 ESM 规范的 export default 默认导出代替。

// ESModule 规范(新)
export default {
name: 'Megasu',
age: 18
}
// CommonJS 规范(旧)
module.exports = {
name: 'Megasu',
age: 18
}

报错:ReferenceError: __dirname is not defined in ES module scope的更多相关文章

  1. 解决运行webpack --config webpack.dev.config.js 报错ReferenceError: _dirname is not defined

    控制台报错信息如下 将webpack.dev.config.js中的_dirname 改为 __dirname 注意这里是两个下划线谢谢!感觉好坑

  2. ant-design-vue 报错 ReferenceError: h is not defined

    使用表格,在配置 columns时用到了 customRender,然后就报错了 <script> import FileName from '@/views/admin/document ...

  3. layedit赋值方法(layedit.setContent赋值时报错-ReferenceError: layedit is not defined)

    layedit.setContent赋值时报错 - ReferenceError: layedit is not defined 报错代码: 控制台报错信息 解决方法: 步骤: 1)先赋值: 2)在渲 ...

  4. electron中JS报错:require is not defined的问题解决方法

    Electron已经发布了6.0正式版,升级后发现原来能运行的代码报错提示require is not defined 解决办法: 修改创建BrowserWindow部分的相关代码,设置属性webPr ...

  5. atom markdown报错:AssertionError: html-pdf: Failed to load PhantomJS module.

    今天安装markdown-pdf之后运行的时候报错: AssertionError: html-pdf: Failed to load PhantomJS module. You have to se ...

  6. wepy开发小程序eslint报错error 'getApp' is not defined no-undef

    wepy开发小程序使用getApp().globalData保存全局数据很方便,但是会在控制台看到很多报错:“error 'getApp' is not defined no-undef”,这是esl ...

  7. html页面调用js文件里的函数报错-->方法名 is not defined处理方法

    前几天写了一个时间函数setInterval,然后出现了这个错误:Uncaught ReferenceError: dosave is not defined(…) 找了半天都没发现错在哪,最后找到解 ...

  8. (转)PyCharm报错:“No R interpreter defined: Many R……”——解决办法

    报错截图: 下载安装链接:The Comprehensive R Archive Network

  9. Vue Cli 3 报错:router is not defined

    报错内容: 报错原因: 代码全部放在了路由配置的main.js文件里,router没有定义,使用的时候报undefined 解决方法: 把router.beforeEach放在main.js里面

  10. Angular4.0 项目报错:Unexpected value xxxComponent' declared by the module 'xxxxModule'. Please add a @Pipe...

    最近刚刚开始学习angular 4.0,在网上找了一个小项目教程学习,然而学习的过程有点艰辛,,各种报错,我明明就是按照博主的步骤老老实实走的呀!!话不多说,上bug-  .- Uncaught Er ...

随机推荐

  1. 硬件开发笔记(三十二):TPS54331电源设计(五):原理图BOM表导出、元器件封装核对

    前言   一个12V转5V.3.3V和4V的电源电路设计好了,下一步导出BOM表,二次核对元器件型号封装,这是可以生产前的最后一步了.   导出BOM表 步骤一:打开原理图   打开项目,双击点开原理 ...

  2. IntelliJ IDEA安装与配置(支持最新2020.2)

    前言 我是从eclipse转IDEA的,对于习惯了eclipse快捷键的我来说,转IDEA开始很不习惯,IDEA快捷键多,组合多,记不住,虽然可以设置使用eclipse的快捷键,但是总感觉怪怪的.开始 ...

  3. 即时通讯技术文集(第19期):IM架构设计基础知识合集 [共13篇]

    为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第19 期. [-1-] 微信后台基于时间序的新一代海量数据存储架构的设计实践 [链接] htt ...

  4. 即时通讯技术文集(第11期):IM通信格式的选型及Protobuf专题 [共16篇]

    为了更好地分类阅读52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第11 期. [- 1 -] 如何选择即时通讯应用的数据传输格式 [链接] http://www. ...

  5. 解决STM32 CubeMX中配置RTC每次上电就会重置的问题

    自从有了Cube MX,配置STM32的外设就变得格外简单.不过这次差点踩坑,下载完程序后RTC自动就恢复到了我设置的初始值,重启之后现象依旧. 下面就以上问题简单分析一下代码. /* RTC ini ...

  6. 在 .NET 中使用 Tesseract 识别图片文字

    1. 什么是 Tesseract Tesseract 是一个强大的字符识别 (OCR) 工具.它最初由 HP 发布,现在由 Google 和学术社区共同维护和开发. Tesseract 支持多种语言和 ...

  7. 最新AI智能体开发案例:小红书养生博主必备!教你用Coze工作流搭建「养生赛道」智能体!

    嗨~我是老包.目前专注AI智能体开发与教学 ,持续分享Coze智能体.coze工作流搭建案例.** 老包用扣子为小红书养生赛道博主捏了一个神器 名字是: 「 小红书 | 爆款养生赛道图文生成器」 为什 ...

  8. SpringBoot集成Jwt(详细步骤+图解)

    SpringBoot集成Jwt(详细步骤+图解)Jwt简介 JSON Web Token是目前最流行的跨域认证解决方案,,适合前后端分离项目通过Restful API进行数据交互时进行身份认证 Jwt ...

  9. .NET9 AOT部署

    概念 AOT是Ahead-of-Time的缩写,AOT是将C#程序提前编译为机器代码(通常为平台特定的二进制文件),在应用程序启动之前完成编译过程. 微软官方文档是这样说的 将应用程序发布为本机 AO ...

  10. WitAwards 2024荣耀登榜!AOne载誉而归!

    近日,FCIS 2024网络安全创新大会在上海举办.本次大会以"迈向安全服务化时代"为主题,邀请来自全球的网安精英.技术专家.CISO/CSO.白帽子.创业者等展开深度对话,分享与 ...