前端显示完整性审计(ui-audit.py)¶
位置:
deploy/nfos/tools/ui-audit.py| 语言:python3 | 是否需要 root:否
工具性质:本地静态审计(只读 CSS;只写 --out 指定的文件)
运行前提:仓库检出必须在场(默认 CSS 路径与 lint-layout.py 都从仓库根推导)。可从任意位置运行(工具自动向上找到含 deploy/nfos 的祖先目录)
部署状态:随仓库检出运行,不部署到 /opt/Cy/services/system.d/nfos/
用途¶
把 nf.css 里“会显示不全”的可疑模式量化成计数 + 位置清单,供「改动前 / 改动后」对比。
源码 docstring(逐字引用):
审计内容分两块:
| 块 | 内容 |
|---|---|
| 1. CSS 模式计数 | 对 --css 文件统计 15 条模式:overflow:hidden、overflow-x:hidden、overflow-y:hidden、overflow:auto\|scroll、white-space:nowrap、text-overflow:ellipsis、height:<N>px (写死)、max-height:<N>px/vh、min-width:0、overflow-wrap\|word-break、overflow-wrap:anywhere、grid-template repeat(N,1fr) 写死列数、grid-template auto-fit/auto-fill、white-space:pre-wrap、white-space:pre(非wrap);并输出文件字节数与 sha256(前16) |
| 1b. 明细 | 四张行号清单:nowrap 明细、ellipsis 明细、overflow:hidden 明细、写死 height 明细 |
| 2. lint 底座(默认执行) | 以子进程跑 apps/web/tests/lint-layout.py --site index --json,按 R1/R2/R4/R6/R7 列出命中;再跑一次 7 站点汇总,用于确认 7 份 css 同步后计数是否整齐 ×7 |
典型场景¶
- 改
nf.css(或同步 7 份站点 CSS)之前先跑一次存基线,改完再跑一次做逐项对比; - 排查“内容被裁掉 / 长文本拖不出横向滚动条 / 右侧在屏外”一类显示完整性问题时,先用它把可疑模式定位到具体行号;
- 与
ui-delta.py(前后对比)、ui-keyrules.py(关键类最终生效声明)、ui-coverage.py(类覆盖率)联用,构成“无浏览器时的显示完整性证据链”。
用法与参数¶
源码 docstring 给出的用法(逐字引用,.scratch/ 为升级前旧路径;本页按新位置书写,路径参数不变):
参数来自 argparse.ArgumentParser()(默认值逐字来自源码):
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--css |
字符串(文件路径) | <repo>/apps/web/index/css/nf.css(由 ROOT 拼接的绝对路径) |
被审计的 CSS 文件 |
--out |
字符串(文件路径) | ''(空 = 写 stdout) |
输出文件;给值时打印 written: <path> (<N> bytes) |
--no-lint |
开关(store_true) |
False |
为真时跳过 lint-layout.py 底座块,只输出第 1 块与明细 |
无参数时的默认行为:审计仓库默认的 apps/web/index/css/nf.css,执行 lint 底座(两次子进程:--site index 与 7 站点汇总),结果按 UTF-8 字节写 stdout(不落盘)。
默认路径是相对仓库根推导出的绝对路径;也就是说
--css省略时不需要cd到任何目录,但仓库检出必须在场。若显式传--css apps/web/index/css/nf.css这类相对路径,则相对当前工作目录解析。
示例¶
改动前存基线、改动后存新档(推荐两次都落盘,便于 diff):
python deploy/nfos/tools/ui-audit.py --css apps/web/index/css/nf.css --out .scratch/audit-before.txt
只做 CSS 模式计数、不依赖 lint-layout.py:
期望输出形态(落盘时只打印一行;不给 --out 时输出正文到 stdout):
正文形如:
== 文件: apps/web/index/css/nf.css ==
字节数: ... sha256(前16): ...
-- 模式计数 --
white-space:nowrap 123
...
-- lint-layout.py (site=index) 计数 --
R1 ...
合计 ...
| 情形 | 期望退出码 |
|---|---|
| 正常完成 | 0(源码未调用 sys.exit) |
CSS 文件缺失 / --out 不可写 |
1(Python traceback) |
不带 --no-lint 时 lint-layout.py 失败或输出非 JSON |
1(subprocess 输出解析异常,Python traceback) |
注意:“命中了多少条可疑模式”不影响退出码 —— 本工具是计数器/清单,不是断言器,不会因为计数高而失败。
依赖与权限¶
- 语言/版本:Python 3(
#!/usr/bin/env python3)。 - 第三方依赖:无,标准库
argparse/io/os/re/sys/json/subprocess/hashlib。 - 仓库依赖:必需 ——
dump_lint()以sys.executable起子进程执行<repo>/apps/web/tests/lint-layout.py(cwd=ROOT),并import其 JSON 输出。加--no-lint可去掉这一依赖(但默认--css仍由仓库根推导)。 - 权限:不需要 root;写权限仅用于
--out。
风险与注意事项¶
- 只读 CSS,只写
--out:工具本身不修改nf.css,也不改任何仓库文件。若不传--out,它只写 stdout,完全不落盘。 - 会起子进程:默认执行两次
lint-layout.py(捕获 stdout、cwd为仓库根、env注入PYTHONIOENCODING=utf-8)。它不写报告到别处,但lint-layout.py自身的副作用(若有)会一并发生。 - 不依赖浏览器:审计是纯文本/正则统计,不能证明视觉上真的没被裁掉;它的价值是“把可疑模式定位到行号 + 给出可对比的数字”。
- 计数会包含注释里的字样(本工具不做注释剥离;
ui-delta.py才提供“剥离注释后计数”的口径)。因此与ui-delta.py的数字不应直接互相校验。 - 明细清单只覆盖 4 类模式(nowrap / ellipsis /
overflow:hidden/ 写死 height),其余模式的行号不在输出里。
回滚¶
本工具不部署到线上、不改线上系统;不改动任何被审计文件。
- 产出/改动位置:仅
--out指定的文件(例如.scratch/audit-before.txt)。 - 清理方式:
- 不给
--out时无任何落盘物,无需清理;线上侧无需回滚。