![](/img/trans.png)
[英]Does experimental ES Module loading in NodeJS support importing named exports?
[英]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.