2

node.jsでグローバル変数を動作させようとしていますが、私の理解はドキュメントと一致していても、概念をよく理解していないようです。

最小限の例

ロールアップを使用してコンパイルされた私のmain.jsファイルは次のとおりです。

global.a = 1;
require('./core/test.js');

私のcore/test.jsファイルは単純です:

console.log(a);

これにより、次のエラーが発生します。

Uncaught ReferenceError: a が定義されていません

完全にコンパイルされた出力は次のとおりです。

(function (exports) {
'use strict';

var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};

console.log(a);

commonjsGlobal.a = 1;

}((this.LaravelElixirBundle = this.LaravelElixirBundle || {})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIkM6L3dhbXAvd3d3L3V1YmMvcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb3JlL3Rlc3QuanMiLCJDOi93YW1wL3d3dy91dWJjL3Jlc291cmNlcy9hc3NldHMvanMvYXBwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnNvbGUubG9nKGEpO1xyXG4iLCJnbG9iYWwuYSA9IDE7XHJcbnJlcXVpcmUoJy4vY29yZS90ZXN0LmpzJyk7XHJcbiJdLCJuYW1lcyI6WyJnbG9iYWwiXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUNBZkEsY0FBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7OyJ9

の後aに定義されるようです。これが JS で問題になるかどうかは 100% わかりませんが、エラーが発生している可能性があります。 console.log(a);

私の質問は次のとおりです。何が原因で、ここで何が間違っているのですか?

おそらく関連する情報: Laravel Elixir を使用してすべてをコンパイルしています。

注: node.js または一般的にグローバル変数を使用するかどうかについての議論を投稿しないでください。通常は悪い考えであることはわかっていますが、この場合はそれを行う十分な理由があります。

編集:追加のコンテキスト

私が実際にやろうとしているのは、node.js を介して Zurb Foundation を Laravel Elixir と連携させることです。foundation-sitesNPM経由でインストールしました。foundation-sitesに依存しておりjquery、それ自体をプルします。ただしvar jquery = require('jquery');、Foundation は、独自の js ファイルのようなものを使用するという通常の規則に従っていないようです。jQuery実際には、利用可能なグローバル変数に依存しています。したがって、私は何とかそれを保証する必要があります。

私の実際のファイルは次のようになります。

global.jQuery = global.$ = require('jquery');
require('foundation-sites');

したがって、Foundation/Laravel 固有の回答があれば、私も喜んでお聞きします。私が取得していないものはありますか、それとも Foundation がパッケージを「正しい」方法で作成しなかっただけですか?

4

4 に答える 4

4

これらの2行を実行している順序を尊重しないバンドラーの問題のように私には思えます。あなたのソースは明らかに:

global.a = 1;
require('./core/test.js');

...しかし、バンドルされた結果は明らかに逆です:

console.log(a);
commonjsGlobal.a = 1;

requireコールを巻き上げているようです。一般にrequire、実行制御フローの特定の時点で実行する必要がある呼び出しを持つことは、ベスト プラクティスではありません (実際、ES2015 のモジュールを定義する場合import、モジュールの段階的な制御フローで実行されないように明示的に定義されます)。 )。

したがって、これを行う必要がある場合は、おそらく別のバンドラーを検討することをお勧めします。ただし、依存関係解決順序以外の順序をサポートしていることを確認してください。

于 2017-01-05T16:01:47.217 に答える
3

あなたはそれがうまくいくはずだというのは正しいです。これが実際の例です:

// file1.js
global.a = 'hello';
require('./file2');

// file2.js
console.log(a);

を実行すると、コンソールに出力されnode file1.jsます。'hello'

他のツール (Laravel / Elixir) を使用しているようです。ノードを直接使用して、何が起こるかを確認してください。

于 2017-01-05T15:52:20.717 に答える