__dirname is not defined in ES module scope

__dirnamecommonjs规范的内置变量。如果使用了esm,是不会注入这个变量的。

在commonjs中,注入了__dirname__filename, module, exports, require五个内置变量用于实现导入导出的能力。而在esm中,因为规范已经完全不一样,故实现方式也是不一样的。

在esm中,显然模块的导入导出使用export/import,自然不会再用exports /require,同理__dirname__filename也有对应的规范写法。

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

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

可以看到使用了一个关键API import.meta.url,其实import.meta是ECMA规范的一部分:

The import.meta object exposes context-specific metadata to a JavaScript module. It contains information about the module, like the module’s URL.

如上,言下之意,import.meta提供了一个模块的上下文信息,其实上文commonjs的提供的那些变量不也是上下文信息么?只不过标准不一样了,写法也不一样了。

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值