/* ============================================================================ * JcXx.optimized.vue 验收脚本 * 1) 真实 SFC 编译:vue-template-compiler / @babel/parser / sass * 2) 功能集合零变化:script 哈希 + 模板指令/列/按钮/弹窗集合比对 * 3) 优化前 / 优化后同一份静态 DOM + 两份真实 CSS,多视口截图与布局断言 * 用法:node verify_jcxx.cjs * ==========================================================================*/ const fs = require('fs'); const path = require('path'); const crypto = require('crypto'); const ROOT = path.resolve(__dirname, '..', '..', '..'); const VUE = path.join(ROOT, 'YktVue'); const SRC = path.join(VUE, 'src', 'views', 'JcXx.vue'); const OUT = path.join(VUE, 'src', 'views', 'JcXx.optimized.vue'); const UI = path.join(ROOT, 'docs', 'frontend', 'ui'); const req = p => require(path.join(VUE, 'node_modules', p)); const compiler = req('vue-template-compiler'); const babel = req('@babel/parser'); const sass = req('sass'); let chromium; const PW = 'C:/Users/zfjia/AppData/Roaming/npm/node_modules/@playwright/cli/node_modules/playwright'; const EXE = 'C:/Users/zfjia/AppData/Local/ms-playwright/chromium_headless_shell-1243/chrome-headless-shell-win64/chrome-headless-shell.exe'; try { ({ chromium } = require(PW)); } catch (e) { ({ chromium } = require('playwright')); } const beforeVue = fs.readFileSync(SRC, 'utf8'); const afterVue = fs.readFileSync(OUT, 'utf8'); function parts(s) { // 注意:模板内部有大量 const a = s.indexOf('