网站首页 > 技术文章 正文
大家好,很高兴又见面了,我是"高级前端?进阶?",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。
WinterCG(Winter Community Group specification):旨在为 JavaScript 运行时提供一个在 API 互操作性方面进行协作的空间,专注于记录和改进跨运行时(非浏览器)的 Web 平台 API 的互操作性。 本质上是通过运行时之间的讨论、WHATWG/W3C针对新 Web API 和当前 Web API 更改的提案以及现有运行时行为的文档来完成的。
1. 什么是 WinterJS
WinterJS is blazing-fast JavaScript server that runs Service Workers scripts according to the Winter Community Group specification.
WinterJS 是一个速度极快、与 WinterCG 兼容的 Javascript 运行时,由 Rust 编写,使用 SpiderMonkey 引擎执行 JavaScript,并使用 Tokio 处理底层 HTTP 请求和 JS 事件循环。 WinterJS 运行时也可以编译为 WebAssembly,因此是第一个完全可在 Wasmer Edge 中运行的生产级运行时。
以下是 WinterJS 1.0 的主要成就:
- 速度极快,比 Bun、WorkerD 和 Node 更快
- WinterJS 与 WinterCG 规范完全兼容
- Cloudflare API 兼容
- Web 框架支持:Next.js(支持RSC)、Hono、Astro、SvelteKit 等
目前 WinterJS 在 Github 通过 MIT 协议开源,短短时间内已经有 1.4k 的 star,是一个值得关注的前端开源项目。
2.WinterJS 有什么优势
2.1 非常快
WinterJS 1.0 在本机执行时能够每秒处理 150k 请求,使用 WASIX 编译为 Wasm 时每秒能够处理 20k 请求。
截至目前,WinterJS 每秒可以处理的请求数比 Bun:117k reqs/s、WorkerD:40k reqs/s 和 Node 75k reqs/s 更多。本地运行 WinterJS 非常简单,只需要以下几个命令即可:
cargo install --git https://github.com/wasmerio/winterjs winterjs
// 安装包
winterjs tests/simple.js
// 运行脚本,然后打开 https://localhost:8080/ 地址
2.2 与 WinterCG 兼容
自 WinterJS 首次发布以来增加了对 WinterCG 整套 API 的支持,包括:
- 数据获取能力:fetch, URL, Request, Response
- 文件处理:Blob, File
- 流支持:ReadableStream, WritableStream, TransformStream
- 文本编码:TextEncoder, TextEncoderStream, atob, btoa
- 加密:crypto
值得注意的是,转换流中的背压和一些(非常见)加密算法尚未实现。
2.3 Cloudflare API 兼容性
WinterJS 官方希望确保大多数前端框架都可以在 WinterJS 中运行, 因此有两个选择:
- 为每个前端框架创建一个新的集成
- 加入现有 WinterCG 提案
在对 Deno、Cloudflare 和 Fastly 的适配器进行深入分析后,意识到最强的选择是 Cloudflare,因为其已经获得了其他 API 框架的大部分支持,并且最常用。 因此,WinterJS 会继续推进 Cloudflare API 兼容性。
为了支持 Cloudflare Worker ,WinterJS 做了很多工作:
- 通过导入语法支持 ES 模块
- 支持 Node-js 兼容性 API
- 通过 _routes.json 支持调用路由
- 支持文件系统结构
_worker.js
index.html
mystaticimage.jpg
- 支持 Cloudflare 的 WinterCG 自定义 fetch API
export default {
async fetch(request, env, ctx) {
return new Response('Hello World!');
},
}
export default {
async fetch(request, env, context) {
// Forward / Proxy original request
let res = await fetch(request);
// 添加自定义头
res = new Response(res.body, res);
res.headers.set('x-foo', 'bar');
// 缓存响应
context.waitUntil(caches.default.put(request, res.clone()));
// waitUntil() 方法延长了 fetch 事件的生命周期
// 接受基于 Promise 的任务,Workers 运行时将在处理程序终止之前执行该任务
// 但不会阻止响应,从而非常适合缓存响应或处理日志记录。
// Done
return res;
},
};
2.4 与现有 Web 框架的兼容性
由于与 Cloudflare Workers API 的新兼容性,WinterJS 现在完全支持以下框架,不仅为框架生成的静态网站提供服务,还允许这些框架进行服务器端渲染 (SSR),包括:Next.js、Hono、Astro.build、Remix.run、Svelte、Gatsby、Nuxt等等
2.5 支持 React Server Component
WinterJS 最具挑战性的事情之一是运行具有服务器组件支持的 Next.js 服务器,此时渲染可以完全在服务器端完成。
'use client';
//客户端组件
'use server';
// 服务端组件
让 React Server Component 能正常工作的时候也让 WinterJS 发现了 Stream 实现与规范有一些微小的差异,同时还发现了 fetch 实现的一些怪癖。
最终一切问题都得到解决,因此将 Next.js 前端从 Vercel 迁移到 Wasmer Edge 成本更低,而且可复用。
参考资料
https://wasmer.io/posts/winterjs-v1
https://wintercg.org/
https://developers.cloudflare.com/workers/runtime-apis/handlers/fetch/
https://www.reddit.com/r/programming/comments/17m6770/how_fast_is_winterjs/
猜你喜欢
- 2024-10-24 Service Workers - JS API 简介(servicedescriptor)
- 2024-10-24 web性能优化的15条实用技巧(web应用性能优化思路)
- 2024-10-24 如何在 Service Worker 重新启动时重用信息
- 2024-10-24 Python在selenium里面注入JavaScript程序的方法
- 2024-10-24 requireJS 实战(requirejs define)
- 2024-10-24 面试妥了!2020 爬虫面试题目合集(爬虫面试经历)
- 2024-10-24 Nest.js 从零到壹系列(一):项目创建&路由设置&模块
- 2024-10-24 JS小知识,分享 7 个高频的工具函数,也许你用的上
- 2024-10-24 如何使用Playwright优化测试性能(play—player)
- 2024-10-24 JavaScript开发人员都应知道的异步迭代,你会了吗?
- 11-26Win7\8\10下一条cmd命令可查得笔记本电脑连接过的Wifi密码
- 11-26一文搞懂MySQL行锁、表锁、间隙锁详解
- 11-26电脑的wifi密码忘记了?一招教你如何找回密码,简单明了,快收藏
- 11-26代码解决忘记密码问题 教你用CMD命令查看所有连接过的WIFI密码
- 11-26CMD命令提示符能干嘛?这些功能你都知道吗?
- 11-26性能测试之慢sql分析
- 11-26论渗透信息收集的重要性
- 11-26如何查看电脑连接过的所有WiFi密码
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)