QuantumNous/new-api

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

Closed

#5,550 opened on Jun 17, 2026

 (1 comment) (0 reactions) (0 assignees)Go (10,424 forks)batch import
buggood first issue

Repository metrics

Stars
 (44,308 stars)
PR merge metrics
 (Avg merge 3d 5h) (83 merged PRs in 30d)

Description

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

  • 文档: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

Contributor guide