談談WebAssembly、PWA、Web Workers的作用和場景

WebAssemblyPWAWeb Workers 是現代 Web 開發中提升性能、擴展能力的重要技術,各自解決不同場景的問題,以下結合實際使用經驗分析:

一、WebAssembly(Wasm):高性能代碼執行

作用:

WebAssembly 是一種低級二進制指令格式,可作為高級語言(C/C++、Rust 等)的編譯目標,在瀏覽器中以接近原生的速度運行,彌補 JavaScript 性能短板。

核心優勢:

  1. 執行速度快(比 JavaScript 快 10-100 倍),適合計算密集型任務;
  2. 與 JavaScript 無縫交互,可漸進式集成到現有項目。

使用場景:

1.圖形 / 圖像處理(如視頻編輯、3D 渲染);
2.科學計算(數據分析、物理模擬);
3.密碼學算法(加密解密、哈希計算);
4.游戲引擎核心邏輯。

使用方法:

1.用 Rust/C++ 編寫核心邏輯,編譯為 .wasm 二進制文件;
2.在 JavaScript 中加載并實例化 Wasm 模塊,調用其導出的函數。

示例(Rust + JavaScript):

lib.rs

// Rust代碼:計算斐波那契數列(計算密集型任務)
use wasm_bindgen::prelude::*;#[wasm_bindgen]
pub fn fibonacci(n: u32) -> u32 {match n {0 => 0,1 => 1,_ => fibonacci(n - 1) + fibonacci(n - 2)}
}

app.js

// 編譯Rust為Wasm后,在JS中使用
async function run() {// 加載Wasm模塊const wasm = await import('./fibonacci.wasm');// 調用Wasm函數(比JS實現快10倍以上)console.time('wasm-fib');const result = wasm.fibonacci(40); // 計算第40項console.timeEnd('wasm-fib'); // 約10msconsole.log('結果:', result);
}run();

二、PWA(漸進式 Web 應用):增強 Web 應用體驗

作用:

PWA 是一組技術組合(Service Worker、Manifest、Cache API 等),讓 Web 應用具備類似原生 App 的特性:離線運行、桌面圖標、推送通知等,同時保持 Web 的跨平臺優勢。

核心優勢:

  1. 離線可用(通過 Service Worker 緩存資源);
  2. 可安裝到桌面,減少用戶跳轉成本;
  3. 推送通知能力,提升用戶留存。

使用場景:

1.新聞 / 博客類應用(離線閱讀文章);
2.電商應用(緩存商品信息,弱網下瀏覽);
3.工具類應用(如計算器、Todo 清單,需快速訪問);
4.內容型應用(視頻 / 音頻播放,支持后臺緩存)。

使用方法:

1.注冊 Service Worker 管理緩存和網絡請求;
2.配置 manifest.json 定義桌面圖標、啟動頁等;
3.利用 Cache API 緩存靜態資源和接口數據。

示例(核心配置):

app.js

// 在應用入口注冊Service Worker
if ('serviceWorker' in navigator) {window.addEventListener('load', () => {navigator.serviceWorker.register('/sw.js').then((reg) => console.log('SW注冊成功:', reg.scope)).catch((err) => console.log('SW注冊失敗:', err));});
}

manifest.json

{"name": "我的PWA應用","short_name": "PWA","start_url": "/","display": "standalone", // 類似原生應用的窗口模式"background_color": "#ffffff","theme_color": "#42b983","icons": [{"src": "logo-192x192.png","sizes": "192x192","type": "image/png"}]
}

sw.js

// 緩存名稱
const CACHE_NAME = 'my-pwa-cache-v1';
// 需要緩存的靜態資源
const ASSETS_TO_CACHE = ['/', '/index.html', '/styles.css', '/app.js', '/logo.png'];// 安裝階段:緩存資源
self.addEventListener('install', (event) => {event.waitUntil(caches.open(CACHE_NAME).then((cache) => cache.addAll(ASSETS_TO_CACHE)).then(() => self.skipWaiting()) // 立即激活新SW);
});// 激活階段:清理舊緩存
self.addEventListener('activate', (event) => {event.waitUntil(caches.keys().then((cacheNames) => {return Promise.all(cacheNames.filter(name => name !== CACHE_NAME).map(name => caches.delete(name)));}));
});// 攔截請求:優先返回緩存,無緩存則請求網絡
self.addEventListener('fetch', (event) => {event.respondWith(caches.match(event.request).then((response) => response || fetch(event.request)));
});

三、Web Workers:多線程并行處理

作用:

JavaScript 是單線程語言,Web Workers 允許創建后臺線程(工作線程),在不阻塞主線程的情況下執行耗時操作,避免頁面卡頓。

核心優勢:

  1. 主線程與工作線程并行,不阻塞 UI 渲染;
  2. 適合處理大數據計算、復雜邏輯,提升用戶體驗。

使用場景:

1.數據處理(如大量數據排序、過濾、格式轉換);
2.復雜表單驗證(多字段規則校驗);
3.實時數據處理(如股票行情計算、圖表渲染數據預處理);
4.后臺任務(如日志收集、數據同步)。

使用方法:

1.創建工作線程腳本(worker.js),定義消息處理邏輯;
2.主線程通過 new Worker() 創建實例,用 postMessage 發送數據;
3.工作線程處理后通過 postMessage 返回結果,主線程監聽 message 事件接收。

示例(數據排序):

main.js

// 生成100萬條隨機數據(模擬大數據)
const largeData = Array.from({ length: 1000000 }, () => Math.random() * 100000);// 創建工作線程
const sortWorker = new Worker('worker.js');// 發送數據到工作線程
console.time('sort');
sortWorker.postMessage(largeData);// 接收處理結果
sortWorker.addEventListener('message', (e) => {console.timeEnd('sort'); // 約500ms,且不阻塞UIconsole.log('排序完成,前10條:', e.data.slice(0, 10));// 終止工作線程sortWorker.terminate();
});

worker.js

// 監聽主線程消息
self.addEventListener('message', (e) => {const { data } = e;// 執行耗時排序(100萬條數據)const sortedData = data.sort((a, b) => a - b);// 向主線程發送結果self.postMessage(sortedData);
});

總結

WebAssembly:解決 JavaScript 性能瓶頸,適合計算密集型任務(如圖像處理、科學計算),需結合 Rust/C++ 開發;

PWA:提升 Web 應用的離線能力和用戶體驗,適合內容型、工具類應用,核心是 Service Worker 和緩存策略;

Web Workers:實現多線程并行,避免主線程阻塞,適合大數據處理、復雜邏輯計算,需注意線程間通信成本。

三者可結合使用(如 PWA 緩存 Wasm 模塊,Web Workers 中調用 Wasm 處理數據),進一步擴展 Web 應用的能力邊界。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917292.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917292.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917292.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

嵌入式第十八課!!數據結構篇入門及單向鏈表

在前幾章對C語言的學習中,我們學到了:基本的C語法和簡單算法面向過程的編程思想而在數據結構這一篇章,我們將要學習:常用的數據存儲結構算法面向對象的編程思想數據結構在正式開始學習之前,我們先來了解一下什么是數據…

win10任務欄出問題了,原來是wincompressbar導致的

問題描述兄弟們客戶說自己電腦現在有問題了,任務欄顯示的都不對,和之前的都不一樣,現在使用起來非常難受,我們來看一下,這到底是什么問題吧!到客戶現場,查看發現,客戶桌面系統最底下…

FFmpegHandler 功能解析,C語言程序化設計與C++面向對象設計的核心差異

FFmpegHandler 功能解析 本文件記錄了關于 FFmpegHandler 類中核心函數工作流程的詳細解釋。Q: FFmpeg逐幀解碼,FFmpegHandler::openVideo 和 FFmpegHandler::readAVFrame 這兩個函數都分別做了什么? A: 可以把整個過程想象成“準備播放一部電影”&#…

Codeforces Round 1039 (Div. 2) A-C

A. Recycling Center題目大意 給你n個垃圾袋,每個垃圾袋有一個重量 在每秒鐘,你可以選擇一個垃圾袋,如果他的重量小于等于c,那么你可以不花費硬幣丟掉它 當你丟掉一個垃圾袋后,其他垃圾袋在這一秒重量會翻倍 問最少花費…

【設計模式】 原則

單一職責原則 對于一個類而言,有且僅有一個引起他變化的原因或者說,一個類只負責一個職責 如果一個類承擔的職責過多,那么這些職責放在一起耦合度太高了,一個職責的變化可能會影響這個類其他職責的能力。 所以我們在做軟件設計的時…

windows11右鍵菜單新增項增加drawio文件,使用draw.io

目錄1.新建空白模板2.建立注冊表文件1.新建空白模板 這里我們的模板文件路徑為 D:\Software\drawio\template.drawio 2.建立注冊表文件 首先新建一個.txt文件,我這里取名為menulize.txt,然后將下面的內容復制到.txt文件中 Windows Registry Editor Ver…

解鎖網頁魔法:零基礎HTML通關秘籍

文章目錄**解鎖網頁魔法:零基礎HTML通關秘籍**HTML 基礎目標HTML 結構認識 HTML 標簽HTML 文件基本結構標簽層次結構快速生成代碼框架HTML 常見標簽注釋標簽注釋的原則標題標簽: h1-h6段落標簽: p換行標簽:br綜合案例: 展示博客超鏈接標簽: a表格標簽**基…

類似 Pixso 但更側重「網頁 / 軟件界面設計」「前后端可視化開發」的工具

從 GoView 的 Demo 功能來看,它主要聚焦于數據可視化大屏的低代碼搭建,更側重數據圖表配置和頁面布局,沒有類似 Pixso 的在線 UI 設計(如矢量繪圖、組件樣式精細化設計)功能,其核心是通過預設組件快速構建數…

MySQL--組從復制的詳解及功能演練

2.MySQL的組從復制 2.1 配置mastesr [rootmysqlaa ~]# vim /etc/my.cnf [mysqld] server-id10 datadir/data/mysql socket/data/mysql/mysql.sock default_authentication_pluginmysql_native_password log-binmysql-bin[rootmysqlaa ~]# /etc/init.d/mysqld restart# 進入數據…

JavaScript將String轉為base64 筆記250802

JavaScript將String轉為base64 筆記250802 在 JavaScript 中將字符串轉換為 Base64 編碼有多種方法,每種方法都有其適用場景。下面我將全面介紹這些方法,包括處理 ASCII 字符、Unicode 字符以及性能優化方案。 基礎方法:btoa() 基本用法&a…

Unity3D數學第四篇:射線與碰撞檢測(交互基礎篇)

Unity3D數學第一篇:向量與點、線、面(基礎篇) Unity3D數學第二篇:旋轉與歐拉角、四元數(核心變換篇) Unity3D數學第三篇:坐標系與變換矩陣(空間轉換篇) Unity3D數學第…

數據處理和統計分析——09 數據分組

1 聚合 1.1 簡介 在SQL中我們經常使用GROUP BY將某個字段,按不同的取值進行分組,在Pandas中也有groupby()函數;分組之后,每組都會有至少1條數據,將這些數據進一步處理返回單個值的過程就是聚合,比如分組之后…

【數據結構與算法】數據結構初階:排序內容加餐(一)——快速排序:三路劃分、自省排序

🔥個人主頁:艾莉絲努力練劍 ?專欄傳送門:《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題 🍉學習方向:C/C方向 ??人生格言:為天地立心,為生民立命,為…

MySqL(加餐)

范式第一范式數據庫表的每一列都是不可分割的原子數據項,而不能是集合,數組,對象等非原子數據。在關系型數據庫的設計中,滿足第一范式是對關系模式的基本要求。不滿足第一范式的數據庫就不能被稱為關系數據庫。第一范式實際上只要…

【redis】基于工業界技術分享的內容總結

Redis 實踐指南與核心概念 一、Java 中常用的 Redis 使用場景與實踐 緩存(Caching) 場景:熱點數據、頻繁訪問的數據,如商品詳情、用戶信息。通過緩存減少數據庫壓力,提高系統響應速度。 工業界實踐: 淘寶…

服務端之nestJS常用異常類及封裝自定義響應模塊

MENU前言常用異常類(由nestjs/common提供)示例自定義異常(可選)自定義響應模塊前言 在NestJS中,nestjs/common提供了大量的內置異常類,主要用于在控制器、服務等層拋出特定的HTTP錯誤響應。 常用異常類&…

數據鏈路層、NAT、代理服務、內網穿透

目錄 一. 以太網 以太網幀格式 二. MAC地址 三. MTU 四. ARP協議 五. NAT NAPT 六. 代理服務器 正向代理 反向代理 七. 內網穿透 八. 內網打洞 一. 以太網 ? "以太網" 不是一種具體的網絡, 而是一種技術標準; 既包含了數據鏈路層的內 容, 也包含了一些物理層…

Rust在CentOS 6上的移植

Rust已不支持Cent OS 6 rhel是Redhat 發布的Red Hat Enterprise Linux的簡稱,使用rhel源代碼編譯的CentOS,最新的版本是CentOS 7,于2024年停止支持。而更古老的CentOS 6,則在2020年就已經結束了。 而面對如此老舊的系統&#xf…

C++音視頻開發:基礎面試題

音視頻領域技術門檻高,學習資料稀缺,體系化書籍和開發工具有限,新手入門困難。音視頻開發涉及眾多任務:音頻(采集、編解碼、降噪等)、視頻(采集、編解碼、圖像處理)、實時傳輸&#…

C++刷題 - 7.27

貪心算法的詳細邏輯這個問題的最優解可以用 貪心算法 在 O(N) 時間 內解決。它的核心思想是:每次操作盡可能覆蓋最長的連續非零區間,并通過數學分析發現:最小操作次數等于所有“上升臺階”的高度差之和。1. 直觀理解假設 steps [1, 2, 3, 2,…