0

当我使用 requirejs (v2.1.13) 包含 log4javascript (v1.4.10) js 变量log4javascript是未定义的,但是正如我在 chrome 网络控制台中看到的那样,log4javascript.js 已成功加载。

这是我的requirejs配置:

requirejs.config({
'baseUrl': 'resources/js',
'paths': {
    'angular': 'libs/angularjs/angular',
    'jquery' : 'libs/jquery/jquery-2.1.1.min',
    'bootstrap' : 'libs/bootstrap/bootstrap',
    'log4javascript': 'libs/log4javascript/log4javascript_uncompressed'
},
'shim' : {
    'angular' : {'exports' : 'angular', deps: ['jquery']},
    'jquery': {'exports' : 'jquery'},
    'bootstrap': {'exports' : 'bootstrap', deps: ['jquery']}
}});

Sine 1.4.10 log4javascript 应该支持 AMD,所以我不需要添加 shim。

我不明白我做错了什么。请帮忙!

UPD:1.4.10 版中的 AMD 支持似乎有问题,因为当我在“log4javascript_uncompressed.js”中注释掉以下行并添加 shim 时,一切都变得很好:

/*
if (typeof define == "function" && define.amd) {
    // AMD. Register as an anonymous module.
    define(factory);
} else if (typeof module != "undefined" && typeof exports == "object") {
    // Node/CommonJS style
    module.exports = factory();
} else {
    // No AMD or CommonJS support so we place log4javascript in (probably) the global variable
*/
    root.log4javascript = factory();
//}
4

1 回答 1

3

当我使用 requirejs (v2.1.13) 包含 log4javascript (v1.4.10) js 变量 log4javascript 是未定义的,但是正如我在 chrome 网络控制台中看到的那样,log4javascript.js 已成功加载。

如果一切正常,这正是会发生的事情。看看你注释掉的代码。当 log4javascript 检测到 AMD 加载程序时,它不会将名为的变量泄漏log4javascript到全局空间中。仅当它既未检测到 AMD 加载程序也不检测到它在 Node.js 中运行时,它才会泄漏该变量。

如果使用 log4javascript 的代码都在 AMD 模块中,那么访问 log4javascript 的正确方法是将其作为依赖项包含在defineorrequire调用中。例如,require(['foo', 'log4javascript'], function (foo, log4javascript) {...});

如果您必须使用期望log4javascript变量存在于全局空间中的代码,您可以通过故意泄漏变量来解决它。有关如何执行此操作的详细信息,请参阅此答案。

于 2015-01-28T11:24:21.887 回答