将所有导出导入到模块NodeJS中

时间:2018-11-10 01:16:56

标签: javascript node.js

我希望能够访问模块的所有导出,而不必在导出前说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等效于什么?

4 个答案:

答案 0 :(得分:0)

您可以使用ES6解构:

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

答案 1 :(得分:0)

在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)。

如果您必须导入100个模块,最好的方法是第一种方法,将所有内容作为对象导入并在旅途中进行分解,这意味着如果您有很多函数或方法,请在该函数旁边分解该函数中想要的内容,例如。

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

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

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

答案 2 :(得分:0)

  

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

使用速记:

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

或使用对象:

module.exports = {
  foo,
  myVar
}

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

是否有一种无需说mymod即可调用foo()的方法。之前?   这可以在python中通过将import module表示为*来实现。什么是   相当于NodeJS吗?

使用解构:

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

  

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

如果您有100个导出,为什么要将它们全部作为自己的功能全局导入? myMod.func更为清晰。

一个棘手的解决方法可能是先做const myMod = require('myMod')然后映射它,然后将函数放在全局对象上。或者从一开始就将它们放在全局中,而不是将其导出。

答案 3 :(得分:0)

我遇到的情况是,我在几个模块(使用了所有功能)中使用了一个很小但不是那么小的通用实用程序,其中已经加载了相当数量的模块。显然,以已知的通用工具模块的一部分的方式来命名此函数,因此“ module.function”是多余的,不会提高代码的可读性。因此,我更喜欢模仿Python的“从模块导入*”。请注意,这是我第一次遇到这种情况,因此,在几乎所有情况下,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');

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