Chrome 插件架构解析:插件进程的本质与 Service Worker 的运行机制

插件进程是一个概念
- 插件进程是一个抽象概念,用来描述插件的整体运行状态。
- 实际上,插件的不同组件(如 Service Worker 和弹窗、侧边栏、标签页)通常运行在同一个渲染进程中,而不是分配独立的进程。虽然插件的组件共享一个渲染进程,但它们之间的线程是隔离的。例如,Service Worker 运行在独立的线程中,而弹窗、侧边栏、标签页等运行在渲染进程的主线程中。这种线程隔离可以避免互相阻塞。
插件的架构本质:共享一个进程
Service Worker 和弹窗、侧边栏、标签页共享同一个渲染进程
- Service Worker 是插件的后台脚本,运行在渲染进程中的独立线程中。
- 弹窗(Popup)、侧边栏、标签页的 HTML 页面渲染逻辑运行在同一个渲染进程的主线程中。
- 这两个组件虽然逻辑上独立,但实际上共享了同一个进程。
- Service Worker 的生命周期是事件驱动的,它不会一直驻留在内存中,而是根据需要启动和销毁(例如接收到消息或事件时启动)。
- Service Worker 的运行不会阻塞渲染进程的主线程,但它与主线程共享同一个进程的资源(如内存)。
内容脚本运行在网页的渲染进程中
- 内容脚本是注入到网页中的脚本,它运行在网页的渲染进程中,而不是插件的渲染进程中。
- 因此,内容脚本与插件的其他部分(如 Service Worker 和弹窗)并不共享同一个进程,而是通过消息通信进行交互。
注:Service Worker 和主线程之间通过 io 线程进行消息通信,不同进程间的通信是通过 ipc 机制进行通信
任务管理器中的表现
在 Chrome 的任务管理器中:
- Service Worker:虽然它是一个线程,但会显示为一个独立的任务,实际上运行在渲染进程中,而不是单独的进程。(运行在独立的线程中,它不会阻塞渲染进程的主线程)

- 弹窗(Popup): 弹窗的渲染需要用到渲染进程,所以会复用插件启动时分配的渲染进程,而不会创建新的进程。
如下图:
侧边栏和标签页
- 类似于弹窗,插件的侧边栏(如 Chrome 扩展的侧边工具栏)和标签页(如插件打开的独立页面)也会复用插件的渲染进程。
- 这些组件的渲染逻辑运行在渲染进程的主线程中,与 Service Worker 的后台线程共享同一个进程。

注:进程复用策略 当插件打开多个弹窗时, Chrome 会复用同一渲染进程,但为每个弹窗创建新的浏览器实例
如下打开了三个标签页,还是在一个进程中进程 id 为 28340
