Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在requirejs中处理被阻止的脚本_Javascript_Google Analytics_Requirejs - Fatal编程技术网

Javascript 如何在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加载谷歌分析。 在配置中,我有

requirejs.config({
“路径”:{
“ga”:“//www.google-analytics.com/analytics”,
…

我有一个模块,它依赖于初始化分析的ga

除非有人使用阻止谷歌分析的浏览器插件,否则一切正常。 当这种情况发生时,产生的javascript错误会破坏一切

  • 无法加载资源:被客户端阻止
  • 未捕获错误:ga的脚本错误
如果某个模块无法加载,我如何告诉requirejs不要尝试? 如何使模块成为可选模块


谢谢。

您可以在自己的模块代码中要求模块,但在模块定义要求之外,但这确实意味着您不能很容易地链接到所需的依赖项

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;
    }