我有以下的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文件,一旦加载它,它成为全球可用的,我不必再加载其他模块相同的依赖我这里不明白的是。
骨干并强调修改都在全球范围内,因此,如果浏览器上运行他们的代码,那么全局将存在。
如果加载在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);
示例输出