36

別のドメインをJavaScriptフレームワークとして使用したいのですが、アプリから拡張できる基本のrequireconfigが作成されます。

foo.example.com
    main.js
    lib/foo-specific.js
framework.example.com
    framework.js <-- entry point
    lib/jquery.js
    lib/etc...

最適には、「lib/foo-specific」および/または「lib/jquery」を要求し、パスを適切に解決できるようにしたいのですが、私が見つけたものから、これを行う方法はありません。フレームワーク内のすべてのjsファイルに特定のパスキー/値を使用します。現時点では、指定されたパスを別のベースURL(たとえばfw!lib/jquery)でロードするカスタムプラグインがありますが、プラグインを使用したい場合は、text!プラグインチェーンがサポートされていないため、機能しません。

私が現在入手しているものについてはhttps://github.com/jpillora/js-frameworkを、ユースケースについてはhttps://github.com/jpillora/prettyprinterを参照してください。

これを解決するためのクリーンな方法はありますか?または複数のベースURLを実現するには?

注:複数のrequireインスタンスも調べましたが、アプリがフレームワークの構成にアクセスできるようにしたいので、それが機能するとは思いません。

4

4 に答える 4

35

RequireJS Github IssueのページでJamesBurkeが回答しました:Issue#447:複数のベースURL・jrburke/requirejs

data-mainがスクリプトへの唯一のエントリポイントである場合(詳細についてはコメント)、非常に単純であることがわかります。特定の問題を次のように解決しました。

私のアプリのindex.html

<script src="http://framework.jpillora.com/js/lib/require.js" 
  data-main="http://framework.jpillora.com/js/framework" > </script>

requirejsエントリポイントが次のように設定されていframework.jsます:

var framework = ... //set using script elements src attribute

require.config({

    baseUrl: 'js/',

    //Framework paths
    paths: {
      'framework': framework,
      'lib'      : framework + 'js/lib',
      'ext'      : framework + 'js/ext',
      'util'     : framework + 'js/util'
    },

    //Shortcuts
    map: {
      '*': {
        ...
      }
    },

    //Non-modularised libraries with deps
    shim: {
      ...
    }
});

require(['main']);

そのため、通常行う代わりに、フレームワークコードへのパスに関するアプリコードの知識をアプリコードに与えるindex.html->main.js追加のステップを追加します。index.html->framework.js->main.js

たとえば、アプリhttp://prettyprint.jpillora.com/では、requireが読み込まれると、 http://framework.jpillora.com/framework.jsのパスを設定し、必要に応じてそのように設定します。ベースURLを独自のドメインに設定し、別のドメインを指すようにします。lib/...baseUrl./js/mainlib

その結果、次のようにrequire(['lib/foo', 'view/bar']); 解決されます。

http://framework.jpillora.com/js/lib/foo.jshttp://prettyprint.jpillora.com/js/view/bar.js

ここに表示されているように、アプリは他のmain.jsすべてのものが:から来ているframeworkだけです

chromedevtoolsロード済みアプリ

main.jsしたがって、最後に、上記を使用してアプリのビアをロードするたびにframework.js、一般的に使用されるすべてのライブラリとユーティリティクラスにアクセスできます。アプリのソースを参照してください。

また、r.jsオプティマイザーと優れたローカルファイル構造を使用すると、アプリを1つのjsファイルに最適化して、から必要なものだけを取得することもできますframework

于 2012-09-09T14:52:07.393 に答える
10

問題

テスト環境をセットアップしようとしたときに、同様の問題が発生しました。私はこのようなファイル構造を持っていました:

myApp/
    src/
        js/
            app.js
            data.js
            lib/underscore.js
    test/
        karma.conf.js
        test-main.js
        matchers.js
        spec/
            data.js

ここで注意が必要です。私のアプリスクリプト(app.jsおよび)は、、などに解決されるRequireJSdata.js構成を想定しているため、テスト環境でもその構成が必要です。datasrc/js/data.jslib/underscoresrc/js/lib/underscore.js

test/test-main.js
-----------------
require.config({
  // Karma serves files under /base, which is the basePath from your config file
  baseUrl: '/base/src/js',
  // ...
});

これで、テストを作成できます。

test/spec/data.js
-----------------
define(['data', '../../test/matchers'], function(dataModule) {
    describe('The data module', function() {
        it('should satisfy my custom matcher', function() {
            expect(dataModule).toSatisfyMyCustomMatcher();
        });
    });
});

一部のカスタムマッチャーの場合:

test/matchers.js
----------------
define([], function() {
    beforeEach(function() {
        this.addMatchers({
            toSatisfyMyCustomMatcher: function() {
                return this.actual.isGood;
            },
        });
    });
});

しかし、その'../../test/matchers'部分はひどく醜いです。テスト仕様は、他のモジュールへのファイルパスを知ることに悩まされるべきではありません-それはRequireJSの仕事です。代わりに、シンボリック名を使用します。

ソリューション

RequireJSパス構成は、ディレクトリをマップすることもできます。

パスマッピングはディレクトリ用である可能性があるため、モジュール名に使用されるパスには拡張子を含めないでください。

したがって、解決策は単純なパス構成です。

test/test-main.js
-----------------
require.config({
  baseUrl: '/base/src/js',
  paths: {
      test: '../../test',
  },
  // ...
});

testこれで、ディレクトリをbaseUrl:の子であるかのように参照できます。

test/spec/data.js
-----------------
define(['data', 'test/matchers'], function(dataModule) {
    // ...
});

私の場合、これは、複数のを持っている場合とほとんど同じように効果的に出てきますbaseUrl

于 2014-08-05T10:09:20.267 に答える
0

大規模な製品開発のリファレンスアーキテクチャであるBoilerplateJSで、ルーティングとコンテキストをどのように処理したかをご覧ください。ライブラリcrossroads.jsを使用して、モジュールとUIコンポーネントをルーティングしました。パス/ハッシュをルートのセットに追加するだけで、フレームワークを介してルーティングされます。

として、UIコンポーネントのすべてのパスがURLコントローラーオブジェクトに追加されます。

アプリケーション全体のフレームワーク構成情報へのアクセスに関しては、構成/設定を、アプリケーション内でアクセスできるグローバルコンテキストオブジェクトにアタッチできます。

于 2012-09-07T03:55:19.870 に答える
0

requirejsマルチバージョン

これを試して

コンテキスト:読み込みコンテキストに付ける名前。これにより、require.jsは、各トップレベルのrequire呼び出しで一意のコンテキスト文字列が指定されている限り、ページに複数のバージョンのモジュールをロードできます。正しく使用するには、マルチバージョンサポートのセクションを参照してください。

于 2019-06-18T22:27:37.163 に答える