Require.jsを使用して外部ライブラリを作成しようとしています。おかげで Require.jsが単一のjsファイルを正しくコンパイルしていません および Require.js(almond.js)タイミングオフ すべてを「コンパイル」する方法を理解しました単一の最適化/ビルドされたファイルに変換すると、その単一のファイルが機能します。 1つだけ問題があります。ライブラリに変数を設定する方法がわかりません。
ライブラリに_window.Foo
_を作成させたいとしましょう。 _main.js
_ファイルを次のように使用してみました:
_window.Foo = require([], function() {
window.Foo = {someValue: 1};
return {someValue: 2};
});
_
および次のラッパー終了フラグメント:
_ return require('main');
}));
_
ご覧のとおり、require呼び出しの内側から明示的に_window.Foo
_を設定することと、終了フラグメントの戻り値を介して外側から明示的に設定することの両方によって、Fooをグローバル空間に公開しようとしました。しかし、どちらも機能しません。ビルドされたファイルをロードした直後にconsole.log(window.foo)
を追加すると、_window.Foo
_が未定義であることが通知されます。
Window.setTimeout _window.Foo
_を実行すると、最終的に(_{someValue: 1}
_に)設定されますが、ユーザーがすべてのコードをタイムアウトでラップする必要があるとはあまり期待できません。最適化/ビルドされたファイルがロードされたらすぐに_window.Foo
_を定義する方法を誰かに説明してもらえますか?
Jamesの指示 here に従うと、誰かが同期的にロードできるRequireJSモジュールのバンドルとして設計されたライブラリを簡単に作成できます。
私はgithubを持っています リポジトリ 全体を説明しています。重要なポイント:
main
モジュールはFoo
をグローバルスペースにエクスポートします。
_define('main', ["./modC"], function () {
console.log("inside");
window.Foo = {someValue: 1};
return {someValue: 2};
});
_
また、開始フラグメントによってBar
としてエクスポートされる値を返します(これは、root.Bar = factory();
を示す行です)。つまり、グローバル空間にエクスポートする2つの方法を示しています。
_r.js
_で使用されるラッパーコードは、メインでrequire
の同期形式で始まります。
_require(`main`);
_
ロードすると、次の出力が表示されます。
_outside
loaded modC
inside
out in the HTML!
value of window.Foo: Object {someValue: 1}
value of window.Bar: Object {someValue: 2}
_
require()
の呼び出しはasyncです。つまり、引数として渡す関数の戻り値はnotrequire()
自体によって返されます。 。問題はさまざまな方法で解決できます。RequireJSの方法は、モジュール内のコードを定義し、依存関係として要求しています。
// mymodule.js
define([], function() {
window.Foo = {someValue: 1};
return {someValue: 2};
});
// main.js
require(['mymodule'], function (mymodule) {
console.log(window.Foo); // {someValue: 1}
console.log(mymodule); // {someValue: 2}
});