【发布时间】:2021-12-27 02:39:00
【问题描述】:
我最近在我的 NodeJS 项目中从 CommonJS 切换到 ES6 模块。我面临的挑战之一是在导入我的一个模块之前定义一个全局变量。我曾经在我的主文件中使用 CommonJS 来做到这一点:
const path = require('path');
global.appRoot = path.resolve(__dirname);
const myObj = require('./my-object-file');
我的my-object-file 使用global.appRoot。
使用 ES6,我尝试了以下方法:
import path from 'path';
global.appRoot = path.resolve(path.resolve());
import myObj from './my-object-file';
my-object-file.js 是:
export default {
root: global.appRoot
}
但我在my-object-file.js 中对global.appRoot 未定义。
这是怎么回事?
在我的代码中是否先调用了导入模块?
我该如何解决这个问题(知道我绝对希望能够将路径定义为可在我的模块中访问的全局变量)?
【问题讨论】:
-
全局只是一种糟糕的设计模式,违反了模块化的几个原则。您为什么不更改导入的模块,以便它导出一个您可以在导入后调用的函数,并将您希望它使用的目录传递给它。这将适用于 CommonJS 和 ESM 模块。仅供参考,如果您试图在 ESM 模块中获得等效的
__dirname,则不应使用path.resolve(),因为这只会让您获得 cwd。相反,请参阅 here 了解如何执行此操作。 -
感谢您的链接,我将更改
__dirname。关于进出口,我只是不明白你的意思。你能更明确地回答这个问题吗?也许用一段代码? -
你试过
globalThis
标签: javascript node.js ecmascript-6 es6-modules