QuantumNous/new-api

iOS 16.1 WebKit 白屏:前端 bundle 包含不兼容的 RegExp lookbehind

已關閉

#5,550 建立於 2026年6月17日

 (1 則留言) (0 個反應) (0 位負責人)Go (10,424 個分叉)batch import
buggood first issue

倉庫指標

星標
 (44,308 顆星)
PR 合併指標
 (平均合併 3天 5小時) (30 天內合併 83 個 PR)

描述

提交前必读(请勿删除本节)

  • 文档:https://docs.newapi.ai/
  • 使用问题先看或先问:https://deepwiki.com/QuantumNous/new-api
  • 开启透传后的转发相关反馈不接受 issue;透传模式会直接转发请求,请自行确认上游行为。
  • 不接受 coding plan、逆向渠道等技术支持类 issue。
  • 警告:删除本模板、删除小节标题或随意清空内容的 issue,可能会被直接关闭;重复恶意提交者可能会被 block。

您当前的 newapi 版本

v1.0.0-rc.11

提交确认

  • 非重复 issue: 我已搜索现有 Issues,确认目前没有类似 issue。
  • 提交前必读: 我已完整阅读上方“提交前必读”,并已查看文档 https://docs.newapi.ai/、项目 README 且向 AI 提问,确认这不是使用、配置或接入类问题。
  • 模板完整: 我未删除此模板中的任何引导内容或小节标题,并会按要求完整填写。
  • 维护成本: 我理解项目维护者精力有限,不遵循模板要求的 issue 可能会被无视或直接关闭。

问题描述

v1.0.0-rc.11 中,部分 iOS 16.1 WebKit 环境打开前端会白屏。桌面浏览器正常,较新的手机浏览器也正常,但 iOS 16.1.1 上的 Safari / 微信 WebView 会出现页面只加载标题、主体白屏的问题。

环境信息:

  • New API 版本:v1.0.0-rc.11
  • 部署方式:Docker
  • 反代:Nginx
  • 受影响设备:iPhone,iOS 16.1.1
  • 受影响浏览器/WebView:
    • WeChat WebView 8.0.74
    • AppleWebKit 605.1.15
    • Safari / WebKit 16.1 相关环境
  • 桌面 Chrome 正常
  • 其他更新版本手机浏览器正常

通过前端错误日志确认,白屏原因是前端 bundle 中包含 iOS 16.1 WebKit 不支持的 RegExp lookbehind 语法,导致 JS chunk 在解析阶段直接报错,React 应用没有挂载。

捕获到的浏览器端错误:

SyntaxError: Invalid regular expression: invalid group specifier name
@ https://example.com/static/js/558.3159b9ee27.js:10:0

对应 UA:

Mozilla/5.0 (iPhone; CPU iPhone OS 16_1_1 like Mac OS X)
AppleWebKit/605.1.15 (KHTML, like Gecko)
Mobile/15E148
MicroMessenger/8.0.74(0x18004a30)
NetType/WIFI Language/zh_CN

8 秒后的页面状态:

title=New API
ready=complete
root=true
children=0
text=0
wh=430x834

说明 HTML 和静态资源请求本身返回正常,但前端 JS 解析失败后,React 根节点仍为空。

进一步检查 /static/js/558.3159b9ee27.js,发现其中包含如下正则:

/(?<=^|\s|\p{P}|\p{S})([-.\w+]+)@([-\w]+(?:\.[-\w]+)+)/gu

该正则来自依赖链:

remark-gfm
-> mdast-util-gfm
-> mdast-util-gfm-autolink-literal@2.0.1

mdast-util-gfm-autolink-literal@2.0.1/lib/index.js 中可以看到类似逻辑,用于 GFM autolink literal 的邮箱自动链接匹配。

项目中使用 remark-gfm 的位置包括:

web/default/src/components/ui/markdown.tsx
web/classic/src/components/common/markdown/MarkdownRenderer.jsx

临时验证:

我在 Nginx 层临时替换了 /static/js/558.3159b9ee27.js,只把上述 lookbehind 正则替换为不含 lookbehind 的兼容写法后,iOS 16.1.1 微信 WebView 白屏问题消失,页面可以正常进入。因此基本可以确认是该正则导致旧 WebKit 环境解析失败。

这个问题不是上游接口、渠道转发、配置或网络问题,因为:

  • HTML 返回 200
  • 所有 JS/CSS 静态资源均返回 200
  • 桌面浏览器正常
  • 报错明确发生在前端 JS chunk 解析阶段
  • 移除/替换不兼容正则后同一设备可正常进入

复现步骤

  1. 部署 v1.0.0-rc.11
  2. 使用 iOS 16.1.1 设备打开站点。
  3. 使用微信内置浏览器或 Safari/WebKit 16.1 相关环境访问首页。
  4. 页面只显示标题,主体白屏。
  5. 通过注入 window.addEventListener('error', ...) 或连接调试工具,可捕获到:
SyntaxError: Invalid regular expression: invalid group specifier name
@ /static/js/558.3159b9ee27.js:10:0

最小复现代码:

<!doctype html>
<html>
  <head>
    <title>regex repro</title>
    <script>
      const re = /(?<=^|\s|\p{P}|\p{S})([-.\w+]+)@([-\w]+(?:\.[-\w]+)+)/gu
      document.body.textContent = String(re.test('test@example.com'))
    </script>
  </head>
  <body></body>
</html>

在现代 Chrome / 新版本 Safari 中正常,但在 iOS 16.1 WebKit 中会出现类似:

SyntaxError: Invalid regular expression: invalid group specifier name

预期结果

前端不应在首屏必加载 bundle 中包含 iOS 16.1 WebKit 无法解析的 RegExp lookbehind 语法,至少不应导致整个应用白屏。

期望可以考虑以下任一修复方向:

  1. 避免在首屏 bundle 中引入 mdast-util-gfm-autolink-literal 中的 lookbehind 正则。
  2. remark-gfm / mdast-util-gfm-autolink-literal 做兼容性处理或 patch。
  3. 调整构建目标或增加兼容性转换,确保旧 WebKit 不会因为正则解析失败导致整个应用无法挂载。
  4. 如果项目不打算支持 iOS 16.1 WebKit,也希望能在文档或 release note 中明确说明最低浏览器/WebKit 版本要求。

相关截图

当前主要是日志证据,截图表现为移动端白屏,页面标题为 New API,主体区域为空。

客户端错误日志:

GET /__client_error?...&t=error&
m=SyntaxError%3A%20Invalid%20regular%20expression%3A%20invalid%20group%20specifier%20name%20%40%20https%3A%2F%2Fexample.com%2Fstatic%2Fjs%2F558.3159b9ee27.js%3A10%3A0%20stack%3D
&ua=Mozilla%2F5.0%20(iPhone%3B%20CPU%20iPhone%20OS%2016_1_1%20like%20Mac%20OS%20X)%20AppleWebKit%2F605.1.15%20(KHTML%2C%20like%20Gecko)%20Mobile%2F15E148%20MicroMessenger%2F8.0.74...

页面状态日志:

title=New API ready=complete root=true children=0 text=0 wh=430x834

静态资源加载日志示例:

GET / HTTP/2.0 200
GET /static/js/vendor-ui-primitives.90765933ee.js HTTP/2.0 200
GET /static/js/vendor-tanstack.c30df73066.js HTTP/2.0 200
GET /static/js/lib-react.c31ec8aa30.js HTTP/2.0 200
GET /static/js/558.3159b9ee27.js HTTP/2.0 200
GET /static/js/index.116589394a.js HTTP/2.0 200

貢獻者指南