Google chrome extension 在生产版本中启用/禁用console.log

Google chrome extension 在生产版本中启用/禁用console.log,google-chrome-extension,firefox-addon-webextensions,Google Chrome Extension,Firefox Addon Webextensions,基于一个标志,我想在生产版本中启用或禁用控制台.log。但我不想向我的用户公开这个选项,因为那样每个人都会问这个问题,浪费我的时间 如果我允许通过“选项”对话框将此类标志存储在用户首选项中,直到加载这些首选项,我的代码将从控制台输出。log输出,直到从chrome存储加载该标志 我可以使用扩展创建调试标志cookie,但不幸的是,我的扩展可以在许多站点上工作 如果我在生产版本中完全禁用了console.log,但当客户端遇到问题时,那么此时我将无法查看console.log来调试它。所以这是不可

基于一个标志,我想在生产版本中启用或禁用
控制台.log
。但我不想向我的用户公开这个选项,因为那样每个人都会问这个问题,浪费我的时间

如果我允许通过“选项”对话框将此类标志存储在用户首选项中,直到加载这些首选项,我的代码将从
控制台输出。log
输出,直到从chrome存储加载该标志

我可以使用扩展创建调试标志cookie,但不幸的是,我的扩展可以在许多站点上工作

如果我在生产版本中完全禁用了
console.log
,但当客户端遇到问题时,那么此时我将无法查看
console.log
来调试它。所以这是不可行的


从第一行我的扩展是否知道每次运行扩展时是否需要绕过console.log(包括BG脚本、内容脚本和选项对话框)?

没有任何东西可以在所有上下文中设置一个值,而您不必异步获取该值。你必须处理好它

主要方法:等待信息。延迟执行直到可用。 处理这种情况的正常方法是将可能需要信息的所有处理放入程序流中,该程序流从对
存储的异步调用的回调开始。*
。这在异步编程中是正常的和预期的。在几乎所有的情况下,这就是你应该如何处理它

对于后台上下文中的脚本(后台脚本/事件页面、弹出窗口、选项页面等),等待信息应该很容易。对于后台脚本以外的任何内容,这些脚本几乎都是基于用户交互的功能,这意味着获取
存储的延迟。本地
应该是微不足道的。如果不是,则始终可以将该值复制到后台页面中的变量,后台上下文中的任何脚本都可以直接同步访问该变量(请参见:)

对于后台脚本,还可以使用同步的
localStorage
。然而,并非所有情况下都能获得这些数据

对于内容脚本,需要延迟异步数据可能意味着提前移动注入时间。换句话说,您可能需要在
document\u start
处注入(或),而不是
document\u idle
document\u end
。然后,您需要将其余的处理延迟到文档准备好/加载之后

对于已在
文档\u开始加载的内容脚本
专门用于
console.log()
对于您的特定问题,通过
console.log()
输出,您可以将通常发送到
console.log()
的输出排队,直到从
storage.local
的异步调用返回数据。获得数据后,您可以A)输出队列中的所有内容并将其设置为正常输出,或者B)转储队列中的所有内容并将每个调用设置为丢弃

只需覆盖
console.log
上的函数指针以指向队列函数、正常的
console.log()
或空函数,即可轻松完成所有这些操作。因此,不需要更改脚本其余部分调用
console.log()
的方式。如果您在
console
中使用其他函数,它会变得更加复杂,但是
console.log()
很容易(我这样做是出于测试期间的性能原因,而不是为了这个特定问题)

一般情况下(即,对于以后无法排队的事物) 这一个充其量也不是微不足道的。对于通过manifest.json
content\u scripts
条目注入的脚本,没有好的解决方案

对代码进行分区 将代码分为必须立即执行的操作和可以等待回调的操作。这可能需要您操纵页面,使正常加载过程中的某些操作延迟到您获得信息之后。您在这里实际需要做的事情将根据您想要完成的具体内容而有所不同。最好的解决方案可能是让您的代码错误出现在您的配置将要更改的一侧或另一侧,然后在您获得指示应该是另一种方式的配置信息后,将其修补到应该是的状态

例如,一个旨在阻止JavaScript在页面中运行的扩展,但是有一个允许的脚本/域的白名单,可以在插入时删除所有
元素。然后,一旦配置信息可用,就可以将允许的
重新插入DOM

使用
chrome.tabs.executeScript()
使用
chrome.tabs.executeScript()
可以在注入主脚本之前,先用配置信息注入构造好的脚本。这些脚本位于相同的上下文中,因此第一个脚本可以设置包含配置信息的变量。有关更多信息,请参阅:

后台脚本(执行
chrome.tabs.executeScript()
)的进程与选项卡的进程(实际注入脚本的进程)不同。因此,由于具有多个进程的异步性质,何时注入脚本将是不确定的。这意味着您不能100%保证在将初始HTML加载到DOM之前注入脚本。你通常可以在那之前注射,但不一定

何时尽早注射有点复杂。问题之一是,如果在加载新页面的过程中过早调用
tabs.executeScript()
,则注入不会在新页面中发生。我的测试(我需要