3

実際には、ロードされたモジュールをグローバル スコープで実行するように node-js を構成できることをどこかで見ましたが、今はその方法を見つけることができません。

なぜ私は尋ねているのですか?

サーバーとクライアントの両方で使用したい言語ユーティリティを定義するレガシー ファイルがいくつかありますが、これらのユーティリティの多くはグローバル スコープ関数として定義されています。たとえば、closure(fClosure)module(fModule)などの関数があり、コードを読みやすく明確な方法で整理するだけです$sb(arg,arg,arg)。また、文字列ビルダーである などのユーティリティもあります。

現在、これらのユーティリティは のようなファイルで定義されておりcore.js、このファイルは最初の依存関係としてブラウザーに読み込まれ、問題はありません。

ただし、ルートでこのファイルを要求すると、拡張する場所で役立ちますが、Array.prototypeその中で定義されている関数は他のモジュールでは表示されません。(そして、汚染や他のライブラリとの衝突についての議論は避けてください)

CommonJS の仕様に従っていないことはわかっていますが、CommonJS の方法ですべてのコードを再編成することなく、このレガシー コードを活用しようとしています。

RequireJS とそれが提案する美しい AMD モデルについても見つけましたが、node.js 用に記述されたブラウザー コードで実行する方法についてのみ回答し、その逆については回答しません。

グローバル変数への割り当ては機能しません。これは、すべてのレガシー ライブラリを書き直さなければならないことを意味するためです。それらをグローバルスコープで実行し、それらを書き換えずに、そこで宣言したものをすべて残す方法を探しています。

それで、ノードにファイルを要求してグローバルスコープで実行するように依頼する方法はありますか?

4

2 に答える 2

10

globalオブジェクトに何かを割り当てることができます.Nodeのwindow場合はブラウザのようです.例:

test.js

global.my_var = require('./my_module');

require('./display_my_var');

my_module

module.exports = "this is a string";

display_my_var.js

console.log(my_var); // this will work, as my_var is now global
于 2011-12-14T11:23:43.003 に答える
2

我々のしたこと

この答えは決して良い例ではありません - 上で述べたように - そもそもケースは健全ではありません。

コードに適用する必要のある最小限の変更を以下に示します。そこから何を学べるか。

1 - すべてのレガシ Web コードをリファクタリングして、var なしでグローバルを宣言します。

前:

var MyUtils = { ... };

window.some = value;

後:

MyUtils = { ... };

some = "value";

2 - すべてのグローバル関数を割り当てられたグローバル変数として宣言します

前:

function foo() { ... }

後:

foo = function() { ... }

3 - 従来のコードと新しいノード コードの間の競合を解決する

まあ、これは私的なものなので、それについてのスニペットはありません. しかし、ここに他のものに関するスニペットがあります:

  • グローバル クラスのプロトタイプに拡張されたプロパティ。いずれかの側でそれを行うと、両方が共存するはずです。ばかげた例 - add()- プッシュに似ていますが、配列を返します

    Array.prorotype.add = function(s){ this.push.apply(this, arguments); return this }

  • 縮小化 - うまく縮小化できなかった 1 つの場所を解決しなければなりませんでした - それを別の方法でコードに入れる方法を見つけなければなりませんでした。

  • 単体テスト - そのようなすべてのグローバルが存在し、グローバル スコープの汚染チェックから除外されることを期待する必要があります。この完全なリストを取得したら、再びそれを使用します(そして、これもより適切に文書化されています:))

また、言及する価値があります

検索に沿って、いくつかのクールなサンドボックス ユーティリティに出会いました。サンドボックス化とは、サンドボックス コンテキストでコードを実行することを意味します。これにより、他のスコープに到達できなくなります。この実装はさまざまです。私の感謝を最も勝ち取ったのはこれです: https://github.com/hflw/node-sandbox

子プロセスで「ダーティ」コードを実行することで機能し、「純粋な」コードと「ダーティ レガシー」の間の通信を配線するのに役立ちます。

その結果、完全な分離が発生します。例-Array.prototype子プロセスはArray.prototype親のものではありません-それぞれが自分の「犯罪」操作のために必要に応じてそれを拡張できます...

私が言ったように-私たちはそれを必要とするほど必死になったことはありません.ノードコードは純粋であり、組み込み型に「拡張」を使用しないため、古いクライアントコードの拡張を気にしませんでした. しかし、正直に言うと、コードが混在すると、チームの全員がクライアント コードから派生した拡張機能を使い始めると、面倒になります。

于 2014-02-23T11:46:46.630 に答える