5

私はrequirejsを使用して製品アーティファクトを構成しているため、ライブラリを組み合わせてそれらの間のモジュールの依存関係を設定し、requirejsのgruntタスクを使用して適切なロードシーケンスを取得しています。結合されていないライブラリにアクセスできる livereload サーバーで、ランタイム モジュール インジェクションを使用しても問題はありません。わかりやすくするために、すべての縮小/醜化を無効にし、js-beautify をオンにしました。

    requirejs: {
        dist: {
            // Options: https://github.com/jrburke/r.js/blob/master/build/example.build.js
            options: {
                // `name` and `out` is set by grunt-usemin
                // name: 'App',
                baseUrl: yeomanConfig.app + '/scripts',
                mainConfigFile: yeomanConfig.app + '/scripts/config.js',
                out: yeomanConfig.dist + '/scripts/main.js',
                optimize: 'none',
                // TODO: Figure out how to make sourcemaps work with grunt-usemin
                // https://github.com/yeoman/grunt-usemin/issues/30
                //generateSourceMaps: true,
                // required to support SourceMaps
                // http://requirejs.org/docs/errors.html#sourcemapcomments
                beautify: false,
                removeCombined: false,
                generateSourceMaps: false,
                preserveLicenseComments: false,
                useStrict: true,
                mangle: false,
                compress: false,
                // wrap: true,
                // https://github.com/mishoo/UglifyJS2
            }
        }
    },

Kendo、Angular、Angular-Keno-UI を使用しています。Kendo が AMD モジュール対応であることは理解していますが、Angular-Keno-UI のようには見えません。シムを作成し、適切なrequirejs定義関数にラップすることを期待していましたが、これが起こっているとは思いません。

    require.config({
        cjsTranslate: true,
        paths: {
            jquery: 'vendor/jquery/jquery',
            'angular-kendo-ui': 'vendor/angular-kendo-ui/build/angular-kendo',
            kendo: 'vendor/kendoui.complete.2013.2.918.trial/js/kendo.all.min',
            angular: 'vendor/angular/angular',
            requirejs: 'vendor/requirejs/require',
            'angular-animate': 'vendor/angular-animate/angular-animate',
            'angular-ui-router': 'vendor/angular-ui-router/release/angular-ui-router.min',
            'angular-resource': 'vendor/angular-resource/angular-resource'
        },
        shim: {
            jquery: {
                exports: '$'
            },
            angular: {
                deps: [
                    'jquery'
                ],
                exports: 'angular'
            },
            'angular-resource': {
                deps: [
                    'angular'
                ]
            },
            'angular-kendo-ui': {
                deps: [
                    'angular',
                    'kendo'
                ]
            },
            'angular-ui-router': {
                deps: [
                    'angular'
                ]
            }
        }
    });

モジュールの準備不足を解決するために、次のように自分でラップします。

    define('angular-kendo-ui', [
        'angular', 
        'kendo'
      ], function (
        angular,
        kendo
      ) {
        < original angular-kendo-ui source >
    });

シムの適用を誤解していませんか? 私が持っているように見えますが、実際には定義されたパスをラップするのではなく、モジュールが要求された場合にパスを指すだけです(動的モジュールのロードでは問題ありません)。

これらのテクノロジーを最初に精査しているときに、requirejs (またはパイプライン内のアセットミューテーターの 1 つ) にモジュールを自動的にラップさせる方法があることに気づきました。誰もが私にヒントを持っています。構成で定義されたモジュールをパスとしてラップするのはrequirejsだったと思いますが、おそらく私は間違っていました。以下は、実行中のタスクの出力です。

    Done, without errors.

    Elapsed time
    build                          887ms
    useminPrepare:html             22ms
    concurrent:dist                8s
    autoprefixer:dist              174ms
    requirejs:dist                 19s
    jsbeautifier:dist              2s
    concat:public/styles/main.css  46ms
    concat:public/scripts/main.js  56ms
    cssmin:public/styles/main.css  81ms
    copy:dist                      26ms
    usemin:html                    5s
    usemin:css                     24s
4

1 に答える 1

2

(オプティマイザーのバージョンに応じて)単なる推測ですが、それほどクールではありませんが、config-documentation には次のように記載されています。

2.1.11 以降、shim された依存関係を define() ラッパーでラップして、中間の依存関係が AMD に独自の依存関係がある場合に役立ちます。標準的な例は、jQuery と Underscore に依存する Backbone を使用するプロジェクトです。AMD 互換バージョンの Backbone は、依存関係の準備が整うまで define() 関数を実行しないため、バックボーンをすぐに利用できるようにする必要のある shimmed 依存関係は、ビルドで表示されません。これらの shim された依存関係をラップすることで、これを回避できますが、それらの shim された依存関係が奇妙な方法でグローバル スコープを使用すると、他のエラーが発生する可能性があるため、ラップするのは既定の動作ではありません。

だから多分使用:

wrapShim: true

https://github.com/jrburke/r.js/blob/master/build/example.build.js

「mainConfigFile」を使用すると、shim 構成が既にオプティマイザーにあるはずなので、これが別の障害点になることがよくあります。

于 2014-06-05T06:20:55.327 に答える