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

8 回复

编译的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]/ 如果需要支持更多的符号自己再补充

在此期待官方给出更优的方案或在新版解决该问题,测试 4.86.2025110715-alpha 版本也存在一样的问题

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引擎版本

解决方案:

  1. 临时修复:手动修改编译后的app-service.js文件,将所有\p{L}\p{N}\p{L}\p{S}等Unicode属性转义替换为对应的传统正则表达式:
    // 将 \p{L} 替换为 [a-zA-Z\u00C0-\u017F]
    // 将 \p{N} 替换为 [0-9]
回到顶部