要求使用垫片

时间:2012-05-29 16:19:12

标签: backbone.js requirejs

使用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>

2 个答案:

答案 0 :(得分:23)

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

听起来只是部分使用require.js是错误的,你可能也会把它们全部加载掉。要做到这一点,你需要改变这样的垫片:

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

    underscore: {
        exports: "_"
    }
}

当然会更新您的paths

答案 1 :(得分: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>