繁体   English   中英

使用 ES5 语法在 Node 中混合默认和命名导出

[英]Mixed default and named exports in Node with ES5 syntax

我在导出/导入模块方面的所有经验都来自 ES6 中的exportimport ,您可以在其中执行类似的操作来让单个模块导出默认函数以及单独的命名函数。

// module.js
export default mainFunction
export { namedFunction }

// main.js
import mainFunction from 'functions'
mainFunction()

import { namedFunction } from 'function'
namedFunction()

但是我不知道如何使用module.exportsrequire使用 ES5 样式导入来做到这一点。 据我了解,我可以导出一个默认值:

// module.js
module.exports = function mainFunction() {}

// main.js
const mainFunction = require('module.js')

或者我可以创建命名导出:

// module.js
module.exports = {
  namedFunction: function() {}
}

// main.js
const namedFunction = require('module.js').namedFunction

但我不能两者都做。 我想我可以像这样将其中一个导出命名为“默认”,但它不起作用

// module.js
module.exports = {
  default: function() {},
  namedFunction: function() {}
}

// main.js
const mainFunction = require('module.js') // does not work
const mainFunction = require('module.js').default // works, but not what I want
const namedFunction = require('module.js').namedFunction

如何使用 ES5 完成这种双重默认/命名导出?

您希望将module.exports的值指定为默认函数,然后将所有命名导出作为该函数的属性。

const defaultFunction = () => { console.log('default!'); };
const namedFunction1 = () => { console.log('1!'); };
const namedFunction2 = () => { console.log('2!'); };

const myModule = module.exports = defaultFunction;
myModule.namedFunction1 = namedFunction1;
myModule.namedFunction2 = namedFunction2;

假设那是在myModule.js中。 然后你可以这样做:

const myModule = require('./myModule');
myModule(); // Prints: 'default!'
myModule.namedFunction1(); // Prints: '1!'

只需将exports重新分配给module.exports

喜欢:

//name.js

const NameType = {
  foo: "bar",
};

function Name(name) {
  this.name = name;
}

module.exports = Name; // assign default export to Name
exports = module.exports; // re-assign exports to point it to the updated location.

exports.NameType = NameType; // now you can use named export as usual

在另一个文件中,您可以像这样导入:

const Name = require("./name");
const { NameType } = require("./name");

这是因为默认module = { exports: {} }exports = module.exports

参考: CommonJs 模块系统中“module.exports”和“exports”的区别

如果您不想重复命名导出,您可以随时执行类似的操作

module.exports = defaultFunction;
module.exports = Object.assign(module.exports, {
    namedFunction1,
    namedFunction2,
});

然后你可以正常要求;

const myModule = require('./myModule');
myModule();
myModule.namedFunction1();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM