30

この質問は少しばかげているかもしれませんが、1 つの require ステートメントで複数の .js ファイルをロードすることは可能ですか? このような:

var mylib = require('./lib/mylibfiles');

そして使用:

mylib.foo(); //return "hello from one"

mylib.bar(): //return "hello from two"

そして、フォルダー mylibfiles には 2 つのファイルがあります。

One.js

exports.foo= function(){return "hello from one";}

Two.js

exports.bar= function(){return "hello from two";}

すべてのファイルをロードするというフォルダーにpackage.jsonを入れようと思っていましたが、方法がわかりません。私が考えていた他のアプローチは、すべてを再度エクスポートする index.js を持つことですが、作業を複製します。

ありがとう!!

PD: Windows 7 マシンで nodejs v0.611 を使用しています。

4

5 に答える 5

4

複数のモジュールを必要とするコードのスニペットがありますが、投稿が示唆するようにそれらをまとめません。しかし、それは私が見つけたトリックで克服できます。

function requireMany () {
    return Array.prototype.slice.call(arguments).map(function (value) {
        try {
            return require(value)
        }
        catch (event) {
            return console.log(event)
        }
    })
}

そして、あなたはそれをそのように使用します

requireMany("fs", "socket.io", "path")

どちらが返されますか

[ fs {}, socketio {}, path {} ]

モジュールが見つからない場合は、コンソールにエラーが送信されます。プログラムを壊すことはありません。エラーは未定義として配列に表示されます。モジュールの 1 つがロードに失敗したため、配列は短くなりません。

次に、次のように、これらの各配列要素を変数名にバインドできます。

var [fs, socketio, path] = requireMany("fs", "socket.io", "path")

基本的にはオブジェクトのように機能しますが、キーとその値をグローバル名前空間に割り当てます。したがって、あなたの場合、次のことができます。

var [foo, bar] = requireMany("./foo.js", "./bar.js")
foo() //return "hello from one"
bar() //return "hello from two"

エラー時にプログラムを中断させたい場合は、この修正版を使用してください。

function requireMany () {
    return Array.prototype.slice.call(arguments).map(require)
}
于 2016-09-01T02:51:01.710 に答える
2

分割割り当てを使用して、エクスポートされたモジュールの配列をrequireステートメントから 1 行でマップできます。

const requires = (...modules) => modules.map(module => require(module));
const [fs, path] = requires('fs', 'path');
于 2020-06-26T23:16:06.360 に答える
0

Puppeteer + Jest テスト セットアップにプルされるテスト スクリプトのリストがあるプロジェクトで、@freakish が彼の回答で示唆していることと同様のことをしていました。私のテストファイルは、命名規則 testname1.js - testnameN.js に従っており、ジェネレーター関数を使用して、以下のアプローチで特定のディレクトリから N 個のファイルを要求することができました。

const fs = require('fs');
const path = require('path');

module.exports = class FilesInDirectory {

    constructor(directory) {

        this.fid = fs.readdirSync(path.resolve(directory));
        this.requiredFiles = (this.fid.map((fileId) => {
            let resolvedPath = path.resolve(directory, fileId);
            return require(resolvedPath);
        })).filter(file => !!file);

    }

    printRetrievedFiles() {
        console.log(this.requiredFiles);
    }

    nextFileGenerator() {

        const parent = this;
        const fidLength = parent.requiredFiles.length;

        function* iterate(index) {
            while (index < fidLength) {
                yield parent.requiredFiles[index++];
            }
        }
        return iterate(0);
    }

}

次に、次のように使用します。

//Use in test
const FilesInDirectory = require('./utilities/getfilesindirectory');
const StepsCollection = new FilesInDirectory('./test-steps');
const StepsGenerator = StepsCollection.nextFileGenerator();

//Assuming we're in an async function
await StepsGenerator.next().value.FUNCTION_REQUIRED_FROM_FILE(someArg);
于 2019-06-26T13:47:07.417 に答える