uni-app HBuilderX 4.85 编译iOS 安卓和鸿蒙的离线包运行白屏
uni-app HBuilderX 4.85 编译iOS 安卓和鸿蒙的离线包运行白屏
测试过的手机:
- iphone 7
- 华为 P30
- 华为Mate 60 Pro
操作步骤:
- 每次打开必现
预期结果:
- 正常显示
实际结果:
- 白屏,查看日志是
app-service.js文件有类似\p{L}\p{N}、\p{L}\p{S}之类的正则表达式报错
bug描述:
- 使用 HBuilderX 4.85 编译 iOS、安卓和鸿蒙的离线包运行白屏。
- 安卓端通过日志看到以下报错信息
Uncaught SyntaxError: Invalid regular expression: /[\p{L}\p{N}]/: Invalid property name in character class - 修改编译出来的
app-service.js文件内容后恢复正常,统一将类似\p{L}\p{N}、\p{L}\p{S}之类的正则表达式后恢复正常
### 表格:开发环境信息
| 项目 | 信息 |
|--------------|----------------|
| 产品分类 | uniapp/App |
| PC开发环境 | Mac |
| 版本号 | 14.6.1 (23G93) |
| HBuilderX | 正式 |
| HBuilderX版本| 4.85 |
| 手机系统 | 全部 |
| 手机厂商 | 华为 |
| 页面类型 | vue |
| vue版本 | vue3 |
| 打包方式 | 离线 |
| 项目创建方式 | HBuilderX |
更多关于uni-app HBuilderX 4.85 编译iOS 安卓和鸿蒙的离线包运行白屏的实战教程也可以访问 https://www.itying.com/category-93-b0.html
编译的H5、小程序运行正常
更多关于uni-app HBuilderX 4.85 编译iOS 安卓和鸿蒙的离线包运行白屏的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
这个是AI给出的替换方案
/[\p{L}\p{N}]/u替换成/[a-zA-Z0-9\u00C0-\u024F\u0400-\u04FF\u4e00-\u9fff]/,虽不“完全等效”,但在 99% 的中文/英文/欧洲语言场景下足够用,且不会导致白屏。
\p{P}\p{S}
替换成
!-/:-@[-\{-~\u0021-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E\u00A1-\u00A5\u00AB\u00B1\u00B7\u00BB\u00BF\u00D7\u00F7\u2010-\u2027\u2030-\u205E\u20A0-\u20CF\u2200-\u22FF\u3000-\u303F\uFF01-\uFF0F\uFF1A-\uFF20\uFF3B-\uFF40\uFF01-\uFF5E 即 /[\p{P}\p{S}]/u 替换成 /[!-\/:-@[-{-~\u0021-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E\u00A1-\u00A5\u00AB\u00B1\u00B7\u00BB\u00BF\u00D7\u00F7\u2010-\u2027\u2030-\u205E\u20A0-\u20CF\u2200-\u22FF\u3000-\u303F\uFF01-\uFF0F\uFF1A-\uFF20\uFF3B-\uFF40\uFF01-\uFF5E]/
/[\s\p{P}\p{S}]/u
替换成
/[\s!-/:-@[-\{-~\u0021-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E\u00A1-\u00A5\u00AB\u00B1\u00B7\u00BB\u00BF\u00D7\u00F7\u2010-\u2027\u2030-\u205E\u20A0-\u20CF\u2200-\u22FF\u3000-\u303F\uFF01-\uFF0F\uFF1A-\uFF20\uFF3B-\uFF40\uFF01-\uFF5E]/ /[^\s\p{P}\p{S}]/u 替换成 /[^\s!-\/:-@[-{-~\u0021-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E\u00A1-\u00A5\u00AB\u00B1\u00B7\u00BB\u00BF\u00D7\u00F7\u2010-\u2027\u2030-\u205E\u20A0-\u20CF\u2200-\u22FF\u3000-\u303F\uFF01-\uFF0F\uFF1A-\uFF20\uFF3B-\uFF40\uFF01-\uFF5E]/
/(?!~)[\p{P}\p{S}]/u
替换成
/(?!~)[!-/:-@[-\{-~\u0021-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E\u00A1-\u00A5\u00AB\u00B1\u00B7\u00BB\u00BF\u00D7\u00F7\u2010-\u2027\u2030-\u205E\u20A0-\u20CF\u2200-\u22FF\u3000-\u303F\uFF01-\uFF0F\uFF1A-\uFF20\uFF3B-\uFF40\uFF01-\uFF5E]/ /(?:[^\s\p{P}\p{S}]|~)/u 替换成 /(?:[^\s!-\/:-@[-{-~\u0021-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E\u00A1-\u00A5\u00AB\u00B1\u00B7\u00BB\u00BF\u00D7\u00F7\u2010-\u2027\u2030-\u205E\u20A0-\u20CF\u2200-\u22FF\u3000-\u303F\uFF01-\uFF0F\uFF1A-\uFF20\uFF3B-\uFF40\uFF01-\uFF5E]|~)/
/(?!~)[\s\p{P}\p{S}]/u
替换成
/(?!~)[\s!-/:-@[-`{-~\u0021-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E\u00A1-\u00A5\u00AB\u00B1\u00B7\u00BB\u00BF\u00D7\u00F7\u2010-\u2027\u2030-\u205E\u20A0-\u20CF\u2200-\u22FF\u3000-\u303F\uFF01-\uFF0F\uFF1A-\uFF20\uFF3B-\uFF40\uFF01-\uFF5E]/
如果需要支持更多的符号自己再补充
HBuilderX降级到4.76版本也存在一样的问题,之前是正常的,可能是某些依赖插件导致
发现是使用了 marked 依赖导致的,这个内部包含了 /[\p{L}\p{N}]/u 之类的正则表达式
关注
这是一个典型的JavaScript正则表达式兼容性问题。\p{L}和\p{N}是ES2018引入的Unicode属性转义,用于匹配字母和数字字符,但在某些JavaScript引擎中不被支持。
问题根源:
- 离线打包时,HBuilderX 4.85可能使用了较新的ECMAScript特性
- 部分设备上的JavaScript引擎(特别是较旧版本)不支持Unicode属性转义
- 鸿蒙系统和部分安卓设备的JS运行环境可能基于较旧的V8引擎版本
解决方案:
- 临时修复:手动修改编译后的
app-service.js文件,将所有\p{L}\p{N}、\p{L}\p{S}等Unicode属性转义替换为对应的传统正则表达式:// 将 \p{L} 替换为 [a-zA-Z\u00C0-\u017F] // 将 \p{N} 替换为 [0-9]


