Presented at Rust LT #8 https://rust.connpass.com/event/160225/
Monolith Λ Wasm ʹҠ২ͯ͠ Chrome ֦ுͭͬͨ͘at Rust LT #8 (2020/1/27)@Linda_pp@rhysd
View Slide
monolithhttps://github.com/Y2Z/monolith
monolith• ࢦఆͨ͠ URL ͷϖʔδΛ1ͭͷ HTML ϖʔδͱͯ͠อଘ͢Δ CLI πʔϧ• ϨεϙϯγϒͳϖʔδͳͲී௨ͷΣϒϖʔδͱͯͦ͠ͷ··ϩʔΧϧʹอଘͰ͖Δ• HTML ϖʔδΛύʔε͠ɼϦιʔεΛऔ͖ͬͯͯData URL ͱͯ͠ຒΊࠐΉ͜ͱͰ࣮͞Ε͍ͯΔ
monolith-of-webhttps://github.com/rhysd/monolith-of-web
monolith-of-web• monolith Λ wasm ʹҠ২͠ɼChrome ֦ுͱͯ͠ϒϥβ͔Β͑ΔΑ͏ʹͨ͠ͷ• ϒϥζ͍ͯ͠Δϖʔδͷ HTML Λͦͷ··୯Ұͷ HTML ϖʔδʹͯ͠อଘͰ͖Δ
σϞ
:;NPOPMJUISIZTENPOPMJUINPOPMJUIOQNQBDLBHFNPOPMJUIPGXFCCBDLHSPVOEQBHFGPSLXBTNQBDLJOTUBOUJBUF
େ·͔ͳ wasm ͷҠ২ͷखॱ• wasm-pack buid ͕௨ΔΑ͏ʹ͢Δɽwasm ະରԠͷϞδϡʔϧ͕͋Δ߹#[cfg(target_arch = "wasm32")] ͰॲཧΛ͚Δ• wasm-bindgen Λ͍ɼ#[wasm_bindgen] Ͱ JS ଆʹݟͤΔAPI Λఆٛ͢Δ#[cfg(not(target_arch = "wasm32"))]use reqwest::blocking::Client;#[wasm_bindgen(js_name = monolithOfUrl)]pub async fn monolith_of_url(url_target: String,options: MonolithOptions,) -> Result {// ...}
network ϦΫΤετ• monolith Ϧιʔεͷ fetch ͷͨΊʹ reqwest ͷϒϩοΩϯά API Λ͍ͬͯΔ• JavaScript ͷ fetch() ͱ async-await Λͬͯॻ͖͑• js_sys::Promise std::future::Future ͷม؆୯ʹͰ͖Δuse wasm_bindgen_futures::JsFuture;let window = web_sys::window().unwrap();let resp_value = JsFuture::from(window.fetch_with_request(&request)).await?;let resp: Response = resp_value.dyn_into().unwrap();
࠶ؼؔͷ async-await Խ• ࠶ؼؔ await ࣌ʹอଘ͓ͯ͘͠ঢ়ଶͷαΠζ͕੩తʹܾ·Βͳ͍ͷͰɼasync ؔʹͰ͖ͳ͍ɽ• monolith Ͱ DOM Λ࠶ؼతʹࠪ͠ͳ͕ΒϦιʔεΛfetch ͍ͯͨ͠ͷͰɼ͜ͷΛ౿ΜͰ͍ͨ// ίϯύΠϧΤϥʔasync fn recursive() {recursive().await;recursive().await;}
࠶ؼؔͷ async-await Խ• ঢ়ଶʢFutureʣΛ Box ʹೖΕͯಈతʹཧ͢Δ͜ͱͰճආͰ͖Δuse std::pin::Pin;use std::future::Future;fn recursive<'a>() -> Pin + 'a>> {Box::pin(async move {recursive().await;recursive().await;})}
·ͱΊ• Rust ͷ CLI πʔϧ monolith Λ wasm ʹҠ২ͯ͠ Chrome ֦ுʹͯ͠Έͨ• https://github.com/rhysd/monolith-of-web• async-await wasm Ͱwasm_bindgen_futures Ͱ؆୯ʹ͑Δ@Linda_pp@rhysdpresented by