Search K
Appearance
Appearance
📊 SEO元描述:2024年最新JavaScript现代性能技术教程,详解Web Workers多线程、Service Workers离线缓存、Shared Array Buffer。包含完整实战案例,适合前端开发者掌握现代性能优化技术。
核心关键词:JavaScript现代性能技术2024、Web Workers多线程、Service Workers离线缓存、Shared Array Buffer、前端多线程编程、PWA性能优化
长尾关键词:JavaScript Web Workers怎么使用、Service Workers离线功能实现、前端多线程编程技巧、PWA性能优化方案、JavaScript并发处理技术
通过本节JavaScript现代性能技术完整指南,你将系统性掌握:
JavaScript现代性能技术是什么?这是现代Web开发的前沿领域。JavaScript现代性能技术是指利用Web Workers、Service Workers、Shared Array Buffer等现代浏览器API来突破JavaScript单线程限制,实现高性能Web应用的技术方案,也是下一代Web应用的核心技术。
💡 技术趋势建议:随着Web应用复杂度增加,现代性能技术已成为高级前端开发者的必备技能。掌握这些技术可以将应用性能提升数倍。
Web Workers允许在后台线程中运行JavaScript代码,实现真正的多线程编程,避免阻塞主线程。
// 🎉 高级Web Workers管理系统
class AdvancedWorkerManager {
constructor() {
this.workers = new Map();
this.workerPool = new Map();
this.taskQueue = [];
this.performanceMetrics = {
tasksCompleted: 0,
averageExecutionTime: 0,
workerUtilization: 0,
errorRate: 0
};
this.init();
}
// 初始化Worker管理器
init() {
this.detectWorkerSupport();
this.setupPerformanceMonitoring();
}
// 检测Worker支持
detectWorkerSupport() {
this.workerSupport = {
webWorker: typeof Worker !== 'undefined',
sharedWorker: typeof SharedWorker !== 'undefined',
serviceWorker: 'serviceWorker' in navigator
};
console.log('Worker Support:', this.workerSupport);
}
// 创建Worker池
createWorkerPool(workerScript, poolSize = 4, options = {}) {
const poolId = `pool_${Date.now()}`;
const pool = {
workers: [],
available: [],
busy: [],
script: workerScript,
options,
tasks: 0
};
// 创建Worker实例
for (let i = 0; i < poolSize; i++) {
const worker = this.createWorker(workerScript, options);
const workerId = `${poolId}_worker_${i}`;
worker.workerId = workerId;
worker.poolId = poolId;
worker.isAvailable = true;
pool.workers.push(worker);
pool.available.push(worker);
this.workers.set(workerId, worker);
}
this.workerPool.set(poolId, pool);
return poolId;
}
// 创建单个Worker
createWorker(script, options = {}) {
let worker;
if (typeof script === 'string') {
// 从URL创建Worker
worker = new Worker(script, options);
} else if (typeof script === 'function') {
// 从函数创建Worker
const blob = new Blob([`(${script.toString()})()`], {
type: 'application/javascript'
});
const url = URL.createObjectURL(blob);
worker = new Worker(url, options);
// 清理URL
worker.addEventListener('error', () => URL.revokeObjectURL(url));
worker.addEventListener('message', () => URL.revokeObjectURL(url), { once: true });
}
// 设置错误处理
worker.addEventListener('error', (error) => {
console.error('Worker error:', error);
this.handleWorkerError(worker, error);
});
return worker;
}
// 执行任务
async executeTask(poolId, taskData, options = {}) {
const pool = this.workerPool.get(poolId);
if (!pool) {
throw new Error(`Worker pool ${poolId} not found`);
}
const { timeout = 30000, priority = 'normal' } = options;
return new Promise((resolve, reject) => {
const task = {
id: `task_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
data: taskData,
resolve,
reject,
timeout,
priority,
startTime: performance.now(),
poolId
};
// 根据优先级插入任务队列
if (priority === 'high') {
this.taskQueue.unshift(task);
} else {
this.taskQueue.push(task);
}
this.processTaskQueue();
});
}
// 处理任务队列
processTaskQueue() {
while (this.taskQueue.length > 0) {
const task = this.taskQueue[0];
const pool = this.workerPool.get(task.poolId);
if (pool.available.length === 0) {
break; // 没有可用Worker
}
const worker = pool.available.shift();
pool.busy.push(worker);
worker.isAvailable = false;
this.taskQueue.shift();
this.assignTaskToWorker(worker, task);
}
}
// 分配任务给Worker
assignTaskToWorker(worker, task) {
const timeoutId = setTimeout(() => {
task.reject(new Error('Task timeout'));
this.releaseWorker(worker);
}, task.timeout);
const messageHandler = (event) => {
clearTimeout(timeoutId);
worker.removeEventListener('message', messageHandler);
const executionTime = performance.now() - task.startTime;
this.updatePerformanceMetrics(executionTime, true);
if (event.data.error) {
task.reject(new Error(event.data.error));
} else {
task.resolve(event.data.result);
}
this.releaseWorker(worker);
};
worker.addEventListener('message', messageHandler);
worker.postMessage({
taskId: task.id,
data: task.data
});
}
// 释放Worker
releaseWorker(worker) {
const pool = this.workerPool.get(worker.poolId);
if (pool) {
const busyIndex = pool.busy.indexOf(worker);
if (busyIndex > -1) {
pool.busy.splice(busyIndex, 1);
pool.available.push(worker);
worker.isAvailable = true;
// 继续处理队列中的任务
this.processTaskQueue();
}
}
}
// 处理Worker错误
handleWorkerError(worker, error) {
console.error(`Worker ${worker.workerId} error:`, error);
this.updatePerformanceMetrics(0, false);
// 重新创建Worker
this.recreateWorker(worker);
}
// 重新创建Worker
recreateWorker(oldWorker) {
const pool = this.workerPool.get(oldWorker.poolId);
if (pool) {
// 移除旧Worker
const workerIndex = pool.workers.indexOf(oldWorker);
if (workerIndex > -1) {
pool.workers.splice(workerIndex, 1);
const availableIndex = pool.available.indexOf(oldWorker);
if (availableIndex > -1) {
pool.available.splice(availableIndex, 1);
}
const busyIndex = pool.busy.indexOf(oldWorker);
if (busyIndex > -1) {
pool.busy.splice(busyIndex, 1);
}
}
// 创建新Worker
const newWorker = this.createWorker(pool.script, pool.options);
newWorker.workerId = oldWorker.workerId;
newWorker.poolId = oldWorker.poolId;
newWorker.isAvailable = true;
pool.workers.push(newWorker);
pool.available.push(newWorker);
this.workers.set(newWorker.workerId, newWorker);
}
// 终止旧Worker
oldWorker.terminate();
this.workers.delete(oldWorker.workerId);
}
// 批量执行任务
async executeBatch(poolId, tasks, options = {}) {
const { concurrency = 4, failFast = false } = options;
const results = [];
const errors = [];
// 分批执行
for (let i = 0; i < tasks.length; i += concurrency) {
const batch = tasks.slice(i, i + concurrency);
const batchPromises = batch.map(async (task, index) => {
try {
const result = await this.executeTask(poolId, task, options);
return { index: i + index, result, error: null };
} catch (error) {
const errorResult = { index: i + index, result: null, error };
if (failFast) {
throw errorResult;
}
return errorResult;
}
});
try {
const batchResults = await Promise.all(batchPromises);
batchResults.forEach(({ index, result, error }) => {
if (error) {
errors.push({ index, error });
} else {
results[index] = result;
}
});
} catch (error) {
if (failFast) {
throw error;
}
}
}
return { results, errors };
}
// 创建计算密集型Worker
createComputeWorker() {
const workerCode = `
// 计算密集型任务Worker
self.addEventListener('message', function(e) {
const { taskId, data } = e.data;
try {
let result;
switch (data.type) {
case 'fibonacci':
result = fibonacci(data.n);
break;
case 'prime':
result = isPrime(data.n);
break;
case 'sort':
result = data.array.sort((a, b) => a - b);
break;
case 'matrix':
result = multiplyMatrix(data.a, data.b);
break;
case 'hash':
result = simpleHash(data.text);
break;
default:
throw new Error('Unknown task type: ' + data.type);
}
self.postMessage({ taskId, result });
} catch (error) {
self.postMessage({ taskId, error: error.message });
}
});
// 斐波那契数列
function fibonacci(n) {
if (n <= 1) return n;
let a = 0, b = 1;
for (let i = 2; i <= n; i++) {
[a, b] = [b, a + b];
}
return b;
}
// 质数判断
function isPrime(n) {
if (n <= 1) return false;
if (n <= 3) return true;
if (n % 2 === 0 || n % 3 === 0) return false;
for (let i = 5; i * i <= n; i += 6) {
if (n % i === 0 || n % (i + 2) === 0) return false;
}
return true;
}
// 矩阵乘法
function multiplyMatrix(a, b) {
const result = [];
for (let i = 0; i < a.length; i++) {
result[i] = [];
for (let j = 0; j < b[0].length; j++) {
let sum = 0;
for (let k = 0; k < b.length; k++) {
sum += a[i][k] * b[k][j];
}
result[i][j] = sum;
}
}
return result;
}
// 简单哈希
function simpleHash(text) {
let hash = 0;
for (let i = 0; i < text.length; i++) {
const char = text.charCodeAt(i);
hash = ((hash << 5) - hash) + char;
hash = hash & hash;
}
return hash.toString(36);
}
`;
return this.createWorkerPool(workerCode, 4);
}
// 更新性能指标
updatePerformanceMetrics(executionTime, success) {
this.performanceMetrics.tasksCompleted++;
if (success) {
const currentAverage = this.performanceMetrics.averageExecutionTime;
const count = this.performanceMetrics.tasksCompleted;
this.performanceMetrics.averageExecutionTime =
(currentAverage * (count - 1) + executionTime) / count;
} else {
this.performanceMetrics.errorRate =
(this.performanceMetrics.errorRate * (this.performanceMetrics.tasksCompleted - 1) + 1) /
this.performanceMetrics.tasksCompleted;
}
// 计算Worker利用率
let totalWorkers = 0;
let busyWorkers = 0;
for (const pool of this.workerPool.values()) {
totalWorkers += pool.workers.length;
busyWorkers += pool.busy.length;
}
this.performanceMetrics.workerUtilization =
totalWorkers > 0 ? (busyWorkers / totalWorkers) * 100 : 0;
}
// 设置性能监控
setupPerformanceMonitoring() {
setInterval(() => {
const report = this.getPerformanceReport();
console.log('Worker Performance Report:', report);
}, 10000);
}
// 获取性能报告
getPerformanceReport() {
const poolStats = {};
for (const [poolId, pool] of this.workerPool) {
poolStats[poolId] = {
totalWorkers: pool.workers.length,
availableWorkers: pool.available.length,
busyWorkers: pool.busy.length,
utilization: pool.workers.length > 0 ?
(pool.busy.length / pool.workers.length) * 100 : 0
};
}
return {
...this.performanceMetrics,
poolStats,
queueLength: this.taskQueue.length,
workerSupport: this.workerSupport,
recommendations: this.generateRecommendations()
};
}
// 生成优化建议
generateRecommendations() {
const recommendations = [];
if (this.performanceMetrics.workerUtilization > 90) {
recommendations.push({
type: 'high-utilization',
message: 'Worker利用率过高,建议增加Worker池大小',
priority: 'high'
});
}
if (this.taskQueue.length > 10) {
recommendations.push({
type: 'queue-backlog',
message: '任务队列积压,建议优化任务处理或增加Worker数量',
priority: 'medium'
});
}
if (this.performanceMetrics.errorRate > 0.1) {
recommendations.push({
type: 'high-error-rate',
message: '错误率过高,建议检查Worker代码和错误处理',
priority: 'high'
});
}
return recommendations;
}
// 销毁Worker池
destroyPool(poolId) {
const pool = this.workerPool.get(poolId);
if (pool) {
pool.workers.forEach(worker => {
worker.terminate();
this.workers.delete(worker.workerId);
});
this.workerPool.delete(poolId);
}
}
// 销毁所有Worker
destroy() {
for (const poolId of this.workerPool.keys()) {
this.destroyPool(poolId);
}
this.taskQueue = [];
}
}
// 使用示例
const workerManager = new AdvancedWorkerManager();
// 创建计算Worker池
const computePoolId = workerManager.createComputeWorker();
// 执行计算任务
async function performHeavyComputation() {
try {
// 单个任务
const fibResult = await workerManager.executeTask(computePoolId, {
type: 'fibonacci',
n: 40
});
console.log('Fibonacci result:', fibResult);
// 批量任务
const tasks = Array.from({ length: 10 }, (_, i) => ({
type: 'prime',
n: 1000000 + i
}));
const { results, errors } = await workerManager.executeBatch(
computePoolId,
tasks,
{ concurrency: 4 }
);
console.log('Prime check results:', results);
if (errors.length > 0) {
console.error('Errors:', errors);
}
} catch (error) {
console.error('Computation failed:', error);
}
}
// 执行计算
performHeavyComputation();
// 监控性能
setInterval(() => {
const report = workerManager.getPerformanceReport();
console.log('Performance:', report);
}, 5000);Service Workers是运行在浏览器后台的脚本,可以拦截网络请求、实现离线功能和推送通知。
// 🎉 高级Service Worker管理系统
class AdvancedServiceWorkerManager {
constructor() {
this.registration = null;
this.isSupported = 'serviceWorker' in navigator;
this.cacheStrategies = new Map();
this.syncTasks = new Map();
this.init();
}
// 初始化Service Worker
async init() {
if (!this.isSupported) {
console.warn('Service Worker not supported');
return;
}
try {
await this.registerServiceWorker();
this.setupMessageHandling();
this.setupUpdateHandling();
} catch (error) {
console.error('Service Worker initialization failed:', error);
}
}
// 注册Service Worker
async registerServiceWorker() {
const swCode = this.generateServiceWorkerCode();
const blob = new Blob([swCode], { type: 'application/javascript' });
const swUrl = URL.createObjectURL(blob);
this.registration = await navigator.serviceWorker.register(swUrl, {
scope: '/'
});
console.log('Service Worker registered:', this.registration);
// 清理URL
URL.revokeObjectURL(swUrl);
return this.registration;
}
// 生成Service Worker代码
generateServiceWorkerCode() {
return `
const CACHE_NAME = 'app-cache-v1';
const RUNTIME_CACHE = 'runtime-cache-v1';
// 缓存策略配置
const cacheStrategies = new Map();
// 安装事件
self.addEventListener('install', event => {
console.log('Service Worker installing...');
event.waitUntil(
caches.open(CACHE_NAME).then(cache => {
return cache.addAll([
'/',
'/index.html',
'/styles.css',
'/app.js',
'/manifest.json'
]);
})
);
self.skipWaiting();
});
// 激活事件
self.addEventListener('activate', event => {
console.log('Service Worker activating...');
event.waitUntil(
caches.keys().then(cacheNames => {
return Promise.all(
cacheNames.map(cacheName => {
if (cacheName !== CACHE_NAME && cacheName !== RUNTIME_CACHE) {
console.log('Deleting old cache:', cacheName);
return caches.delete(cacheName);
}
})
);
}).then(() => {
return self.clients.claim();
})
);
});
// 网络请求拦截
self.addEventListener('fetch', event => {
const { request } = event;
const url = new URL(request.url);
// 跳过非HTTP请求
if (!url.protocol.startsWith('http')) {
return;
}
// 根据URL模式选择缓存策略
const strategy = getCacheStrategy(request);
switch (strategy) {
case 'cache-first':
event.respondWith(cacheFirst(request));
break;
case 'network-first':
event.respondWith(networkFirst(request));
break;
case 'stale-while-revalidate':
event.respondWith(staleWhileRevalidate(request));
break;
case 'network-only':
event.respondWith(networkOnly(request));
break;
case 'cache-only':
event.respondWith(cacheOnly(request));
break;
default:
event.respondWith(networkFirst(request));
}
});
// 获取缓存策略
function getCacheStrategy(request) {
const url = new URL(request.url);
// API请求使用网络优先
if (url.pathname.startsWith('/api/')) {
return 'network-first';
}
// 静态资源使用缓存优先
if (url.pathname.match(/\\.(css|js|png|jpg|jpeg|gif|svg|woff|woff2)$/)) {
return 'cache-first';
}
// HTML页面使用stale-while-revalidate
if (request.destination === 'document') {
return 'stale-while-revalidate';
}
return 'network-first';
}
// 缓存优先策略
async function cacheFirst(request) {
const cachedResponse = await caches.match(request);
if (cachedResponse) {
return cachedResponse;
}
try {
const networkResponse = await fetch(request);
if (networkResponse.ok) {
const cache = await caches.open(RUNTIME_CACHE);
cache.put(request, networkResponse.clone());
}
return networkResponse;
} catch (error) {
console.error('Cache first failed:', error);
return new Response('Offline', { status: 503 });
}
}
// 网络优先策略
async function networkFirst(request) {
try {
const networkResponse = await fetch(request);
if (networkResponse.ok) {
const cache = await caches.open(RUNTIME_CACHE);
cache.put(request, networkResponse.clone());
}
return networkResponse;
} catch (error) {
console.log('Network failed, trying cache:', error);
const cachedResponse = await caches.match(request);
if (cachedResponse) {
return cachedResponse;
}
return new Response('Offline', { status: 503 });
}
}
// Stale While Revalidate策略
async function staleWhileRevalidate(request) {
const cachedResponse = await caches.match(request);
const networkResponsePromise = fetch(request).then(response => {
if (response.ok) {
const cache = caches.open(RUNTIME_CACHE);
cache.then(c => c.put(request, response.clone()));
}
return response;
}).catch(() => null);
return cachedResponse || networkResponsePromise;
}
// 仅网络策略
async function networkOnly(request) {
return fetch(request);
}
// 仅缓存策略
async function cacheOnly(request) {
return caches.match(request);
}
// 后台同步
self.addEventListener('sync', event => {
console.log('Background sync:', event.tag);
if (event.tag === 'background-sync') {
event.waitUntil(doBackgroundSync());
}
});
// 执行后台同步
async function doBackgroundSync() {
try {
// 获取离线时存储的数据
const offlineData = await getOfflineData();
// 同步到服务器
for (const data of offlineData) {
await syncDataToServer(data);
}
// 清理已同步的数据
await clearSyncedData();
} catch (error) {
console.error('Background sync failed:', error);
}
}
// 推送通知
self.addEventListener('push', event => {
const options = {
body: event.data ? event.data.text() : 'New notification',
icon: '/icon-192x192.png',
badge: '/badge-72x72.png',
vibrate: [100, 50, 100],
data: {
dateOfArrival: Date.now(),
primaryKey: 1
},
actions: [
{
action: 'explore',
title: 'Explore',
icon: '/images/checkmark.png'
},
{
action: 'close',
title: 'Close',
icon: '/images/xmark.png'
}
]
};
event.waitUntil(
self.registration.showNotification('App Notification', options)
);
});
// 通知点击处理
self.addEventListener('notificationclick', event => {
event.notification.close();
if (event.action === 'explore') {
event.waitUntil(
clients.openWindow('/')
);
}
});
// 消息处理
self.addEventListener('message', event => {
const { type, data } = event.data;
switch (type) {
case 'SKIP_WAITING':
self.skipWaiting();
break;
case 'GET_VERSION':
event.ports[0].postMessage({ version: '1.0.0' });
break;
case 'CLEAR_CACHE':
clearAllCaches().then(() => {
event.ports[0].postMessage({ success: true });
});
break;
}
});
// 清理所有缓存
async function clearAllCaches() {
const cacheNames = await caches.keys();
return Promise.all(
cacheNames.map(cacheName => caches.delete(cacheName))
);
}
// 获取离线数据(示例)
async function getOfflineData() {
// 从IndexedDB或其他存储获取离线数据
return [];
}
// 同步数据到服务器(示例)
async function syncDataToServer(data) {
return fetch('/api/sync', {
method: 'POST',
body: JSON.stringify(data),
headers: {
'Content-Type': 'application/json'
}
});
}
// 清理已同步的数据(示例)
async function clearSyncedData() {
// 清理已同步的离线数据
}
`;
}
// 设置消息处理
setupMessageHandling() {
navigator.serviceWorker.addEventListener('message', event => {
console.log('Message from Service Worker:', event.data);
});
}
// 设置更新处理
setupUpdateHandling() {
if (this.registration) {
this.registration.addEventListener('updatefound', () => {
const newWorker = this.registration.installing;
newWorker.addEventListener('statechange', () => {
if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {
// 新版本可用
this.showUpdateNotification();
}
});
});
}
}
// 显示更新通知
showUpdateNotification() {
if (confirm('New version available! Reload to update?')) {
this.skipWaiting();
}
}
// 跳过等待,立即激活新版本
async skipWaiting() {
if (this.registration && this.registration.waiting) {
this.registration.waiting.postMessage({ type: 'SKIP_WAITING' });
window.location.reload();
}
}
// 注册后台同步
async registerBackgroundSync(tag) {
if (this.registration && 'sync' in this.registration) {
try {
await this.registration.sync.register(tag);
console.log('Background sync registered:', tag);
} catch (error) {
console.error('Background sync registration failed:', error);
}
}
}
// 清理缓存
async clearCache() {
if (navigator.serviceWorker.controller) {
const messageChannel = new MessageChannel();
return new Promise((resolve) => {
messageChannel.port1.onmessage = (event) => {
resolve(event.data);
};
navigator.serviceWorker.controller.postMessage(
{ type: 'CLEAR_CACHE' },
[messageChannel.port2]
);
});
}
}
// 获取Service Worker版本
async getVersion() {
if (navigator.serviceWorker.controller) {
const messageChannel = new MessageChannel();
return new Promise((resolve) => {
messageChannel.port1.onmessage = (event) => {
resolve(event.data.version);
};
navigator.serviceWorker.controller.postMessage(
{ type: 'GET_VERSION' },
[messageChannel.port2]
);
});
}
}
// 获取缓存统计
async getCacheStats() {
if ('caches' in window) {
const cacheNames = await caches.keys();
const stats = {};
for (const cacheName of cacheNames) {
const cache = await caches.open(cacheName);
const keys = await cache.keys();
stats[cacheName] = keys.length;
}
return stats;
}
return {};
}
// 卸载Service Worker
async unregister() {
if (this.registration) {
const result = await this.registration.unregister();
console.log('Service Worker unregistered:', result);
return result;
}
return false;
}
}
// 使用示例
const swManager = new AdvancedServiceWorkerManager();
// 注册后台同步
document.getElementById('sync-button')?.addEventListener('click', () => {
swManager.registerBackgroundSync('background-sync');
});
// 清理缓存
document.getElementById('clear-cache-button')?.addEventListener('click', async () => {
const result = await swManager.clearCache();
console.log('Cache cleared:', result);
});
// 获取缓存统计
document.getElementById('cache-stats-button')?.addEventListener('click', async () => {
const stats = await swManager.getCacheStats();
console.log('Cache stats:', stats);
});Service Workers的核心功能:
💼 应用场景:Service Workers是构建PWA应用的核心技术,可以让Web应用具备类似原生应用的离线功能和推送通知能力。
通过本节JavaScript现代性能技术完整指南的学习,你已经掌握:
A: Web Workers适用于CPU密集型计算、大数据处理、图像处理等不需要直接操作DOM的场景。限制包括:不能直接访问DOM、不能访问某些Web API、数据传输有序列化开销。
A: Service Workers主要用于网络代理、缓存管理、离线功能;Web Workers用于后台计算。Service Workers有更长的生命周期,可以在页面关闭后继续运行。
A: 可以通过error事件监听Worker错误,实现错误重试机制,使用try-catch包装Worker代码,建立错误上报和监控系统。
A: Shared Array Buffer因为Spectre漏洞被限制使用,需要设置特定的HTTP头部(COOP和COEP)才能启用。使用时需要注意数据竞争和同步问题。
A: 根据资源类型选择:静态资源用Cache First,API数据用Network First,HTML页面用Stale While Revalidate。需要考虑数据时效性和用户体验。
// 问题:Worker间数据传输性能问题
// 解决:使用Transferable Objects
class OptimizedWorkerCommunication {
static transferLargeData(worker, data) {
// 使用Transferable Objects避免数据复制
if (data instanceof ArrayBuffer) {
worker.postMessage({ data }, [data]);
} else {
// 转换为ArrayBuffer
const buffer = new ArrayBuffer(data.length * 4);
const view = new Float32Array(buffer);
view.set(data);
worker.postMessage({ buffer }, [buffer]);
}
}
}// 问题:Service Worker更新不及时
// 解决:实现强制更新机制
class ServiceWorkerUpdater {
constructor() {
this.registration = null;
this.refreshing = false;
}
async checkForUpdates() {
if (this.registration) {
await this.registration.update();
}
}
setupAutoUpdate() {
// 每小时检查更新
setInterval(() => {
this.checkForUpdates();
}, 3600000);
// 页面可见时检查更新
document.addEventListener('visibilitychange', () => {
if (!document.hidden) {
this.checkForUpdates();
}
});
}
}"掌握现代性能技术,让你的Web应用拥有原生应用般的性能和功能。每一次技术升级,都是对用户体验的革命性提升!"