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,…