所有 JS 插件代码都在主线程上执行吗?
是的。AFAIK 这条规则的唯一例外是您通过网络工作者或ChromeWorker运行的代码。有计划在不同的过程中运行基于附加 SDK 的扩展,我不确定这是否仍然是目标。
插件代码可以由主线程上的不同 JS 运行时执行吗?
理论上——是的。例如,扩展可能带有包含不同 JavaScript 引擎的二进制 XPCOM 组件。或者是 带有基于 JavaScript 的 JavaScript 引擎的Zaphod 扩展。但这对于在常规 SpiderMonkey 引擎中运行的代码并不重要。
我在插件中看到一个奇怪的行为,导致部分插件代码挂起(当模式对话框启动时,我无法在套接字 #1 上接收数据)
JavaScript 执行基于事件队列 - 浏览器将从队列中获取一个事件(例如 DOM 事件、超时、网络事件)并对其进行处理,然后运行相应的 JavaScript 代码。在此 JavaScript 代码完成之前,无法处理其他事件。
但是,当模式对话框打开或执行同步时,JavaScript 代码不会继续运行XMLHttpRequest
- 但仍需要处理事件。这可以通过模式对话框和XMLHttpRequest
在它们处于活动状态时进行事件处理来解决(它们旋转自己的事件循环)。
到目前为止的基础。进入套接字的数据是一个常规事件——无论它是由主事件循环还是由模式对话框的循环处理,它都应该工作。