3

要在内容脚本中加载模块,我使用以下代码(来源http://prezi.com/rodnyr5awftr/requirejs-in-chrome-extensions/):

require.load = function (context, moduleName, url) {
    var xhr;
    xhr = new XMLHttpRequest();
    xhr.open("GET", chrome.extension.getURL(url) + '?r=' + new Date().getTime(), true);
    xhr.onreadystatechange = function (e) {
        if (xhr.readyState === 4 && xhr.status === 200) {
            eval(xhr.responseText);
            context.completeLoad(moduleName)
        }
    };
    xhr.send(null);
};

通过 Chrome 控制台进行调试时会出现问题。每当我的一个模块中出现错误时,它只会报告匿名函数中发生的错误,但不会通知我该模块中的哪个 require.js 模块或行发生了错误,而是始终指向返回中的 eval 行上面的脚本。

由于很多人在使用带有 chrome 扩展的 require.js 时似乎在使用上述代码的不同变体,因此必须有一种简单的方法可以在调试控制台中获取更多信息,我只是不知道那是什么:)。

谢谢你的帮助!!

更新 4/1:将上面的 eval() 语句更改为使用 Function() 似乎已经解决了问题,因为 chrome 控制台添加了附加信息。(这项工作的功劳归于这个问题)。

我意识到这两个功能不是完全可以互换的(见这个问题)。如果有人知道在上面的代码中使用 Function() 而不是 eval() 的任何陷阱,请告诉我!

4

1 回答 1

4

你可以换行

        eval(xhr.responseText);

经过

        eval(xhr.responseText + "\n//@ sourceURL=" + url);

这样,您将在原始 url 下的源代码面板中看到所有已评估的代码。

于 2013-04-01T16:13:52.700 回答