Skip to content

输出格式 ​

pages.json 的序列化由以下几个选项控制:

ts
UniPages({
  minify: false,
  indent: 2,
  eol: '\n',
  insertFinalNewline: false,
})

选项 ​

选项说明
minify压缩成一行,优先级最高
indent缩进空格数或字符串,例如 2、'\t'
eol换行符,'\n' 或 '\r\n'
insertFinalNewline在文件末尾追加一个换行

indent: 0 或空字符串也会让 comment-json 输出单行内容,效果和压缩类似。

多平台限制 ​

多平台合并依赖 #ifdef、#endif 和生成标记这些注释。单行输出放不下注释,会造成:

  • 只属于其他平台的条目直接暴露在当前平台的构建产物里
  • tabBar 顶层属性变成最后写入者说了算
  • 生成标记丢失,过期子包无法清理
  • 手写的 #ifndef 包裹消失

因此同一项目的所有平台必须保持一致的格式化设置。多平台项目建议使用默认的多行输出,不要打开 minify。

写入行为 ​

  • 生成结果和磁盘上的内容完全一致时跳过写入,避免触发下游不必要的重编译
  • 比较对象是刚读到的磁盘内容,不是进程内缓存。外部改写 pages.json 后仍会重写
  • 整个读取、合并、写入在同一把文件锁内完成
  • 写入使用临时文件和 rename,中途崩溃不会留下截断的文件
  • Windows 下 rename 可能因为其他进程持有文件而报 EPERM,插件会等待 50ms 重试,最多 3 次

已有文件的处理 ​

pages.json 不存在时会创建占位文件,内容很快会被下一次生成覆盖。

已存在的文件不会被删除重建。以下情况直接报错,需要用户自己处理:

  • 路径存在但不是普通文件,例如目录
  • 文件缺少读写权限
  • 占位文件创建失败,例如父目录不存在

插件拒绝删除和重建,是为了避免静默丢失手写内容。权限问题可以修复后重试:

shell
chmod u+w src/pages.json

换行与末尾换行 ​

eol: '\r\n' 会把所有换行符替换成 CRLF。insertFinalNewline: true 会在末尾追加一个与 eol 一致的换行。

CI 中启用了 git 的自动换行转换时,注意本地输出和仓库内容可能因为 core.autocrlf 产生差异。