javascript 导入模块NodeJS中的所有导出

brtdzjyr  于 2023-01-19  发布在  Java
关注(0)|答案(5)|浏览(147)

我希望能够访问一个模块的所有导出,而不必在导出之前说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与此等价的是什么?

31moq8wy

31moq8wy1#

在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;
}
sqserrrh

sqserrrh2#

我希望能够访问一个模块的所有导出,而不必在导出之前说module.com。
使用以下简写:

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

或者使用对象:
x一个一个一个一个x一个一个二个x
有没有办法调用foo()而不需要说mymod.before?这可以在python中通过说import module为 * 来实现。NodeJS与此等价的是什么?
使用解构:
const { foo } = require("./mymod.js")
假设我在一个文件中有100个导出项。2我需要在{}中的每个导入项后都加上逗号吗?3一定有更好的方法来做到这一点
如果您有100个导出,为什么要将它们作为各自的函数全局导入?myMod.func更清晰。
一个很有技巧的解决方法可能是执行const myMod = require('myMod'),然后Map它,将函数放在全局对象上,或者从一开始就放在全局对象上,而不是导出它。

xxb16uws

xxb16uws3#

您可以使用ES6重构:

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

vuktfyat4#

我有这样一种情况,我有一个很小但不是那么小的通用实用程序,它与几个模块一起使用(它的所有函数都被使用了),其中已经加载了相当数量的模块。这些函数显然是以一种你知道有一部分通用实用程序模块的方式命名的,所以“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');

注意,这只在模块导出一个对象时才有效。例如,如果模块导出一个数组,就无效。

tvz2xvvm

tvz2xvvm5#

下面是另一种方法,在某些情况下可能会更干净、更方便:方法importAll()是在export-heavy模块内实现的,因此可以在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()

相关问题