Firefox 147 添加模块类型服务工作线程 — 全栈团队现在必须做什么

ReactNode.jsDevOps

发生了什么

  • Firefox 147(稳定版,2026年1月)引入了对作为 ECMAScript 模块的服务工作线程的支持 — 也就是说,您可以使用 { type: 'module' } 注册服务工作线程,并在工作线程内部使用 import/export 和模块语义。 (developer.mozilla.org)

为什么这很重要(高影响)

  • 现代、可重用的工作线程代码:您可以导入共享的工具模块,进行树摇以减小负载,并保持主线程和工作线程代码之间的一致性。
  • 顶级 await、严格的 ESM 语义和内置模块解析消除了对 importScripts 和脆弱的连接模式的需求。
  • 更简单的工具链集成:发出 ESM 输出的打包工具/捆绑器可以直接为服务工作线程提供服务,减少构建时的黑客行为。
  • 安全性和可维护性:更清晰的模块边界和更容易审计工作线程内部的依赖图。

全栈团队现在应该做什么 — 具体、优先级检查清单

  1. 快速兼容性检查

    • 验证您的目标浏览器和用户基础(在您的遥测中检查 Firefox 147+ 的可用性)。如果有相当一部分用户使用较旧的 Firefox 或其他可能未在您的环境中自动更新的浏览器,请计划一个回退方案。 (developer.mozilla.org)
  2. 特性检测和安全注册

    • 使用特性检测和条件注册:在支持时尝试 navigator.serviceWorker.register('/sw.js', { type: 'module' }),否则回退到经典注册。不要在面向公众的产品中强制模块注册而没有回退方案。
  3. 将工作线程代码迁移到 ESM

    • import ... from '...' 替换 importScripts(...),并将 CommonJS 风格的代码转换为 ESM(或提供 ESM 兼容的入口点)。
    • 移除依赖于 importScripts 顺序的全局副作用;依赖于显式导入和初始化。
  4. 构建管道更改

    • 配置捆绑器以为服务工作线程发出 ESM 输出(保留导入语句或在需要时发出 .mjs)。
    • 确保您的服务器为模块文件返回正确的 MIME 类型(例如,text/javascript 或 application/javascript),并支持模块加载所需的 CORS 凭证。
    • 如果您使用哈希文件名或资产 CDN,请确认工作线程可以在运行时导入这些 URL(或内联一个小的清单)。
  5. 内容安全策略(CSP)和头部

    • 审查 CSP:工作线程中的模块导入像普通模块一样被获取;确保 script-src/worker-src 规则不会阻止这些请求。
    • 如果您使用更改获取行为的服务工作线程注册选项,请验证同源/跨源规则以及 cookies/凭证。
  6. 库和工具

    • 测试 Workbox 和其他常见的 SW 库以兼容模块模式;更新到明确支持 type: 'module' 的版本(或迁移到手动控制)。
    • 更新本地开发服务器(和 CI)以一致地提供模块工作线程(注意开发服务器默认注入包装器或使用不正确的 CORS 头)。
  7. 测试和部署

    • 添加端到端测试:
      • 在模块模式下注册工作线程,
      • 确认导入解析(如果使用,顶级 await 工作),
      • 验证模块工作线程的离线行为和缓存生命周期。
    • 对小比例流量进行金丝雀测试;监控服务工作线程注册、激活失败和错误日志。
    • ServiceWorkerContainer.register() 周围提供遥测或错误捕获(sentry/日志)以检测不支持的客户端回退。

常见陷阱

  • 打包工具输出与模块加载器不兼容(IIFE 与 ESM)。为工作线程发出 ESM 入口点。
  • 依赖于 importScripts 顺序语义 — 用显式导入和初始化顺序替换。
  • 较旧的浏览器(或锁定的企业环境)在您省略经典回退时注册失败。
  • 不正确的 MIME/CORS 或 CSP 阻止模块导入并导致注册时静默失败。

简短的部署计划(单页)

  • 第0周:添加特性检测 + 回退注册;在预发布环境中进行冒烟测试。
  • 第1周:将工作线程转换为 ESM;更新构建和服务器 MIME/CORS。
  • 第2周:添加端到端测试;部署到金丝雀(1–5%)。
  • 第3周:监控错误/指标;将部署扩展到25%,然后在清晰的遥测后扩展到100%。

底线 Firefox 147 的模块类型服务工作线程支持将工作线程变成一流的 ESM 消费者。对于全栈团队,这意味着更清晰的代码共享、更简单的构建和更强大的服务工作线程逻辑 — 但这需要有意识的构建、注册和部署更改。首先进行特性检测,并逐步迁移,以避免在仍运行较旧客户端的环境中出现意外情况。 (developer.mozilla.org)

来源:

来源

继续阅读