Requirejs using shim

2019-01-27 17:41发布

问题:

Using shim by requirejs2, there is a way to tell to requires that a module is already loaded?

Example:

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

回答1:

Well, if underscore is already loaded and available, you do not need the shim at all. Backbone will happily load. If not, it's probably because underscore is not actually loaded.

It sounds however wrong to be only partially using require.js, you might as well AMD-load them all. To do that you will need to change your shim like this:

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

    underscore: {
        exports: "_"
    }
}

and of course update your paths.



回答2:

I am not sure if you were able to find the best approach yet for your use case. If you really - for some reason - need to add your other scripts without using RequireJS as in your code example @js999, then you would need to check if the global variable (jQuery, _) of those scripts exist and then define them as modules. From your code example it would look something like this:

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