50

以下のシムの「エクスポート」プロパティの目的は何ですか? 本当に必要ですか?

requirejs.config({
    shim: {
        'backbone': {
            deps: ['underscore', 'jquery'],
            exports: 'Backbone'
        }
    }
});

冗長に思えるので質問します - モジュールが依存関係リストに含まれている場合、エクスポートされた名前を関数の引数として再度指定します。

define(['backbone'], function (Backbone) {
  return Backbone.Model.extend({});
});
4

4 に答える 4

36

shim例で が使用されていない場合Backbone、Backbone は AMD に準拠しておらず、RequireJS が使用するオブジェクトを返さないため、パラメーターとして渡すオブジェクトは未定義になります。

define(['backbone'], function (Backbone) {
  // No shim? Then Backbone here is undefined as it may
  // load out of order and you'll get an error when
  // trying to use Model
  return Backbone.Model.extend({});
});

コンテキストを少し説明するために、r.js オプティマイザーが吐き出すコードを使用しますが、この例では単純化します。オプティマイザーが生成するものを読むことで、そのポイントを理解するのに役立ちました。

shimmed Backbone は次のようになります。

// Create self invoked function with the global 'this'
// passed in. Here it would be window
define("backbone", (function (global) {
    // When user requires the 'backbone' module
    // as a dependency, simply return them window.Backbone
    // so that properites can be accessed
    return function () {
        return global.Backbone;
    };
}(this)));

要点は、モジュールを要求したときに RequireJS に何かを返してもらうことです。モジュールを実行する前に、それが最初に読み込まれるようにします。オプティマイザーの場合は、事前にライブラリーを埋め込むだけです。

于 2012-12-31T03:04:15.963 に答える
29

「エクスポート」 バックボーンを使用しない場合、backbone.jsで定義されているBackbone(window.Backbone)へのモジュール内のロケール参照を取得できません。

//without export Backbone
shim : {
  'bbn':{
        //exports:'Backbone',
        deps:['underscore']
    },
    'underscore': {
        exports: '_'
    }
};


require(['bbn'], function(localBackbone) {
  //localBackbone undefined.
  console.log('localBackbone:,' localBackbone);
});

RequireJsは次のように説明しています。

//RequireJS will use the shim config to properly load 'backbone' and give a local
//reference to this module. The global Backbone will still exist on
//the page too.
define(['backbone'], function (Backbone) {
  return Backbone.Model.extend({});
});

RequireJSはshimconfigを使用してグローバルバックボーンを取得します

function getGlobal(value) {
        if (!value) {
            return value;
        }
        var g = global;
        each(value.split('.'), function (part) {
            g = g[part];
        });
        return g;
    }
于 2013-03-21T05:40:05.177 に答える
2

また、「エクスポート」でプラグインの実際のエクスポートを使用したい場合があることに注意してください。例えば、

requirejs.config({
    shim: {
        'jquery.colorize': {
            deps: ['jquery'],
            exports: 'jQuery.fn.colorize'
        },
        'jquery.scroll': {
            deps: ['jquery'],
            exports: 'jQuery.fn.scroll'
        },
        'backbone.layoutmanager': {
            deps: ['backbone']
            exports: 'Backbone.LayoutManager'
        },
        "jqueryui": {
            deps: ["jquery"],
            //This is because jQueryUI plugin exports many things, we would just 
            //have reference to main jQuery object. RequireJS will make sure to
            //have loaded jqueryui script.
            exports: "jQuery"  
        },
        "jstree": {
            deps: ["jquery", "jqueryui", "jquery.hotkeys", "jquery.cookie"],
            exports: "jQuery.fn.jstree"
        },
        "jquery.hotkeys": {
            deps: ["jquery"],
            exports: "jQuery"  //This plugins don't export object in jQuery.fn
        },
        "jquery.cookie": {
            deps: ["jquery"],
            exports: "jQuery" //This plugins don't export object in jQuery.fn
        }
    }
});

詳細: https://github.com/jrburke/requirejs/wiki/Upgrading-to-RequireJS-2.0#wiki-shim

于 2013-11-03T08:47:39.973 に答える
1

Shim エクスポートは、requirejs に非 AMD モジュールの処理方法を知らせるためのものです。これがないと、モジュールの開始中に定義ブロックの依存関係が読み込まれます。これは、requirejs がリソースの読み込みを停止したこと、およびモジュールがそれを使用できるようになったことを通知します。

少なくとも、私はそう見ています。

于 2012-12-30T22:51:38.697 に答える