我可以在NodeJS的require函数中使用别名吗?

103

我有一个ES6模块,它导出了两个常量:

export const foo = "foo";
export const bar = "bar";

我可以在另一个模块中进行以下操作:

import { foo as f, bar as b } from 'module';
console.log(`${f} ${b}`); // foo bar

当我使用NodeJS模块时,我会这样写:

module.exports.foo = "foo";
module.exports.bar = "bar";

现在,当我在另一个模块中使用它时,我是否可以像ES6模块那样将导入的变量重命名?

const { foo as f, bar as b } = require('module'); // invalid syntax
console.log(`${f} ${b}`); // foo bar

如何在NodeJS模块中重命名导入的常量?


foo并没有被直接导出,它是exports的一个属性(我假设module被导出了?),因此你无法在import/require中给它命名别名。 - Liam
4个回答

262

当然,只需使用对象解构语法:

 const { old_name: new_name, foo: f, bar: b } = require('module');

2
太好了!我应该早就想到了。 - xMort
16
为了澄清:const { prevName: newName } = require('../package.json'); 我把它颠倒了过来,却不明白为什么几分钟内它没有工作。 - technogeek1995
1
@technogeek1995 你是真正的MVP。登录SO感谢你! - Nahum
3
如果你需要默认导出(例如export default foo;),"default"就是名称,所以你可以这样写:const { default: newName } = require('module'); - Beau
如果是 module.exports = () => {some function},那么你可以分配任何你想要的变量名。const anything = require('module'); - Muhammad Mubashirullah Durrani

16

这是可能的(已在Node 8.9.4上测试):

const {foo: f, bar: b} = require('module');
console.log(`${f} ${b}`); // foo bar

4

好的,一个简单的解构可以满足您的要求。

改为:

var events = require('events');
var emitter = new events.EventEmitter();

你可以写:

const emitter = {EventEmitter} = require('events');

emitter()将别名为方法EventEmitter()

只需记得实例化你的命名函数:var e = new emitter();


有一点混淆。 emitter 变量不是 EventEmitter 的别名,它代表整个模块。可测试的代码是 const events = {EventEmitter} = require('events'); assert(events.EventEmitter === EventEmitter); - tugrul

-5

我认为这是不可能的,但有一个替代方案:

const m = require('module');
const f = m.foo;
const b = m.bar;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接