簡體   English   中英

導入模塊 NodeJS 中的所有導出

[英]Importing all exports in a module NodeJS

我希望能夠訪問模塊的所有導出,而不必說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 是什么?

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

我希望能夠訪問模塊的所有導出,而不必說 module。 出口前。

使用簡寫:

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

或者使用一個對象:

module.exports = {
  foo,
  myVar
}

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

有沒有辦法調用 foo() 而無需說 mymod. 前? 這可以在 python 中通過將 import module 聲明為 * 來實現。 與此等效的 NodeJS 是什么?

使用解構:

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

假設我在一個文件中有 100 個導出。 我是否需要在每次導入后在 { } 中添加逗號? 必須有更好的方法來做到這一點

如果您有 100 個導出,為什么要將它們作為自己的函數全局導入? 為了清楚起見, myMod.func更好。

一個hacky解決方法可能是做const myMod = require('myMod')然后將其映射到全局對象上。 或者從一開始就將它們放在全局上而不是導出它。

您可以使用 ES6 解構:

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

我有一種情況,我有一個很小但不是那么小的通用實用程序,它與幾個模塊一起使用(使用了所有它的功能),其中已經加載了相當數量的模塊。 這個函數的命名方式顯然是你知道通用實用程序模塊的一部分,所以“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');

請注意,這僅在模塊導出對象時才有效。 例如,如果模塊導出數組,則無法工作。

這是另一種方法,它可能更方便一些(當然對我來說):

考慮你有你的模塊:

// module.js

function func1() { return 1; };
function func2() { return 2; };
function importAll() { Object.keys(this).forEach((id) => { if (id === 'importAll') { return; }; global[id] = this[id]; }); };
module.exports = { func1, func2, importAll };

然后在您的應用程序中,您可以按如下方式解包您的模塊:

// app.js

require('./module.js').importAll();

console.log("func1() =", func1());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM