iOS 16.1 WebKit 白屏:前端 bundle 包含不兼容的 RegExp lookbehind
#5,550 opened on Jun 17, 2026
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 相关环境
- WeChat WebView
- 桌面 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 解析阶段
- 移除/替换不兼容正则后同一设备可正常进入
复现步骤
- 部署
v1.0.0-rc.11。 - 使用 iOS
16.1.1设备打开站点。 - 使用微信内置浏览器或 Safari/WebKit 16.1 相关环境访问首页。
- 页面只显示标题,主体白屏。
- 通过注入
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 语法,至少不应导致整个应用白屏。
期望可以考虑以下任一修复方向:
- 避免在首屏 bundle 中引入
mdast-util-gfm-autolink-literal中的 lookbehind 正则。 - 对
remark-gfm/mdast-util-gfm-autolink-literal做兼容性处理或 patch。 - 调整构建目标或增加兼容性转换,确保旧 WebKit 不会因为正则解析失败导致整个应用无法挂载。
- 如果项目不打算支持 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