@quicktvui/web-cli 3.1.0 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
File without changes
@@ -12,8 +12,7 @@ const signale = require('signale')
12
12
  class HotReloader {
13
13
  constructor() {
14
14
  this.clients = new Set()
15
- this.lastEventType = null
16
- this.lastEventData = null
15
+ this.lastEvent = null
17
16
  }
18
17
 
19
18
  /**
@@ -31,8 +30,8 @@ class HotReloader {
31
30
  res.write(`data: ${JSON.stringify({ type: 'connected', timestamp: Date.now() })}\n\n`)
32
31
 
33
32
  // 如果有最近的事件,立即发送
34
- if (this.lastEventType) {
35
- res.write(`data: ${JSON.stringify({ type: this.lastEventType, ...this.lastEventData })}\n\n`)
33
+ if (this.lastEvent) {
34
+ res.write(`data: ${JSON.stringify(this.lastEvent)}\n\n`)
36
35
  }
37
36
 
38
37
  this.clients.add(res)
@@ -58,8 +57,7 @@ class HotReloader {
58
57
  ...data,
59
58
  }
60
59
 
61
- this.lastEventType = 'bundle-update'
62
- this.lastEventData = data
60
+ this.lastEvent = event
63
61
 
64
62
  this._broadcast(event)
65
63
  signale.info(`[HotReloader] 通知 ${this.clients.size} 个客户端: bundle-update`)
@@ -75,8 +73,7 @@ class HotReloader {
75
73
  reason,
76
74
  }
77
75
 
78
- this.lastEventType = 'full-reload'
79
- this.lastEventData = { reason }
76
+ this.lastEvent = event
80
77
 
81
78
  this._broadcast(event)
82
79
  signale.info(`[HotReloader] 通知 ${this.clients.size} 个客户端: full-reload`)
@@ -93,8 +90,7 @@ class HotReloader {
93
90
  timestamp: Date.now(),
94
91
  }
95
92
 
96
- this.lastEventType = 'build-status'
97
- this.lastEventData = { status, message }
93
+ this.lastEvent = event
98
94
 
99
95
  this._broadcast(event)
100
96
  }
@@ -104,8 +100,7 @@ class HotReloader {
104
100
  * 防止 SSE 重连后再次发送旧的 bundle-update 导致无限刷新
105
101
  */
106
102
  clearLastEvent() {
107
- this.lastEventType = null
108
- this.lastEventData = null
103
+ this.lastEvent = null
109
104
  }
110
105
 
111
106
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quicktvui/web-cli",
3
- "version": "3.1.0",
3
+ "version": "3.1.1",
4
4
  "description": "CLI tool for QuickTVUI web development v3 - delegate build & bundle loading",
5
5
  "author": "QuickTVUI Team",
6
6
  "license": "Apache-2.0",
@@ -8,10 +8,6 @@
8
8
  "qt-web-cli": "./bin/qt-web-cli.js"
9
9
  },
10
10
  "main": "lib/index.js",
11
- "scripts": {
12
- "sync-runtime": "rm -rf runtime/*.js && cp ../web-runtime/dist/web-runtime.*.js runtime/",
13
- "prepublishOnly": "npm run sync-runtime"
14
- },
15
11
  "files": [
16
12
  "bin",
17
13
  "lib",
@@ -86,5 +82,8 @@
86
82
  },
87
83
  "engines": {
88
84
  "node": ">=16.0.0"
85
+ },
86
+ "scripts": {
87
+ "sync-runtime": "rm -rf runtime/*.js && cp ../web-runtime/dist/web-runtime.*.js runtime/"
89
88
  }
90
- }
89
+ }
@@ -295,10 +295,17 @@
295
295
  var sseTabId = 'qt-dev-tab-' + Date.now() + '-' + Math.random().toString(36).slice(2);
296
296
  var sseLeaderKey = 'quicktvui-dev-sse-leader';
297
297
  var sseLeaderTtl = 10000;
298
+ // 仅处理当前页面加载后发生的刷新事件,避免前后台切换时重放旧事件误刷新。
299
+ var pageLoadedAt = Date.now();
298
300
  // 页面加载后的冷却期:这段时间内忽略 bundle-update 事件
299
301
  // 防止 SSE 重连后收到缓存的旧 bundle-update 导致无限刷新
300
302
  var sseCooldownUntil = Date.now() + 3000; // 3 秒冷却期
301
303
 
304
+ function isStaleReloadEvent(data) {
305
+ if (!data || typeof data.timestamp !== 'number') return false;
306
+ return data.timestamp <= pageLoadedAt;
307
+ }
308
+
302
309
  function readSseLeader() {
303
310
  try {
304
311
  var raw = localStorage.getItem(sseLeaderKey);
@@ -392,6 +399,11 @@
392
399
  if (data.type === 'connected') {
393
400
  updateStatus('ready', '开发服务器已连接');
394
401
  } else if (data.type === 'bundle-update') {
402
+ if (isStaleReloadEvent(data)) {
403
+ console.log('[Dev] Ignoring stale bundle-update', data.timestamp, '<=', pageLoadedAt);
404
+ updateStatus('ready', '构建完成');
405
+ return;
406
+ }
395
407
  if (Date.now() < sseCooldownUntil) {
396
408
  console.log('[Dev] Ignoring bundle-update during cooldown');
397
409
  updateStatus('ready', '构建完成');
@@ -400,6 +412,10 @@
400
412
  updateStatus('building', 'Bundle 更新中...');
401
413
  setTimeout(function() { location.reload(); }, 300);
402
414
  } else if (data.type === 'full-reload') {
415
+ if (isStaleReloadEvent(data)) {
416
+ console.log('[Dev] Ignoring stale full-reload', data.timestamp, '<=', pageLoadedAt);
417
+ return;
418
+ }
403
419
  if (Date.now() < sseCooldownUntil) {
404
420
  console.log('[Dev] Ignoring full-reload during cooldown');
405
421
  return;