2

我对requireJS有以下设置。

requirejs.config({
     paths: {
            'resources' : '/Scripts/resources'
     },
     shim: {
             'resources': {
                           exports: 'LocalizedStrings'
           }
     }
});

我的 resources.JS 如下所示:

LocalizedStrings = {
                    title: "Demo",
                    save: "Save"
}

现在,当我在 main.JS 文件中加载资源作为依赖项时,我可以访问 LocalizedStrings 并且它可以工作。

//main.js
define(function(require){
    var LocalizedStrings = require('resources');
    console.log(LocalizedStrings); //works as expected
});

但是在其他模块上,我真的不需要加载资源作为访问“LocalizedStrings”的依赖项。

//othermodule.js
define(function(require){
    console.log(LocalizedStrings); //works as expected even though resources dependency is not loaded
});

我在这里不明白的是,如果我使用 shim 加载一个 JS 文件并加载一次,它是否会变得全局可用并且我不必在其他模块中再次加载相同的依赖项。

4

1 回答 1

18

Backbone 和 Underscore 都修改了全局作用域,所以如果浏览器运行了它们的代码,那么全局变量就会存在。

如果在 RequireJS 中作为 shim 加载,或者您直接在其 src 中包含脚本标记,则会发生这种情况。

一旦全局变量存在,它们就存在(除非delete我猜得明确)。

这个 jsfiddle 是一个使用 shims 的简单示例,并且看到值(对于某些库)被设置为全局变量。

该示例的目的是表明全局变量的值仅在require()调用内部得到保证。(如果使用 AMD 加载程序,而不是简单地将库导入script标签中)。并且全局变量的值将在未来某个不确定的时间存在。

源代码

require.config({
    shim: {
        underscore: {
            exports: '_'
        },
        backbone: {
            deps: ["underscore", "jquery"],
            exports: "Backbone"
        }
    },
    paths: {
        jquery: "http://code.jquery.com/jquery-1.9.1",
        backbone: "http://backbonejs.org/backbone",
        underscore: "http://underscorejs.org/underscore"
    }
});

function appendVersions(msg, $, _, Backbone) {
    var pre = document.getElementById("content");
    var s = "<h2>" + msg + "</h2>";
    s += "jquery=";
    try { s += $.fn.jquery; } catch (e) { s += e.msg; }
    s += "<br>";
    s += "_=";
    try { s += _.VERSION; } catch (e) {  s += e.msg; }
    s += "<br>";
    s += "Backbone=";
    try { s += Backbone.VERSION; } catch (e) {  s += e.msg; }
    pre.innerHTML += s;
}

appendVersions("Before require (will be undefined)", window["$"], window["_"], window["Backbone"]);

require(["jquery", "underscore", "backbone"], function ($, _, Backbone) {
    appendVersions("Inside Require (should *always* be ok, unless the scripts aren't there)", $, _, Backbone);
});

appendVersions("After require (Probably be undefined, as the require probably won't have loaded the scripts yet)", window["$"], window["_"], window["Backbone"]);

setTimeout(function () {
    appendVersions("After Timeout (should be ok, but depends on how quickly the scripts load. Try changing the timeout duration)", window["$"], window["_"], window["Backbone"]);
}, 2000);

样本输出

在此处输入图像描述

于 2013-04-02T14:14:25.657 回答