Backbone.js需要RequireJS“shim”吗?

时间:2017-12-02 00:14:30

标签: javascript backbone.js requirejs amd

最近版本的Backbone.js和Underscore.js似乎支持AMD。

所以我认为不再需要在require.js配置中“填充”这些库是正确的吗?

2 个答案:

答案 0 :(得分:2)

是的,你是对的,不需要垫片。它很容易测试,这是最简单的设置:

requirejs.config({
    /**
     * Paths to lib dependencies.
     *
     * Use non-minified files where possible as they will be minified (and
     * optimized via uglify) on release build (r.js)
     */
    paths: {
        "jquery": "libs/jquery/dist/jquery",
        "underscore": "libs/underscore/underscore",
        "backbone": "libs/backbone/backbone",
    },

    deps: ["app"] // starts the app
});

并确保它有效并且不是使用的全球Underscore:

// I'm using Underscore as to avoid conflicting with the global _
// but you could use _ as the name for the local variable as well.
define(['backbone', 'underscore'], function(Backbone, Underscore) {
    console.log("Backbone:", Backbone.VERSION)
    console.log("Local Underscore:", Underscore.VERSION);
    console.log("Global Underscore:", _.VERSION, _ === Underscore);
});

对于Backbone,在the source中很明显它默认支持AMD:

// Set up Backbone appropriately for the environment. Start with AMD.
if (typeof define === 'function' && define.amd) {
  define(['underscore', 'jquery', 'exports'], function(_, $, exports) {
    // Export global even in AMD case in case this script is loaded with
    // others that may still expect a global Backbone.
    root.Backbone = factory(root, exports, _, $);
  });

对于下划线,它是registering itself at the end

// AMD registration happens at the end for compatibility with AMD loaders
// that may not enforce next-turn semantics on modules. Even though general
// practice for AMD registration is to be anonymous, underscore registers
// as a named module because, like jQuery, it is a base library that is
// popular enough to be bundled in a third party lib, but not be part of
// an AMD load request. Those cases could generate an error when an
// anonymous define() is called outside of a loader request.
if (typeof define === 'function' && define.amd) {
  define('underscore', [], function() {
    return _;
  });
}

jQuery相同:

// Register as a named AMD module, since jQuery can be concatenated with other
// files that may use define, but not via a proper concatenation script that
// understands anonymous AMD modules. A named AMD is safest and most robust
// way to register. Lowercase jquery is used because AMD module names are
// derived from file names, and jQuery is normally delivered in a lowercase
// file name. Do this after creating the global so that if an AMD module wants
// to call noConflict to hide this version of jQuery, it will work.

// Note that for maximum portability, libraries that are not jQuery should
// declare themselves as anonymous modules, and avoid setting a global if an
// AMD loader is present. jQuery is a special case. For more information, see
// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon

if ( typeof define === "function" && define.amd ) {
    define( "jquery", [], function() {
        return jQuery;
    } );
}

答案 1 :(得分:0)

正如@ggozad所说:

  

好吧,如果下划线已经加载并且可用,则不需要   垫片。 Backbone很乐意加载。如果没有,可能就是这样   因为下划线实际加载。

     

听起来只是部分使用require.js是错误的,你   不妨将AMD全部加载。

我想这可以解释为什么你不需要使用require.js加载它