13 KiB
目标与边界
将 AKSRT 前台 DOM 架构一次性硬切换为 C:\Users\Xing\Desktop\zibll 的真实架构:
WordPress 配置/_win
→ jQuery → Bootstrap → runtime/loader.js
→ tbquire(['main'])
→ main.js 顶层全局委托 + window.auto_fun()
→ 局部 AJAX:post_ajax.ed
→ JSON AJAX:zib_ajax.success
→ 远程 modal:loaded.bs.modal → auto_fun()
不保留 AksrtFrontend、不写兼容适配器、不做双路初始化、不保留“迁移中”分支。保留 AKSRT 的业务能力和安全处理,但全部挂到参考主题的唯一 main/auto_fun owner 上。按用户要求只做静态、契约、VM、语法和构建验证,不做真实视觉验收。
一、运行时入口硬切换
-
重写
assets/js/runtime/loader.js- 以参考主题 loader 为行为基准,恢复 RequireJS 改名运行时、
tbquire.config()和最后的tbquire(['main'])。 - 根据 AKSRT 实际目录调整
baseUrl与 URL 版本参数,但保持参考主题的加载语义和 module mapping 结构。 - 将当前仍有业务消费者的模块纳入 mapping:main、imgbox、page-navs、section-navs、comment、message、input-expand、mini-upload、page-template、page-edit、author、poster-share、captcha、pay、swiper、dplayer、lazySizes、clipboard、svg-icon、enlighter、translate 等;每个 mapping 只指向一个真实文件,不复制第二份实现。
- 删除当前仅为
AksrtFrontend/aksrt.tbquire服务的映射和 fallback。
- 以参考主题 loader 为行为基准,恢复 RequireJS 改名运行时、
-
重写
assets/js/runtime/main.js- 以参考主题
zibll/js/main.js的全局顺序为骨架:顶层建立_win.bd/_win.window,注册 body/document 委托,定义全局 API 与插件,定义z_auto_fun,暴露window.auto_fun = debounce(z_auto_fun, 100),顶层首次调用auto_fun(),最后执行单一$(document).ready(...)首屏逻辑。 - 将 AKSRT 当前
aksrt-runtime.js中仍需要的 declarative action、确认、通知、上传/安全/站点功能直接并入该唯一运行时或对应tbquire模块,不再通过第二个 runtime 注册表调用。 - 将所有按 DOM 条件加载逻辑集中到
z_auto_fun():支付、消息、输入扩展、上传、海报分享、验证码、复制、tooltip、popover、affix、Swiper、DPlayer、SVG、代码高亮、灯箱等,严格按参考主题调用tbquire()。 - 删除
AksrtFrontend.register('aksrt-legacy-main', ...)、window.auto_fun到AksrtFrontend.rehydrate()的 wrapper、z_auto_fun()中对新 registry 的依赖。 - 将原先局部更新后的
AksrtFrontend.rehydrate(root, 'ajax'/'modal')全部改为参考主题调用顺序:注入完成后触发post_ajax.ed(列表场景)或loaded.bs.modal(远程 modal),随后调用防抖auto_fun()。 - 保留必要的幂等 class/data 标记(如
is-on、swiper-container-initialized、dplayer-initialized),但删除无法再被调用的 registry 保护代码。
- 以参考主题
-
删除新生命周期核心
- 删除
assets/js/rehydrate.js。 - 将
assets/js/aksrt-runtime.js中仍需的实际业务行为迁移到runtime/main.js或对应按需模块后,删除该文件及其作为公共入口的职责;不得留下空壳aksrt-runtime适配层。 - 清理所有
AksrtFrontend.register/boot/rehydrate、aksrt.autoFun、aksrt:ready、aksrt:rehydrated引用和注释。
- 删除
二、公共构建与 PHP 入队重构
-
调整
tools/build-public-assets.mjs- 不再把整个 canonical 模块集合拼成一个
public.js再依赖AksrtFrontend。 - 以参考主题的独立 loader + 独立动态模块为构建图;对仍需生成的压缩文件只从唯一源码生成,避免 source/min 双 owner。
- 保留 CSS bundle 构建;JS 构建只生成 loader/main 及实际 mapping 所需的 min 产物。
- 生成后执行静态顺序检查,确保 loader 先于 main 动态加载,且没有
tbquire(['main'])之外的第二个 boot。
- 不再把整个 canonical 模块集合拼成一个
-
调整
src/Core/Scripts.php、ScriptsPart1b.php、ScriptsPart1c.php及 WidgetSystem AssetManager- 前台基础依赖改为 jQuery → Bootstrap →
runtime/loader.js,不再将build/public.js作为全局生命周期入口。 - 删除所有 routed script 对
aksrt-runtime的依赖;路由模块改由 loader/main 按 DOM 条件加载,直接遵循参考主题的条件加载方式。 - 将
_win作为唯一前台运行时配置对象;把必须保留的 AKSRT 数据字段合并进去,避免同时维护_win、aksrtData两套 DOM 生命周期配置。 - WidgetSystem 只保留一个前端 owner:将 widget 的初始化接入
auto_fun/对应动态模块,禁止assets/widgets/frontend.js与旧 widget-set/main 重复初始化同一节点;同步调整第三方资源注册和依赖。 - 清理已迁移到 loader/main 的独立 enqueue、重复 inline boot、重复条件判断和无实际动作的 Swiper 注册。
- 前台基础依赖改为 jQuery → Bootstrap →
三、局部更新协议统一为参考主题行为
-
列表 AJAX:
assets/js/core/ajax-list.js、homepage-fixed.js、pagination.js、comments.js、routes/user-center.js、author.js、widgets/frontend.js等- 保留现有请求、安全、错误提示和业务响应格式。
- 删除直接
AksrtFrontend.rehydrate()的调用。 - 按场景统一为:before 状态 → HTML parse/replace/append → 触发容器上的
post_ajax.ed→auto_fun();保留参考主题的ing/loading/分页/route 顺序。 - 对复杂 panel 继续使用现有 destroy 能力(例如订单中心),但 destroy 只是业务实例清理,不再扩展成第二套全局 lifecycle。
- 明确旧
.ajax-next与新data-aksrt-*的唯一 ownership;最终删除重复 click handler,控制只由一个post_ajax实现处理。
-
JSON AJAX:
comment-ajax.js、auth.js、follow.js、credits.js、reward.js、messages.js等- 统一使用参考主题的
zib_ajax()语义:按钮状态、错误/成功提示、zib_ajax.success事件、业务 callback、可选 modal/reload。 - 删除以
aksrt:rehydrated或 registry 事件作为成功信号的路径;只有真正 HTML 注入后才调用auto_fun()。
- 统一使用参考主题的
-
远程 modal 与历史路由
- modal HTML 更新改为 Bootstrap
loaded.bs.modal,由 main 的全局监听调用auto_fun()。 - 保留
history.pushState/replaceState与 Tabpopstate行为,但删除AksrtFrontend路由 API 和独立页面 boot;不引入 PJAX、Turbolinks、InstantClick 或全局 MutationObserver 重初始化。
- modal HTML 更新改为 Bootstrap
四、灯箱、懒加载和 DOM 标记恢复为参考主题契约
-
灯箱硬切换
- 删除
AksrtLightbox、data-aksrt-lightbox*、aksrt-lightboxoverlay 和其专用 CSS/配置桥接。 - 从参考主题恢复单一
imgboxowner:新增/恢复assets/js/runtime/imgbox.js(压缩产物由构建生成),使用Miniimgbox、imgbox-container、a[data-imgbox]、imgbox_data和参考主题的幂等标记。 main.js只在_win.imgbox且存在目标 DOM 时tbquire(['imgbox']);不得再有第二个灯箱监听器。- 更新
single.php、page.php、gallery/content renderer、图片 helper、相关 CSS 和设置输出,使 DOM 属性、分组、缩略图、zoom/full/play/down 开关与参考主题一致。
- 删除
-
懒加载单一 owner
- 删除
lazy-image-attr.jsbridge 及其 enqueue/build/test 依赖;lazySizes、lazybeforeunveil、data-src/data-srcset/data-bg、兼容属性处理全部由 main/lazySizes owner 负责。 - 保留必要的 PHP 图片 URL 生成和占位图能力,但统一输出参考主题可识别的 DOM,不再并行维护第二套 lazy switch 或 IntersectionObserver 初始化。
- 保留 lazySizes 自有 MutationObserver;禁止把它扩展成全局组件 rehydrate 机制。
- 删除
五、所有业务模块去 registry 化
逐一处理当前已注册的 public/routed 文件(article、comments、comment-fixed-input、pagination、archive、footer-tabbar、misc、follow、enhancements、enhancements2、color-extract、effects、captcha、auth、author、page-navs、section-navs、messages、front-submit、mini-upload、page-template、page-edit、post-share、poster-share、pay-vip、video-player、download-status、ban-appeal、docs-navigation、input-expand、waterfall、yiyan、site-notice、user-badge-actions、widgets 等):
- 删除
AksrtFrontend.register()包装和对 registry API 的防御性分支。 - 将脚本改成参考主题式:被
tbquire加载后立即定义/绑定,或暴露单一模块初始化函数供 main 调用;依赖 DOM 委托和is-on/class/data 标记实现重复调用安全。 - 任何需要窗口/文档监听的模块只绑定一次,并使用参考主题的全局 owner;不新增 destroy registry、root 广播或双入口 ready。
- 保留 AKSRT 的 nonce、REST 权限、输出转义和业务接口,不改变安全边界。
六、死代码清理
在改造前后用 rg/git grep 建立引用图,仅删除已确认无入口的代码,避免把仍被动态 loader 使用的资源误删:
- 删除
assets/js/revenue.js(确认无 PHP、JS、构建和模板引用后)。 - 删除当前
rehydrate.js、aksrt-runtime.js生命周期专用代码及其测试夹具。 - 删除
runtime/main.js中已迁移功能的 registry 适配、注释掉的 waterfall 分支、未使用auto_fun转发代码和重复事件派发。 - 删除确认无 mapping、enqueue、模板或第三方引用的
runtime/widget-set.*、runtime/mini-touch.*、waterfall.*等 orphan;若仍被参考主题式 loader 使用,则保留唯一映射,不凭文件名删除。 - 删除
AksrtLightbox、旧 overlay、runtime/imgbox 的冲突副本和无消费者的aksrt.*API;_win、tbquire、main、loader、Swiper/DPlayer/lazySizes 只在确认所有消费者迁移后保留。 - 同步清理文档、注释、PHP handles、构建清单、测试中的旧 token,确保仓库不存在“旧入口还能被重新接回”的死配置。
七、测试与非视觉验证改造
-
删除/重写锁定旧架构的测试:
global-dom-init-contract.test.cjs→legacy-loader-runtime-contract.test.cjs:验证 loader config、mapping、tbquire(['main'])、唯一 boot owner。rehydrate-runtime-contract.test.cjs→legacy-auto-fun-contract.test.cjs:VM 验证auto_fun防抖、重复调用、auto_fun事件、异常隔离和 DOM 标记幂等。public-bundle-parity-contract.test.cjs:改为验证 loader/main 构建图,不再断言AksrtFrontend。homepage-dom-contract.test.cjs:改为验证 HTML 注入后post_ajax.ed → auto_fun顺序和唯一 delegated owner。lightbox-contract.test.cjs:改为Miniimgbox/data-imgbox/imgboxmapping 契约。lazyload-contract.test.cjs:改为 main/lazySizes 单 owner 契约。legacy-navigation-contract.test.cjs:验证 loader 的 page-navs/section-navs mapping 和auto_fun条件加载。
-
新增/保留 VM 与静态契约:
- loader URL 解析和模块缓存只发生一次。
- 同一 DOM 多次
auto_fun()不重复绑定 tooltip、Swiper、DPlayer、imgbox、上传和 widget。 post_ajax.ed、zib_ajax.success、loaded.bs.modal三种事件不混用。- 全仓库禁止
AksrtFrontend、aksrt.autoFun、aksrt:ready、aksrt:rehydrated、第二套DOMContentLoaded页面 boot。 - 静态检查没有 PJAX/InstantClick/全局 MutationObserver reinit 新入口。
-
继续运行与改造后的验证:
- Node widget/navigation 契约测试。
tools/test-credits-rehydrate.mjs(改名或改断言为 auto_fun 重入 harness)。- WidgetSystem PHP audit、asset ledger、业务安全/支付/评论相关测试。
node --check检查所有改动后的 JS 和构建脚本。php -l检查所有改动后的 PHP。node tools/build-public-assets.mjs后再次运行 bundle/source parity、旧入口扫描和git diff --check。
八、实施顺序与完成标准
- 先完成只读引用图和测试基线,记录当前失败/通过集合。
- 先改 loader/main/构建/PHP 入队,建立唯一运行时入口。
- 再批量去掉所有 registry 调用并统一 AJAX/modal 事件顺序。
- 再恢复参考主题灯箱和 lazySizes owner,更新模板/CSS/配置。
- 最后删除确认死代码与旧测试,重建生成产物。
- 完成标准:
- 前台只有
loader → main → auto_fun一条初始 DOM 路径。 - 没有任何
AksrtFrontend或其双路兼容代码。 - 列表、JSON、modal 三类更新分别遵循参考主题事件协议。
- Swiper、DPlayer、lazySizes、imgbox、WidgetSystem 各只有一个 owner。
- 所有已确认死代码和旧契约被删除或改写。
- 非视觉测试、语法检查、构建和静态引用审计通过;不执行真实视觉验收。
- 前台只有