ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

js-framework-benchmark 中的 yew-hooks:预编译分发与 Rust 源码重建构建全指南

js-framework-benchmark 中的 yew-hooks:预编译分发与 Rust 源码重建构建全指南 性能测试开发者工具【免费下载链接】js-framework-benchmarkA comparison of the performance of a few popular javascript frameworks项目地址https://gitcode.com/gh_mirrors/js/js-framework-benchmark点击查看免费下载导读本文围绕 js-framework-benchmark 仓库中frameworks/keyed/yew-hooks框架实现展开核心讲解该 Yew Hooks 基准测试示例“默认直接使用预编译产物、按需从 Rust 源码重新构建”的双轨分发方式。读完本文你将掌握 yew-hooks 基准示例的目录结构、预编译产物的加载链路index.html → wasm-bindgen 胶水 JS → WebAssembly 模块、以及从源码编译所需的 Rust 工具链、npm run build-prod-force命令背后完整的构建流水线rustup 目标添加、wasm-pack 安装、wasm-opt优化、产物整理与关键配置参数。一、先了解 yew-hooks 在仓库中的定位在 js-framework-benchmark 项目中yew-hooks位于 frameworks/keyed/yew-hooks属于keyed带 key 的列表更新基准分组。它使用 Yew 0.23.0 的客户端渲染CSR能力并借助use_reducer等 Hooks API 实现行数据的增删改查、选中、交换等典型基准操作。从 package.json 的js-framework-benchmark元数据可以看到该实现的登记信息字段值frameworkVersion0.23.0frameworkHomeURLhttps://yew.rs/languageRustrepoURLhttps://github.com/yewstack/yewissues1139该目录的完整结构如下相对仓库根目录frameworks/keyed/yew-hooks/ ├── bundled-dist/ # 预编译分发产物已提交到仓库 │ ├── index.html │ ├── js-framework-benchmark-yew-hooks.js # wasm-bindgen 生成的胶水 JS │ └── js-framework-benchmark-yew-hooks_bg.wasm # 编译后的 WebAssembly 模块 ├── src/ │ └── lib.rs # Rust 源码包含完整的基准应用实现 ├── Cargo.toml # Rust 依赖与发布优化配置 ├── index.html # 基准页面入口模板 ├── package.json # npm 脚本构建/重建入口 └── README.md # 构建说明二、预编译分发默认无需任何编译即可运行yew-hooks/README.md 开篇即说明了该示例的分发策略Because of the heavy amount of Rust dependencies, this example is pre-compiled, so you dont need to compile anything.由于 Rust 依赖链yew、wasm-bindgen、web-sys、rand、getrandom 等体积庞大、编译耗时仓库维护者将构建好的产物直接提交到仓库即bundled-dist/目录。因此直接运行本地基准测试时无需安装 Rust、无需编译也无需执行npm install构建脚本被设计为 no-op见下文。预编译产物如何被加载入口模板 index.html 展示了 wasm-bindgen 典型的模块化加载方式!DOCTYPE html html langen head meta charsetUTF-8 titleYew-Hooks/title link href/css/currentStyle.css relstylesheet/ base hrefbundled-dist//base /head body div idmain/div script typemodule import init from ./js-framework-benchmark-yew-hooks.js; init(./js-framework-benchmark-yew-hooks_bg.wasm); /script /body /html关键细节base hrefbundled-dist/将页面内所有相对路径的基准指向预编译目录通过script typemodule以 ES Module 方式导入js-framework-benchmark-yew-hooks.jswasm-bindgen 生成的胶水代码再调用init()异步加载同目录下的js-framework-benchmark-yew-hooks_bg.wasm应用挂载点为空div idmain/div对应 src/lib.rs 中start()函数里query_selector(#main)的挂载逻辑。以仓库内实际提交的产物为例可通过ls -la frameworks/keyed/yew-hooks/bundled-dist/查看bundled-dist/下包含index.html421 字节、胶水 JS约 27 KB和 wasm 二进制约 183 KB三者共同构成一个可直接由静态服务器托管的完整基准页面。三、从源码重建工具链与完整构建流水线如果你希望亲自从 Rust 源码编译README 指出只需要一个前置依赖Rust官方安装方式含rustup与cargo安装 Rust 后执行两条命令npm install npm run build-prod-forcebuild-prod-force背后的完整流水线package.json 中定义了三个 npm 脚本层层递进scripts: { build-prod: echo This is a no-op. echo Due to heavy dependencies, the generated javascript is already provided. echo If you really want to rebuild from source use: echo npm run build-prod-force, build-prod-force: rustup target add wasm32-unknown-unknown cargo install wasm-pack npx build-prod-without-tools-install, build-prod-without-tools-install: rimraf bundled-dist RUSTFLAGS--cfg getrandom_backend\wasm_js\ wasm-pack build --release --target web --no-typescript --out-name js-framework-benchmark-yew-hooks --out-dir bundled-dist cpr index.html bundled-dist/index.html (cd bundled-dist rimraf .gitignore README.md package.json) }1.build-prod默认的 no-op 脚本基准测试的标准构建命令npm run build-prod在此示例中故意不做任何编译只打印提示信息引导用户在有需要时改用build-prod-force。这正体现了“开箱即用”的分发哲学。2.build-prod-force一键搭建工具链该脚本按顺序完成步骤命令作用1rustup target add wasm32-unknown-unknown为 Rust 工具链添加 WebAssembly 编译目标2cargo install wasm-pack安装 wasm-pack用于把 Rust crate 打包为 npm/Web 可用产物3npx build-prod-without-tools-install调用第三个脚本执行真正的编译与产物整理3.build-prod-without-tools-install核心编译与整理该脚本在已具备工具链的前提下执行真正的构建分四步清理旧产物rimraf bundled-dist删除上一次构建的目录确保构建可重复wasm-pack 编译RUSTFLAGS--cfg getrandom_backendwasm_js wasm-pack build --release \ --target web --no-typescript \ --out-name js-framework-benchmark-yew-hooks \ --out-dir bundled-dist参数含义RUSTFLAGS--cfg getrandom_backendwasm_js为getrandomcrate 显式指定wasm_js后端与 Cargo.toml 中getrandom { version 0.3, features [wasm_js] }相呼应确保随机数在 WebAssembly 环境下可用--release按发布配置编译对应 Cargo.toml 的[profile.release]--target web生成浏览器可用的 ES Module 风格产物而非 npm 包格式--no-typescript不生成.d.ts类型声明文件--out-name js-framework-benchmark-yew-hooks统一产物命名前缀--out-dir bundled-dist输出到bundled-dist/。复制页面入口cpr index.html bundled-dist/index.html将根目录的index.html复制进产物目录使bundled-dist/成为可直接托管的完整站点清理多余文件进入bundled-dist后rimraf .gitignore README.md package.json删除 wasm-pack 自动生成但与基准无关的元文件。Cargo 侧的发布配置Cargo.toml 中与发布构建强相关的配置如下[lib] crate-type [cdylib] # 编译为 C 动态库 ABI供 wasm-bindgen 链接 [dependencies] rand { version 0.9, features [small_rng] } getrandom { version 0.3, features [wasm_js] } wasm-bindgen 0.2 web-sys { version 0.3, features [Window]} yew { version 0.23.0, features [csr] } [profile.release] lto true # 启用链接时优化缩小 wasm 体积 codegen-units 1 # 单代码生成单元便于更激进的优化 panic abort # panic 直接中止而非展开减小体积 [package.metadata.wasm-pack.profile.release] wasm-opt [-O4] # 使用 Binaryen 的 -O4 等级优化 wasm 产物这些配置共同服务于基准测试的“公平性”目标以接近生产环境的优化等级LTO、-O4wasm-opt编译从而反映 Yew 在该场景下的真实性能。四、源码级解读基准应用是如何实现的虽然本文主题是构建流程但了解 src/lib.rs 的实现能帮助你理解“为什么需要重新编译”以及构建产物的来源。数据模型与随机标签生成static ADJECTIVES: [str] [pretty, large, ...]; static COLOURS: [str] [red, yellow, ...]; static NOUNS: [str] [table, chair, ...]; struct RowData { id: usize, label: String }RowData::new从三组词表中各随机取一个词拼接成标签如pretty red table随机源是SmallRng来自 rand 0.9 的small_rngfeature由SmallRng::from_os_rng()播种。状态管理与 Hooks 用法应用通过use_reducer(AppState::default)获得状态AppState实现了 Yew 的Reducibletrait所有操作以AppStateAction枚举派发操作对应基准按钮行为Run(amount)Create 1,000 / 10,000 rows覆写并追加到amount行Add(amount)Append 1,000 rows末尾追加amount行Update(step)Update every 10th row每隔step行追加 !!!ClearClear清空所有行SwapSwap Rows交换第 1 行与第 998 行Remove(id)行内删除按钮按 id 移除行Select(id)行内选择记录选中行 id组件划分与挂载App顶层函数组件持有状态并渲染Jumbotron与表格Jumbotron操作按钮区通过Callbackreform把点击事件映射为对应AppStateActionRow单行组件接收key{id}、selected状态及选择/删除回调start()以#[wasm_bindgen(start)]标注作为 wasm 模块启动入口查找#main元素并调用yew::Renderer::App::with_root(mount_el).render()完成挂载。五、适用前提与常见问题前提一无需编译的运行场景仓库已提交预编译产物直接通过静态服务器如仓库根目录的startLocalServerAndUpdateBuild.sh启动的本地服务托管即可运行基准此场景下npm install与npm run build-prod都是可跳过的后者本身是 no-op。前提二从源码重建场景需要本机已安装 Rust 工具链build-prod-force会自动补装wasm32-unknown-unknown目标与 wasm-pack但要求网络可访问 crates.io 与 npm registry。编译时间Rust 依赖链庞大wasm-pack build --release首次编译耗时明显这正是仓库选择预编译分发的直接原因。产物差异若你修改了 src/lib.rs 后重建bundled-dist/会被整体清空并重新生成请勿混用新旧产物。六、结语与延伸阅读yew-hooks 基准示例展示了 js-framework-benchmark 对“重依赖框架”的一种工程化处理默认提交预编译产物保证开箱即用同时保留一条完整的源码重建路径供复现与二次开发。理解这条双轨分发机制你既能快速本地运行该基准也能在需要时基于 Rust 源码重新编译、验证或修改实现。可以继续深入阅读仓库内的相关文件构建说明frameworks/keyed/yew-hooks/README.mdnpm 脚本与元数据frameworks/keyed/yew-hooks/package.jsonRust 依赖与优化配置frameworks/keyed/yew-hooks/Cargo.toml基准应用源码frameworks/keyed/yew-hooks/src/lib.rs页面入口模板frameworks/keyed/yew-hooks/index.html同构实现参考无 Hooks 版本的 Yew 基准见 frameworks/keyed/yew构建脚本结构一致赞分享性能测试开发者工具【免费下载链接】js-framework-benchmarkA comparison of the performance of a few popular javascript frameworks项目地址https://gitcode.com/gh_mirrors/js/js-framework-benchmark点击查看免费下载相关推荐mogwaiRust WebAssembly在 js-framework-benchmark 中的预编译构建与本地重建指南mogwaiRust WebAssembly在 js framework benchmark 中的预编译构建与本地重建指南 mogwai 是一款基于 R性能测试开发者工具从预编译到源码重建js-framework-benchmark 中 DominatorRust/WASM基准实现的构建与源码剖析从预编译到源码重建js framework benchmark 中 DominatorRust/WASM基准实现的构建与源码剖析 本篇指南围绕 frame性能测试开发者工具Ravel 基准测试js-framework-benchmark预编译产物与 Rust/WASM 源码重建指南Ravel 基准测试js framework benchmark预编译产物与 Rust/WASM 源码重建指南 本篇技术指南围绕 js framework性能测试开发者工具上一篇告别重复造轮子FlutterUnit数据库访问层设计与实战指南下一篇Nebula安全组基于角色的网络访问控制实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表