Node.js切换为ESM模块使用import时无法创建目录如何排查
问题原因
当你把package.json的type设为module后,Node.js会将所有.js文件按ES模块(ESM)规范处理,而__dirname是CommonJS规范下的专属全局变量,ESM规范中默认不存在该变量,因此代码运行时会抛出ReferenceError: __dirname is not defined错误,导致目录创建逻辑执行失败。
修复方案
你可以通过import.meta.url结合Node.js内置的url模块的fileURLToPath方法来实现和__dirname完全等价的效果,修复后的代码如下:
import path from 'path'; import fs from 'fs'; import { fileURLToPath } from 'url'; // 等价于CommonJS中的__filename const __filename = fileURLToPath(import.meta.url); // 等价于CommonJS中的__dirname const __dirname = path.dirname(__filename); // 执行目录创建 fs.mkdirSync(path.join(__dirname, 'folderName'));
可选优化点
- 如果你要创建的目录存在多级父目录缺失的情况,可以给
mkdirSync添加第二个参数{ recursive: true },避免因父目录不存在抛出错误:fs.mkdirSync(path.join(__dirname, 'folderName'), { recursive: true }); - 如果不需要复用
__filename和__dirname,也可以直接简写为一行逻辑:fs.mkdirSync(path.join(path.dirname(fileURLToPath(import.meta.url)), 'folderName'));
内容的提问来源于stack exchange,提问作者Limitless Claver
相关产品推荐
相关产品推荐

