Javascript 如何在requirejs中处理被阻止的脚本
我正在使用requirejs加载谷歌分析。 在配置中,我有Javascript 如何在requirejs中处理被阻止的脚本,javascript,google-analytics,requirejs,Javascript,Google Analytics,Requirejs,我正在使用requirejs加载谷歌分析。 在配置中,我有 requirejs.config({ “路径”:{ “ga”:“//www.google-analytics.com/analytics”, … 我有一个模块,它依赖于初始化分析的ga 除非有人使用阻止谷歌分析的浏览器插件,否则一切正常。 当这种情况发生时,产生的javascript错误会破坏一切 无法加载资源:被客户端阻止 未捕获错误:ga的脚本错误 如果某个模块无法加载,我如何告诉requirejs不要尝试? 如何使模块成为可选
requirejs.config({
“路径”:{
“ga”:“//www.google-analytics.com/analytics”,
…
我有一个模块,它依赖于初始化分析的ga
除非有人使用阻止谷歌分析的浏览器插件,否则一切正常。
当这种情况发生时,产生的javascript错误会破坏一切
- 无法加载资源:被客户端阻止
- 未捕获错误:ga的脚本错误
谢谢。您可以在自己的模块代码中要求模块,但在模块定义要求之外,但这确实意味着您不能很容易地链接到所需的依赖项
define([ /* Normal dependencies here ... */], function() {
try {
require(['ga']);
} catch (error) {
// Handle lack of GA if needed
}
};
或者,您必须编写自己的模块包装器,该包装器在尝试上述操作时同步阻塞,如果成功则返回GA,否则返回null。
require
接受第三个参数,这是一个错误回调,因此您可以将window.GA
分配给始终返回未定义的函数。这避免了er在代码的其他地方调用google analytics函数时出现ROR
require(['ga'], function(data) {
window.ga('create', 'UA-XXXXXXXX-X');
window.ga('send', 'pageview');
}, function() {
window.ga = function(){};
});
我发现最好的方法是使用数组符号进行路径定义。这样,您可以在requirejs路径配置中定义模块的外部URL和本地回退。无需额外的
try/catch
块或模块特定的错误处理
文档链接:
我定义了一个名为noop
的模块,该模块定义了一个空函数,然后设置如下路径:
requirejs.config({
“路径”:{
“ga”:[
“//www.google-analytics.com/analytics”,
“util/noop”
],
...
最佳解决方案,适合我。
打开lib/mage/requirejs/resolver.js
文件
替换为以下代码:
感谢这似乎不适用于requirejs Optimizer这确实是一个很好的解决方案。因为我有两个社交网络,所以我必须创建两个不同的noop文件(noop1.js和noop2.js)来完成这项工作。它们的内容是
define(function(){})
这一个对我来说并没有起到预期的作用:catch块没有捕获任何内容,但至少requirejs没有完全崩溃。Brendan Nee的另一个答案是第二次回调。
/**
* Checks if provided module has unresolved dependencies.
*
* @param {Object} module - Module to be checked.
* @returns {Boolean}
*/
function isPending(module) {
return !!module.depCount;
}
/**
* Checks if provided module is rejected during load.
*
* @param {Object} module - Module to be checked.
* @return {Boolean}
*/
function isRejected(module) {
return registry[module.id] && (registry[module.id].inited || registry[module.id].error);
}
/**
* Checks if provided module has unresolved dependencies.
*
* @param {Object} module - Module to be checked.
* @returns {Boolean}
*/
function isPending(module) {
if (!module.depCount) {
return false;
}
return module.depCount > _.filter(module.depMaps, isRejected).length;
}