导入 NodeJS 模块中的所有导出

问题描述 投票:0回答:6

我希望能够访问模块的所有导出,而不必在导出之前说

module.

假设我有一个模块:

// mymod.js
module.exports.foo = function() {
    console.log("foo!");
}
module.exports.bar = "bar!";

还有一个主文件:

// main.js
var mymod = require("./mymod.js");
mymod.foo();

有没有一种方法可以打电话给

foo()
而不需要先说
mymod.
?这可以在 python 中通过说
import module as *
来实现。 NodeJS 相当于什么?

javascript node.js
6个回答
18
投票

在ES6中可以通过以下方式导入模块

import moduleName from "path/to/module"; // import default export from the file as moduleName object, moduleName can be anything
import { exportMemberName1, exportMemberName2, ... } from "path/to/module"; // destructured import, it will destructure import and can access the export module without prefixing anything
import * as moduleName from "path/to/module"; // import everything exported from the file as moduleName object, you can access every export members from that object, moduleName can be anything

这些是ES6提供的唯一导入模块的方法(你也可以使用

require
)。

如果您必须导入数百个模块,最好的方法是第三种方法,将所有内容作为对象导入并随时解构,我的意思是,如果您有很多函数或方法,请在该函数中解构您想要的功能,例如.

import * as moduleName from "path/to/file";

function function1(){
    const { exportMember1, exportMember2 } = module;
}

function function2(){
    const { exportMember1, exportMember5, exportMember7 } = module;
}

4
投票

我希望能够访问模块的所有导出,而无需 说模块。出口前。

使用简写:

exports.myVar = myVar
exports.foo = () => {}

或者使用对象:

module.exports = {
  foo,
  myVar
}

// main.js
var mymod = require("./mymod.js");
mymod.foo();

有没有一种方法可以调用 foo() 而无需说 mymod.前? 这可以在 python 中通过将 import module as * 来实现。什么是 NodeJS 相当于这个?

使用解构:

const { foo } = require("./mymod.js")

假设我的一个文件中有 100 个导出项。我需要加逗号吗 每次在 { } 内导入之后?必须有更好的方法来做 这个

如果您有 100 个导出,为什么您希望将它们全部导入到全球范围内作为它们自己的函数?

myMod.func
更清晰。

一个 hacky 解决方法可能是执行

const myMod = require('myMod')
然后映射它,将函数放在全局对象上。或者从一开始就将它们放在全局而不是导出它。


3
投票

您可以使用 ES6 解构:

var { foo } = require("./mymod.js");
foo();

2
投票

我有一种情况,我有一个很小但不是那么小的通用实用程序,它与几个模块一起使用(使用了它的所有功能),其中已经加载了相当数量的模块。这个函数的命名方式显然是通用实用程序模块的一部分,因此“module.function”是多余的,不会提高代码的可读性。所以,我更喜欢模仿Python的“import * from module”。请注意,这是我第一次遇到这种情况,因此,IMO,这种机制在几乎所有情况下都不是一个好的做法。做到这一点的唯一方法是迭代模块的导出,并将函数添加到全局对象。我做了一个函数来明确意图。

const importAll = () => {
  return {
    mod: null,
    from(modName) {
      this.mod = require(modName);
      Object.keys(this.mod)
            .forEach(exportedElementId => global[exportedElementId] = this.mod[exportedElementId]);
    }
  }
}

它的用法是这样的:

importAll().from('module-name');

请注意,这仅在模块导出对象时才有效。例如,如果模块导出数组,则无法工作。


0
投票

这是另一种方法,在某些情况下可能更干净、更方便:方法

importAll()
是在inside导出重的模块中实现的,因此可能会在
require()
之后立即调用,使此调用非常简短。

这对于充满简单标准函数和跨多个项目使用的常量的大型模块来说非常有效。

示例:

// module.js
'use strict';
function func1() { return '4'; };
function func2() { return 2; };
function importAll() { delete this.importAll; Object.assign(global, this); };
module.exports = { func1, func2, importAll };

然后,在主应用程序中,可以按如下方式解包模块:

// app.js
'use strict';
require('./module').importAll();
console.log("result: '%d'", func1() + func2());

但有一些注意事项:

  • 由于属性/方法被添加到
    global
    对象中,这些可能会覆盖一些现有的属性/方法,因此命名时要小心。
  • 这些属性/方法将在任何地方可用:在所有模块、子模块等中,因此无需多次调用
    require()

0
投票

这在 NodeJS 中对我有用:

import * as lib from 'somewhere...'
Object.assign(global, lib)
© www.soinside.com 2019 - 2024. All rights reserved.