9

通过 requirejs2 使用 shim,有一种方法可以告诉要求一个模块已经加载?

例子:

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="undescrore.js"></script>
<script type="text/javascript" src="require.js'"></script>
<script type="text/javascript">
    require.config({
        paths: {
            "backbone": '/vendor/js/backbone-min.js'
        },
        shim: {
            'backbone': {
                //These script dependencies should be loaded before loading
                //backbone.js
                deps: ['underscore', 'jquery'], // here I would like to load the already loaded library
            }
        }
    });
</script>
4

2 回答 2

23

好吧,如果下划线已经加载并且可用,则根本不需要 shim。Backbone 将愉快地加载。如果没有,可能是因为下划线实际上没有加载。

然而,仅部分使用 require.js 听起来是错误的,您不妨将它们全部加载到 AMD 中。为此,您需要像这样更改垫片:

shim: {
    backbone: {
        deps: ["underscore", "jquery"],
        exports: "Backbone"
    },

    underscore: {
        exports: "_"
    }
}

当然更新你的paths.

于 2012-05-29T19:57:36.390 回答
1

我不确定您是否能够为您的用例找到最佳方法。如果您真的 - 出于某种原因 - 需要添加其他脚本而不使用代码示例@js999 中的 RequireJS,那么您需要检查这些脚本的全局变量 (jQuery, _) 是否存在,然后将它们定义为模块. 从您的代码示例中,它看起来像这样:

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="undescrore.js"></script>
<script type="text/javascript" src="require.js'"></script>
<script type="text/javascript">
    // check for jQuery 
    if (window.jQuery) {
        define('jquery', [], function () {
            return window.jQuery;
        });
    }

    // check for underscore
    if (window._) {
        define('underscore', [], function () {
            return window._;
        });
    }

    require.config({
        paths: {
            // remove the file extension (.js)          
            "backbone": '/vendor/js/backbone-min'
        },
        shim: {
            'backbone': {
                deps: ['underscore', 'jquery']
            }
        }
    });
</script>
于 2014-03-30T17:14:31.657 回答