Require.JS垫片配置全球范围内?(Require.JS shim config global

2019-08-19 01:29发布

我有以下的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
});

如果我使用垫片加载JS文件,一旦加载它,它成为全球可用的,我不必再加载其他模块相同的依赖我这里不明白的是。

Answer 1:

骨干并强调修改都在全球范围内,因此,如果浏览器上运行他们的代码,那么全局将存在。

如果加载在RequireJS垫片,或者如果你提供直接的SRC script标签会发生这种情况。

一旦全局的存在,他们的存在(除非明确delete d我猜)。

这是的jsfiddle使用垫片的一个简单的例子 ,并看到该值(对于某些库)设置为全局变量。

该示例的目的是要表明,该全局变量的值仅由内部保证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);

示例输出



文章来源: Require.JS shim config global scope?