DEBUG.WIKI
丽萨主机;为跨境业务选好 IP;原生 / 住宅 IP · 按套餐选择;查看 IP →
PanstarCloud:部署应用,接入 AI,云服务器与 AI 网关
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证

yaml stringify 改成四空格缩进后,字符串多出空格

yaml 2.9.1 序列化首行带空格的多行映射值时,块标量缩进标记可能与实际缩进不一致。保留原字符串,以往返解析核对内容。

仅把 yaml.stringify() 的 indent 从 2 改成 4,输出仍像合法 YAML,重新读取后字符串却多出空格。这个问题尤其要检查首行本来就有前导空格的多行映射值。

在 yaml 2.9.1 中,例如 { k: ' lead\nx\n' },四空格缩进可能生成下面的文本:

k: |2
      lead
    x

|2 指定的是相对缩进量,实际正文却按四空格缩进写出。解析器按标记扣掉两个空格,剩余空格进入字符串,不会自动猜测写入者原本的意图。indent 为 1 时,还可能直接报 All mapping items must start at the same column。

只影响特定字符串,不能靠肉眼比较 YAML

该路径发生在块标量需要显式缩进标记时。普通单行字符串、没有相同前导空白的多行值,以及序列项中的块字符串,并不都出现同样结果。嵌套映射和 folded 形式也应单独覆盖。

yaml 2.9.1 的 blockString 把该标记选为固定的 2 或根部用的 1,没有随 indent 的步长调整。已核对的正式发行仍是 2.9.1,讨论中的补丁不能当成已发布修复。

保持默认缩进,或明确使用引号字符串

能接受默认排版的生成文件,可以继续使用 indent: 2。必须统一四空格且从普通 JS 值重新生成时,可评估禁用块引用:

import { parse, stringify } from 'yaml';

const original = { k: '  lead\nx\n' };
const text = stringify(original, {
  indent: 4,
  blockQuote: false,
});
const restored = parse(text);
if (restored.k !== original.k) {
  throw new Error('YAML string changed during serialization');
}

blockQuote: false 让适用字符串改用引号形式,换行可能以转义表示。内容应保持一致,但文件的可读排版会变化;下游如果不是按 YAML 读取,而是用文本工具依赖具体块样式,需要先确认兼容性。

这段示例针对普通 JS 对象的 stringify。若项目在 Document AST 上编辑已指定样式的 Scalar,应同时核对节点 type、选项及最终结果,不能推断一个全局选项会覆盖全部自定义序列化逻辑。

不要给字符串统一 trim,也不要生成后全局替换 |2 为 |4。前者会丢掉有意义的空白,后者可能改坏本来正确的序列、嵌套层级、其他缩进或字符串内容。

发布生成配置前,保留原始值和上一份有效文件,在相同 yaml 版本上检查逐字段往返结果。对脚本、模板或证书等多行字段,应精确比较空格、换行与末尾换行,而不是只确认 parse 没抛异常。文件能被解析,与解析出来的数据未变,是两项不同的检查。