发布:完整项目代码(三视图 + 词条数据 + 加载页等)

This commit is contained in:
2026-09-19 16:53:18 +08:00
parent e3fd805de2
commit 906e53f1d5
16 changed files with 1758 additions and 464 deletions
+29 -51
View File
@@ -3,69 +3,47 @@ import puppeteer from 'puppeteer-core';
const CHROME = 'C:/Program Files/Google/Chrome/Application/chrome.exe';
const URL = process.argv[2] || 'http://localhost:5199/';
// 轻量冒烟测试:不做完整渲染流程 / 不触发 Cesium,
// 只检查「加载无 JS 报错 + loading 环出现 + 6 秒后淡出 + App 就绪」。
// 用真实 GPU(不强制 swiftshader 软件渲染)。
const browser = await puppeteer.launch({
executablePath: CHROME,
headless: 'new',
args: ['--no-sandbox', '--disable-gpu', '--use-gl=swiftshader', '--enable-unsafe-swiftshader', '--window-size=1440,900'],
args: ['--no-sandbox', '--window-size=1440,900'],
});
const page = await browser.newPage();
await page.setViewport({ width: 1440, height: 900 });
const errors = [];
page.on('pageerror', (e) => errors.push('pageerror: ' + e.message));
page.on('console', (m) => { if (m.type() === 'error') errors.push('console: ' + m.text()); });
page.on('console', (m) => {
// preview 模式无 HMR,WebSocket 连接失败是正常现象,过滤掉
if (m.type() === 'error' && !/WebSocket|ERR_CONNECTION/i.test(m.text())) {
errors.push('console: ' + m.text());
}
});
await page.goto(URL, { waitUntil: 'domcontentloaded', timeout: 60000 });
await new Promise((r) => setTimeout(r, 6000));
await page.goto(URL, { waitUntil: 'domcontentloaded', timeout: 30000 });
async function snapshot(label) {
const info = await page.evaluate(() => {
const app = window.__app;
const gl = app.renderer.getContext();
const w = gl.drawingBufferWidth, h = gl.drawingBufferHeight;
const buf = new Uint8Array(w * h * 4);
gl.readPixels(0, 0, w, h, gl.RGBA, gl.UNSIGNED_BYTE, buf);
let sum = 0, n = 0, bright = 0;
for (let i = 0; i < buf.length; i += 4) {
const lum = 0.299 * buf[i] + 0.587 * buf[i + 1] + 0.114 * buf[i + 2];
sum += lum; n++;
if (lum > 40) bright++;
}
return {
view: app.view,
selected: app.selected,
binderCurrent: app.binder.current,
pages: app.binder.pages.length,
timelineCards: app.timeline.cards.length,
globeMarkers: app.globe.markers.length,
detailName: document.getElementById('detail-name')?.textContent,
detailNo: document.getElementById('detail-no')?.textContent,
avgLum: +(sum / n).toFixed(2),
brightPct: +((bright / n) * 100).toFixed(2),
};
});
console.log(label, JSON.stringify(info, null, 0));
}
// 阶段一:加载环应已出现且正在展示
await new Promise((r) => setTimeout(r, 2000));
const loading = await page.evaluate(() => ({
hasCanvas: !!document.querySelector('#loading-canvas canvas'),
loadingShown: !document.getElementById('loading').classList.contains('hidden'),
appReady: !!window.__app,
}));
await snapshot('binder ');
await page.click('.view-btn[data-view="timeline"]');
await new Promise((r) => setTimeout(r, 2400));
await snapshot('timeline');
await page.click('.view-btn[data-view="globe"]');
await new Promise((r) => setTimeout(r, 2400));
await snapshot('globe ');
await page.click('.view-btn[data-view="binder"]');
await new Promise((r) => setTimeout(r, 2400));
await page.click('#btn-next');
await new Promise((r) => setTimeout(r, 1500));
await snapshot('flipped ');
await page.click('#btn-prev');
await new Promise((r) => setTimeout(r, 1500));
await snapshot('back ');
// 阶段二:约 9 秒后,loading 应已淡出、App 应已就绪
await new Promise((r) => setTimeout(r, 7000));
const done = await page.evaluate(() => ({
loadingHidden: document.getElementById('loading').classList.contains('hidden'),
appReady: !!window.__app,
view: window.__app?.view,
pages: window.__app?.binder?.pages?.length,
timelineCards: window.__app?.timeline?.cards?.length,
}));
console.log('阶段一(加载中):', JSON.stringify(loading));
console.log('阶段二(加载后):', JSON.stringify(done));
console.log('ERRORS:', errors.length ? errors.join('\n') : '(none)');
await browser.close();