Enable/Disable console.log 在生产版本中

Enable/Disable console.log in production version

基于我想在生产版本中启用或禁用 [​​=12=] 的标志。但我不想向我的用户公开该选项,因为那样每个人都会询问它并浪费我的时间。

如果我允许通过 Options 对话框将此类标志存储在用户首选项中,在加载这些首选项之前,我的代码将喷出 console.log 输出直到从 chrome 存储加载该标志。

我可以使用扩展程序创建调试标志 cookie,但不幸的是我的扩展程序适用于许多网站。

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

每次扩展 运行( 包括 BG 脚本 内容脚本选项对话框)?

没有什么可以在您不必异步获取的所有上下文中设置值。你将不得不处理它。

主要方法:等待信息。延迟执行直到可用。

处理这种情况的正常方法是将所有可能需要信息的处理放入以异步调用的回调开始的程序流中 storage.*。这对于异步编程来说是正常的和预期的。在几乎所有情况下,这就是您应该处理的方式。

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

后台脚本也可以使用同步的localStorage。但是,数据并非在所有情况下都可用。

对于内容脚本,需要延迟异步数据可能意味着将注入时间提前。换句话说,您可能需要在 document_start 处注入 (run_at or runAt) 而不是 document_idledocument_end。然后,您需要将其余处理延迟到文档 ready/loaded.

之后

对于已在 document_start

加载的内容脚本

专为console.log()

对于您的特定问题,通过 console.log() 输出,您可以将通常发送到 console.log() 的输出排队,直到您从对 [=11= 的异步调用返回数据之后].获得数据后,您可以 A) 输出队列中的所有内容并将所有内容设置为正常输出,或 B) 转储队列中的所有内容并将每个调用设置为丢弃。

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

一般(即对于以后不能排队的事情)

这个充其量是不平凡的。对于通过 manifest.json content_scripts 条目注入的脚本没有好的解决方案。

对代码进行分区

将您的代码分成必须立即完成的和可以等待回调的部分。这可能需要您对页面进行操作,以便将正常加载过程中的某些操作延迟到您获得信息之后。您实际需要在此处执行的操作将根据您想要完成的具体任务而有所不同。最好的解决方案可能最终是让你的代码错误发生在你的配置会改变的一侧或另一侧,然后一旦你获得表明它应该是另一种方式的配置信息,就将它们修补到它们应该是什么。

例如,一个旨在阻止 JavaScript 来自页面中 运行 的扩展程序,但有一个允许 scripts/domains 的白名单可以继续并删除所有<script> 个插入的元素。然后,一旦配置信息可用,允许的 <scripts> 可以重新插入到 DOM.

使用chrome.tabs.executeScript()

使用 chrome.tabs.executeScript(),您可以在注入主脚本之前注入带有配置信息的构造脚本。这些脚本在相同的上下文中,因此第一个脚本可以设置包含配置信息的变量。有关详细信息,请参阅:Pass a parameter to a content script injected using chrome.tabs.executeScript()

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

何时尽早注射有点复杂。问题之一是,如果您在加载新页面的过程中过早地调用 tabs.executeScript(),则注入不会在新页面中发生。我的测试(我需要回去重做,因为我相信它可以改进)表明:

相关: