如何在requirejs中处理被阻止的脚本

时间:2014-08-04 15:29:07

标签: javascript google-analytics requirejs

我使用require js来加载谷歌分析。 在配置中我有

requirejs.config({ "paths": { "ga": "//www.google-analytics.com/analytics", ...

我有一个依赖于初始化分析的模块。

一切正常,直到有人使用阻止谷歌分析的浏览器插件。 当发生这种情况时,生成的javascript错误会破坏所有内容。

  • 无法加载资源:被clien阻止
  • 未捕获错误:脚本错误:ga

如果某个模块无法加载,如何判断requirejs是否合适? 如何使模块可选?

感谢。

4 个答案:

答案 0 :(得分:3)

您可以在自己的模块代码中要求模块,但在模块定义要求之外,但这确实意味着您不能轻松地链接您需要的依赖项。即。

define([ /* Normal dependencies here ... */], function() {

    try {
        require(['ga']);
    } catch (error) {
        // Handle lack of GA if needed
    }

};

或者你必须编写自己的模块包装器,在尝试上述操作时同步阻塞,如果成功则返回GA,否则返回null。

答案 1 :(得分:3)

require接受第3个参数,这是一个错误回调,因此您可以将window.ga分配给始终返回undefined的函数。这可以避免在代码中的其他位置调用Google Analytics功能时出错。

require(['ga'], function(data) {
  window.ga('create', 'UA-XXXXXXXX-X');
  window.ga('send', 'pageview');
}, function() {
  window.ga = function(){};
});

答案 2 :(得分:1)

我发现最好的方法是使用数组表示法进行路径定义。这样,您可以在requirejs路径配置中定义模块的外部URL和本地回退。无需额外的try/catch块或特定于模块的错误处理。

文档链接: http://requirejs.org/docs/api.html#pathsfallbacks

我定义了一个名为noop的模块,它定义了一个空函数,然后像这样设置我的路径:

requirejs.config({ "paths": { "ga": [ "//www.google-analytics.com/analytics", "util/noop" ], ...

答案 3 :(得分:0)

最佳解决方案,对我有用。

  

打开BenettonGroupPackingList文件。

lib/mage/requirejs/resolver.js
  

替换下面的代码:

   /**
     * Checks if provided module has unresolved dependencies.
     *
     * @param {Object} module - Module to be checked.
     * @returns {Boolean}
     */
    function isPending(module) {
        return !!module.depCount;
    }

谢谢