Rustã§ã¯ã©ã¤ã¢ã³ããµã¤ãWebãã¬ã¼ã ã¯ã¼ã¯ãä½ã£ã¦ããã
ã¢ã¡ãã¤ã§ãã
å æ¥ãä¼ç¤¾ã§ãã£ã¦ããããããã£ã¹ããajitofmã«åºæ¼ãã¾ããã (ããã¾ãåããªãã£ããã©)
id: mizchiãããã²ã¹ãã«æãã¦ã®åé²ã§ããï¼åé²ä¸ãããã®ãã¨ã®ajitingãè²ã ãªè©±ãèãã¦æ¥½ããã£ãã§ãã
ã§ãä»åã®è©±ãªã®ã§ãããåé²ä¸ã® Rustã®ãããªè¨èªã§UIãè¨è¿°ããã®ã¯é£ãã
ã¨ããmizchiããã®çºè¨ã«å¯¾ãããã®ã¿ã¤ãã³ã°ã§ã¯é¦è¯ãã¦ãã¾ã£ããã®ã®å¾ã«ãªã£ã¦ãæ¬å½ã«ããããï¼ã¨ããæ°æã¡ã«ãªã£ããããèªåã§ä½ã£ã¦ãã¾ãã
TodoMVC ã¬ãã«ã®ç©ãä¸å¿åãããã«ãªã£ãã®ã§ããã°ãæ¸ãã¾ããã
ã¢ããªã±ã¼ã·ã§ã³ã³ã¼ãã®ä¾
ãã¨ãã°åç´ãªã«ã¦ã³ã¿ã¼ã¯ãããªãã«ãªãã
#![feature(proc_macro)] extern crate squark; extern crate squark_macros; extern crate squark_stdweb; extern crate stdweb; use stdweb::traits::*; use stdweb::web::document; use squark::{App, Runtime, View}; use squark_stdweb::StdwebRuntime; use squark_macros::view; #[derive(Clone, Debug, PartialEq)] struct State { count: isize, } impl State { pub fn new() -> State { State { count: 0 } } } #[derive(Clone, Debug)] enum Action { Increment, Decrement, } #[derive(Clone, Debug)] struct CounterApp; impl App for CounterApp { type State = State; type Action = Action; fn reducer(mut state: State, action: Action) -> State { match action { Action::Increment => { state.count += 1; } Action::Decrement => { state.count -= 1; } }; state } fn view(state: State) -> View<Action> { let count = state.count.clone(); view! { <div> { count.to_string() } <button onclick={ |_| Some(Action::Increment) }> increment </button> <button onclick={ |_| Some(Action::Decrement) }> decrement </button> </div> } } } fn main() { stdweb::initialize(); StdwebRuntime::<CounterApp>::new( document().query_selector("body").unwrap().unwrap(), State::new(), ).run(); stdweb::event_loop(); }
ãããWebãã©ã¦ã¶ã§WebAssemblyã§åãã®ãå²ã¨ã¯ã¯ã¯ã¯ãã¾ãããã
ããã¡ãã£ã¨è¤éãªãä¸ã«è²¼ã£ãTodoMVCã®ä¾ã¯ããã«ããã¾ãã
ä½ã£ããã®
ãã¥ã¢Rustãªãã¼ãã£ã«DOMå®è£
ãã¼ãã£ã«DOMã®å®è£
ã¯å®DOMã®ç¥èãæã£ã¦ãã¾ããã
2ã¤ã®ãã¼ãã£ã«DOMãæ¯è¼ããã©ã®è¦ç´ ãå±æ§ã«ã©ããªæä½ãããã¹ããªã®ãããDiffã¨ãã¦å¾ãã ããä»äºã«ãªã£ã¦ãã¾ãã
ä¸ã®ä¾ã§ impl
ãã¦ãããAction-Reducer-State-Viewãæã¤Appã®trait
ElmãHyperAppãåèã«ããã¢ã¼ããã¯ãã£ã§ãã
Runtimeã®trait
Appã®ã©ã¤ããµã¤ã¯ã«ã管çãã¤ã¤ãå®éã«UIãæä½ãã層ã§ãã
ä»äºå
容ã¨ãã¦ã¯
Actionã®çºçæ¤ç¥ -> Reducerã¸ã®å¼ã渡ã -> Stateã®æ´æ° -> ãã¼ãã£ã«DOMã®æ´æ° -> Diffã®ãã³ããªã³ã°
ã§ãã
ãã ãããã®ã©ã³ã¿ã¤ã ãåæ§ã«ç¾å®ã®DOMã®ç¥èã¯æã£ã¦ããããWebãã©ã¦ã¶ã¸ã®ãã¤ã³ãã£ã³ã°ã¯ impl Runtime
ã¨ãã¦å¥éè¡ãè¨è¨ã«ãªã£ã¦ãã¾ãã
ããã¯ãRustã®WebAssemblyçéã®å¤åãéããç¹å®ã®ç°å¢ã«ä¾åãã¦ãã¾ãã¨é³è
åãããã¨ãæãã¦ã®ç©ã§ã(ä»åã§è¨ãã°å¾è¿°ããstdwebã¨cargo-web)
stdwebã使ã£ãRuntimeã®å®è£
stdwebã¯ãRustã使ã£ã¦ãã©ã¦ã¶APIãå¼ã³åºãããã®ãã¤ã³ãã£ã³ã°ã©ã¤ãã©ãªã§ãã
Diffã«å¿ãã¦ãç¾å®ã®DOMããªã¼ã¸ã©ã®ãããªæä½ãè¡ãããå®è£
ãã¦ãã¾ãã
JSX風ã®æ§æã®ããã®ããã¯ã
proc_macroã使ã£ããã¯ãã®å®ç¾©ã§ãJSX風ã®æ§æãã³ã³ãã¤ã«ã¿ã¤ã æã«Rustã®æ§æã¸ã¨å¤æãããã¨ãã§ãã¾ãã
ãããï¼ããã©ã³ã³ãã¤ã«é
ãï¼ï¼
ã¾ããJSX風ã®æ§æãã¼ãµã¼ã¯pest-parserã«ãã£ã¦ãããã¾ããã¤ãããã¯ã©ã¤ãã©ãªã®ã³ã³ãã¤ã«æã«çæãã¦ãã¾ãã ãããªæãã®pegãæ¸ãã¾ããã
課é¡ã¨ä»å¾
ã¨ããã¾ã§æ¸ããããã©å®ã¯ãããstableã¯ããããææ°ã®nightlyã§ããèµ°ããªãç¶æ
ã§ãã
åãææ°ã®nightly㯠nightly-2017-12-01
ã
ã¨ããã®ãã proc_macro
ã¾ããã«ã¬ã³ã¬ã³å¤æ´ãå
¥ã£ã¦ãã¦ããã¯ããä¸æ£ãªã³ã¼ããåãã¦ãã¾ãã¾ãã
ä¸çªçãã®ãâã§ãå¥å ¨ãã¯ããªã®ã§å¼ã³åºããã¹ã³ã¼ãã®ä½ãã«ã¢ã¯ã»ã¹ã§ããªãã®ã¯åãããã§ããããã¯ãä¸ã«å«ããèå¥åã«ãã¢ã¯ã»ã¹ã§ããªãç¶æ ã
ã¾ããç¾å¨ã®ã¨ãããå
¨ã¦ã®ãã¼ãã£ã«DOMããªã¼ã«åå¨ããå
¨ã¦ã®ãã³ãã©ãè¨å®ããªããDiffãåãã¦ãã¾ããããã©ã¼ãã³ã¹ãè¯ãããã¾ããã
ããã¯ããã³ãã©ã«è¨å®ããã¯ãã¼ã¸ã£ããã£ããã£ãã¦ããå¤ã®å¤åãæ¯è¼ã§ããã°ããã®ãã³ãã©ã®åä¸æ§ã確èªã§ããã¯ãã§ãæ¹æ³ã模索ãã¦ãã¾ãã
Appãã¬ã¤ãã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ã妥å½ãã©ãããè¬ãªã®ã§ããããæ¹åãå®ãã¦ããããã ç¹ã«ãreducerãviewã¯ä»ã®ã¨ããAssociated functionsã«ãªã£ã¦ã¾ããããã£ã¨è¤éãªãAPIãªã¯ã¨ã¹ãããããããªã¢ããªã±ã¼ã·ã§ã³ã ã¨ã¡ã½ããã«ããããªãã®ããªã¼ï¼ã®ãããªãã¨ãæã£ã¦ãã¾ãã ã¾ããreducerãstateãã©ãåãã¦ã©ãè¿ãã¹ããªã®ããããåãã£ã¦ããªã(&state -> state ãªã®ã state -> state ãªã®ã &mut state ãªã®ã)
ãã¨ã¯ãwasm-bindgenã¨ããjs-rustéã®ãã¤ã³ãã£ã³ã°ãã¼ã«ãè¯ããã§ããªãã ãã³ãã¥ããã£çã«ãã£ã¡ã主æµã«ãªããããªé°å²æ°ãªã®ã§ãWasmBindgenRuntimeãå®è£ ããããã¨ãã actix-webã使ã£ã¦ãµã¼ãã¼ãµã¤ãã¬ã³ããªã³ã°ãåºæ¥ãããã«ãããããªã¼ãã¨ãèãã¦ãã¾ãã
å¼ç¶ããã£ã¦ããããã