前端控制台标识改为「Kratos Yang v当前版本」,去掉硬编码的 3.1.8 #35

Closed
opened 2026-10-28 09:57:58 +00:00 by laoyang · 2 comments
Owner

现象

打开 yangyq.net 任意页面,浏览器控制台会打印:

Kratos v3.1.8
https://code.yangyq.net/laoyang/wordpress-kratos-yang

两处不对:

  1. 主题名还是上游原名。本主题已改造成 Kratos Yang,控制台却仍报 Kratos。
  2. 版本号是硬编码的旧值 3.1.8。主题当前 4.1.1,这个数字自 3.1.8 之后就没再动过。

根因

assets/js/kratos.js:8

var KRATOS_VERSION = '3.1.8'

全文只有 assets/js/kratos.js:140 一处使用:

var consoleConfig = function () {
    console.log('\n Kratos v' + KRATOS_VERSION + '\n\n https://code.yangyq.net/laoyang/wordpress-kratos-yang \n\n')
}

assets/js/kratos.min.js 是压缩产物,里面把 Kratos v3.1.8 当字符串字面量写死了(无构建脚本,是手工压缩的)。

版本号的唯一真源本来就已在 PHP 侧:functions.php:9

define('THEME_VERSION', wp_get_theme()->get('Version'));

JS 里再存一份副本必然漂移 —— 事实也漂了 9 个小版本。

改法

不留第二份版本号。

  1. 删掉 var KRATOS_VERSION。
  2. inc/theme-core.php:101 那个交给 wp_localize_script('kratos', 'kratos', $data) 的数组里加一个 'version' => THEME_VERSION。
  3. consoleConfig() 改成读 kratos.version,文案改为 Kratos Yang v<版本>。
  4. assets/js/kratos.min.js 同步改(它虽是压缩产物,但当前无构建链,需手工保持一致)。

输出的目标:

Kratos Yang v4.1.1
https://code.yangyq.net/laoyang/wordpress-kratos-yang

不在本次范围:那条 hm.js 告警

hm.js?192a62f2ae923a591128f92554cc80e0:2 [Violation] Permissions policy violation: unload is not allowed in this document.
  • 来源是百度统计的第三方脚本,不是主题代码。
  • 线上响应头没有 Permissions-Policy(curl -I 已实测),是 Chrome 对 unload 的默认策略收紧。
  • 改不了别人的脚本,也不影响功能。不处理。

验收标准

  1. assets/js/kratos.js 与 kratos.min.js 中不再出现字面量 3.1.8,也不再出现 'Kratos v' 这种拼法。
  2. 线上真实页面控制台输出 Kratos Yang v<版本>,版本号与 style.css 的 Version: 逐字一致。
  3. 版本号只有一份真源:反证 —— 把 style.css 的 Version: 改成任意值,控制台输出必须跟着变(若不变则说明 JS 里还有副本)。
  4. 前端不报 kratos is not defined(localize 在脚本加载前注入)。

本单由需求拆解生成,主单 laoyang/wordpress-kratos-yang #34。

## 现象 打开 yangyq.net 任意页面,浏览器控制台会打印: ``` Kratos v3.1.8 https://code.yangyq.net/laoyang/wordpress-kratos-yang ``` 两处不对: 1. **主题名还是上游原名**。本主题已改造成 `Kratos Yang`,控制台却仍报 `Kratos`。 2. **版本号是硬编码的旧值 3.1.8**。主题当前 4.1.1,这个数字自 3.1.8 之后就没再动过。 ## 根因 `assets/js/kratos.js:8` ```js var KRATOS_VERSION = '3.1.8' ``` 全文只有 `assets/js/kratos.js:140` 一处使用: ```js var consoleConfig = function () { console.log('\n Kratos v' + KRATOS_VERSION + '\n\n https://code.yangyq.net/laoyang/wordpress-kratos-yang \n\n') } ``` `assets/js/kratos.min.js` 是压缩产物,里面把 `Kratos v3.1.8` 当字符串字面量写死了(无构建脚本,是手工压缩的)。 版本号的唯一真源本来就已在 PHP 侧:`functions.php:9` ```php define('THEME_VERSION', wp_get_theme()->get('Version')); ``` JS 里再存一份副本必然漂移 —— 事实也漂了 9 个小版本。 ## 改法 **不留第二份版本号。** 1. 删掉 `var KRATOS_VERSION`。 2. `inc/theme-core.php:101` 那个交给 `wp_localize_script('kratos', 'kratos', $data)` 的数组里加一个 `'version' => THEME_VERSION`。 3. `consoleConfig()` 改成读 `kratos.version`,文案改为 `Kratos Yang v<版本>`。 4. `assets/js/kratos.min.js` 同步改(它虽是压缩产物,但当前无构建链,需手工保持一致)。 输出的目标: ``` Kratos Yang v4.1.1 https://code.yangyq.net/laoyang/wordpress-kratos-yang ``` ## 不在本次范围:那条 hm.js 告警 ``` hm.js?192a62f2ae923a591128f92554cc80e0:2 [Violation] Permissions policy violation: unload is not allowed in this document. ``` - 来源是**百度统计的第三方脚本**,不是主题代码。 - 线上响应头**没有** `Permissions-Policy`(`curl -I` 已实测),是 Chrome 对 `unload` 的默认策略收紧。 - 改不了别人的脚本,也不影响功能。不处理。 ## 验收标准 1. `assets/js/kratos.js` 与 `kratos.min.js` 中不再出现字面量 `3.1.8`,也不再出现 `'Kratos v'` 这种拼法。 2. 线上真实页面控制台输出 `Kratos Yang v<版本>`,版本号与 `style.css` 的 `Version:` 逐字一致。 3. 版本号只有一份真源:反证 —— 把 `style.css` 的 `Version:` 改成任意值,控制台输出必须跟着变(若不变则说明 JS 里还有副本)。 4. 前端不报 `kratos is not defined`(localize 在脚本加载前注入)。 --- > 本单由需求拆解生成,主单 laoyang/wordpress-kratos-yang #34。
Author
Owner

已交付

线上实测:4.1.1 的 kratos.min.js 里确实还是 Kratos v3.1.8,用户报的问题已在线上复现。

修改方式不是把 3.1.8 换成 4.2.0(下个版本还得再改一次),而是删掉这份副本:

文件 改动
assets/js/kratos.js 删掉 var KRATOS_VERSION = '3.1.8';consoleConfig() 改从 window.kratos.version 取
assets/js/kratos.min.js 手工同步那一句(无构建脚本,是手工压缩产物)
inc/theme-core.php wp_localize_script 的 $data 数组加 'version' => THEME_VERSION
style.css 4.1.1 → 4.2.0

现在版本号只有一份真源:functions.php 的 THEME_VERSION ← style.css 的 Version:。

为什么是可以直接取的

wp_localize_script 在脚本标签之前注入,所以 kratos.min.js 执行时 window.kratos 已经存在,不存在时序问题。

取不到时只打印 Kratos Yang,不凭空补默认版本号 —— 后台预览、维护页这些没走 wp_enqueue_scripts 的场景不该在控制台报错。

验证

线上真实 min.js 运行时验证(node vm 真跑,不是 grep)

[OK] 线上 min.js 可取(HTTP 200)
[OK] 线上当前仍是旧标识 Kratos v3.1.8(复现用户报的问题)
[OK] 线上旧版实际打印 Kratos v3.1.8:["\n Kratos v3.1.8\n\n ... \n\n"]
[OK] 包内 min.js 无旧串 Kratos v3
[OK] 包内脚本在 version=4.2.0 时输出 Kratos Yang v4.2.0:["\n Kratos Yang v4.2.0\n\n ... \n\n"]
[OK] 注入 9.9.9-probe ⇒ 输出跟着变(版本号单一真源):
     ["\n Kratos Yang v9.9.9-probe\n\n ... \n\n"]
[OK] 无 kratos 对象时不抛错
[OK] 无版本号时仍打印 Kratos Yang
[OK] 无版本号时不凭空补版本号:["\n Kratos Yang\n\n ... \n\n"]
结果:全部通过(10 条)

「注入 9.9.9-probe 输出跟着变」这条是版本号单一真源的端到端证明:只改 style.css 一个数,控制台输出就跟着变。

本地三层判据

层 脚本 结果
正向 _console421_check.py 23 / 0
反证 _console421_falsify.py 6/6 抓到
反证的反证 _console421_meta_falsify.py 5/5 抓到

反证覆盖了「只改源码不重新压缩」「硬编码成本版号 4.1.1(修了一半)」「取不到时凭空补默认号」「PHP 不再注入」等实际可能犯的错。

部署

已上传 kratos_yang-4.2.0.zip 到站点根 /theme-update/,md5 044493c31e7ea14850de7adbb6520e51,公网 HTTP 200、md5 与本地一致、unzip -t 无错。

update.json 已指向 4.2.0,PUC 实测 INSTALLED=4.1.1 / NEW=4.2.0 / HAS_UPDATE=YES(已清 transient)。

提交:c058ecc,已推送到 main。

## 已交付 线上实测:4.1.1 的 `kratos.min.js` 里确实还是 `Kratos v3.1.8`,用户报的问题已在线上复现。 修改方式不是把 `3.1.8` 换成 `4.2.0`(下个版本还得再改一次),而是**删掉这份副本**: | 文件 | 改动 | |---|---| | `assets/js/kratos.js` | 删掉 `var KRATOS_VERSION = '3.1.8'`;`consoleConfig()` 改从 `window.kratos.version` 取 | | `assets/js/kratos.min.js` | 手工同步那一句(无构建脚本,是手工压缩产物) | | `inc/theme-core.php` | `wp_localize_script` 的 `$data` 数组加 `'version' => THEME_VERSION` | | `style.css` | `4.1.1` → `4.2.0` | 现在版本号只有一份真源:`functions.php` 的 `THEME_VERSION` ← `style.css` 的 `Version:`。 ## 为什么是可以直接取的 `wp_localize_script` 在脚本标签**之前**注入,所以 `kratos.min.js` 执行时 `window.kratos` 已经存在,不存在时序问题。 取不到时**只打印 `Kratos Yang`,不凭空补默认版本号** —— 后台预览、维护页这些没走 `wp_enqueue_scripts` 的场景不该在控制台报错。 ## 验证 **线上真实 min.js 运行时验证(node vm 真跑,不是 grep)** ``` [OK] 线上 min.js 可取(HTTP 200) [OK] 线上当前仍是旧标识 Kratos v3.1.8(复现用户报的问题) [OK] 线上旧版实际打印 Kratos v3.1.8:["\n Kratos v3.1.8\n\n ... \n\n"] [OK] 包内 min.js 无旧串 Kratos v3 [OK] 包内脚本在 version=4.2.0 时输出 Kratos Yang v4.2.0:["\n Kratos Yang v4.2.0\n\n ... \n\n"] [OK] 注入 9.9.9-probe ⇒ 输出跟着变(版本号单一真源): ["\n Kratos Yang v9.9.9-probe\n\n ... \n\n"] [OK] 无 kratos 对象时不抛错 [OK] 无版本号时仍打印 Kratos Yang [OK] 无版本号时不凭空补版本号:["\n Kratos Yang\n\n ... \n\n"] 结果:全部通过(10 条) ``` 「注入 9.9.9-probe 输出跟着变」这条是**版本号单一真源**的端到端证明:只改 `style.css` 一个数,控制台输出就跟着变。 **本地三层判据** | 层 | 脚本 | 结果 | |---|---|---| | 正向 | `_console421_check.py` | 23 / 0 | | 反证 | `_console421_falsify.py` | 6/6 抓到 | | 反证的反证 | `_console421_meta_falsify.py` | 5/5 抓到 | 反证覆盖了「只改源码不重新压缩」「硬编码成本版号 4.1.1(修了一半)」「取不到时凭空补默认号」「PHP 不再注入」等实际可能犯的错。 ## 部署 已上传 `kratos_yang-4.2.0.zip` 到站点根 `/theme-update/`,md5 `044493c31e7ea14850de7adbb6520e51`,公网 HTTP 200、md5 与本地一致、`unzip -t` 无错。 `update.json` 已指向 4.2.0,PUC 实测 `INSTALLED=4.1.1 / NEW=4.2.0 / HAS_UPDATE=YES`(已清 transient)。 提交:`c058ecc`,已推送到 main。
Author
Owner

升级后最终验收通过

用户已在后台升级到 4.2.0,控制台实测:

kratos.min.js?ver=4.2.0:1
Kratos Yang v4.2.0
https://code.yangyq.net/laoyang/wordpress-kratos-yang

✅ 用户报的 Kratos v3.1.8 已消失
✅ 品牌名改为 Kratos Yang
✅ 版本号 v4.2.0 来自 style.css 单一真源

注入链路端到端打通

style.css  Version: 4.2.0
   ↓ functions.php  define('THEME_VERSION', wp_get_theme()->get('Version'))
   ↓ inc/theme-core.php:103  $data['version'] => THEME_VERSION
   ↓ wp_localize_script  →  <script id="kratos-js-extra">var kratos = {"version":"4.2.0",...}
   ↓ assets/js/kratos.min.js  window.kratos.version
   ↓ console.log('\n Kratos Yang' + ' v' + ver + ...)

线上 HTML 里能看到注入结果(第 10 个内联脚本):

var kratos = {"version":"4.2.0","site":"https://yangyq.net","directory":"...",...}

升级后文件完整性

theme 文件数              239(与发布包一致)
Version:                  4.2.0
kratos.min.js             Kratos Yang(Kratos v3 清零)
inc/theme-core.php:103    'version' => THEME_VERSION

判据保持全绿:正向 23/0 · 反证 6/6 · 反证的反证 5/5 · 线上运行时 10/0。

关闭工单。

## 升级后最终验收通过 用户已在后台升级到 4.2.0,控制台实测: ``` kratos.min.js?ver=4.2.0:1 Kratos Yang v4.2.0 https://code.yangyq.net/laoyang/wordpress-kratos-yang ``` ✅ 用户报的 `Kratos v3.1.8` 已消失 ✅ 品牌名改为 `Kratos Yang` ✅ 版本号 `v4.2.0` 来自 `style.css` 单一真源 ### 注入链路端到端打通 ``` style.css Version: 4.2.0 ↓ functions.php define('THEME_VERSION', wp_get_theme()->get('Version')) ↓ inc/theme-core.php:103 $data['version'] => THEME_VERSION ↓ wp_localize_script → <script id="kratos-js-extra">var kratos = {"version":"4.2.0",...} ↓ assets/js/kratos.min.js window.kratos.version ↓ console.log('\n Kratos Yang' + ' v' + ver + ...) ``` 线上 HTML 里能看到注入结果(第 10 个内联脚本): ```js var kratos = {"version":"4.2.0","site":"https://yangyq.net","directory":"...",...} ``` ### 升级后文件完整性 ``` theme 文件数 239(与发布包一致) Version: 4.2.0 kratos.min.js Kratos Yang(Kratos v3 清零) inc/theme-core.php:103 'version' => THEME_VERSION ``` 判据保持全绿:正向 23/0 · 反证 6/6 · 反证的反证 5/5 · 线上运行时 10/0。 关闭工单。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: laoyang/wordpress-kratos-yang#35