1. ホーム
  2. javascript

[解決済み] Node.jsに "Vanilla "Javascriptライブラリを読み込む

2022-10-30 06:46:49

質問

Node.jsサーバーで使いたい機能を持ったサードパーティのJavascriptライブラリがいくつかあります。(具体的には、私が見つけたQuadTree javascriptライブラリを使用したいです。) しかし、これらのライブラリは、単にまっすぐな .js ファイルであり、"Node.js ライブラリ" ではありません。

そのため、これらのライブラリは exports.var_name の構文に従いません。私が理解する限り、それはつまり、あなたが module = require('module_name'); または module = require('./path/to/file.js'); を使用すると、一般にアクセス可能な関数などを持たないモジュールになってしまいます。

私の質問は、「どのようにして任意のjavascriptファイルをNode.jsにロードし、その機能を利用することができるのか」ということです。 exports というように書き直す必要はありません。

私はNode.jsに非常に慣れていないので、私の理解の中に目立った穴があれば教えてください。


EDIT : もっと調べてみると、Node.jsが使っているモジュール読み込みパターンは、実は最近開発されたJavascriptライブラリを読み込むための標準の一部で CommonJS . これは モジュールのドキュメントページ に書いてあるのですが、今まで見逃していました。

私の質問に対する答えは、quot;ライブラリの作者がCommonJSインターフェースを書くまで待つか、自分でやるか、ということになりそうです。

どのように解決するのですか?

を使うよりもずっと良い方法があります。 eval を使うよりもはるかに良い方法があります。 vm モジュールになります。

例えば、以下は私の execfile モジュールで、このスクリプトは path のどちらかで評価されます。 context またはグローバルコンテキストのどちらかです。

var vm = require("vm");
var fs = require("fs");
module.exports = function(path, context) {
  context = context || {};
  var data = fs.readFileSync(path);
  vm.runInNewContext(data, context, path);
  return context;
}

そして、このように使うことができます。

> var execfile = require("execfile");
> // `someGlobal` will be a global variable while the script runs
> var context = execfile("example.js", { someGlobal: 42 });
> // And `getSomeGlobal` defined in the script is available on `context`:
> context.getSomeGlobal()
42
> context.someGlobal = 16
> context.getSomeGlobal()
16

ここで example.js が含まれる。

function getSomeGlobal() {
    return someGlobal;
}

この方法の大きな利点は、実行されるスクリプトのグローバル変数を完全に制御できることです。 context を通して)カスタム・グローバルを渡すことができ、スクリプトによって作成されたすべてのグローバルは context . また、構文エラーなどが正しいファイル名で報告されるため、デバッグも容易になります。