Rust frontend framework, for web browser and more.
squark
Rust frontend framework, for web browser and more.
Github星跟蹤圖
主要指標
- 概覽
-
名稱與所有者 rail44/squark 主編程語言 Rust 編程語言 Rust (語言數: 1) 平台 許可證 Do What The F*ck You Want To Public License - 所有者活动
-
創建於 2018-03-20 09:54:43 推送於 2023-01-14 00:14:39 最后一次提交 2020-06-19 19:10:00 發布數 0 - 用户参与
-
星數 174 關注者數 6 派生數 3 提交數 147 已啟用問題? 問題數 18 打開的問題數 10 拉請求數 36 打開的拉請求數 53 關閉的拉請求數 25 - 项目设置
-
已啟用Wiki? 已存檔? 是復刻? 已鎖定? 是鏡像? 是私有?
squark
Rust frontend framework, for web browser and more.
Currently, we depend on nightly
channel
Design
- Separating runtime definition and implemention
squark
crate has no dependency for specific platform
- Architecture inspired from Elm and HyperApp
- Simplicy
- Elegant
- Supporting futures-0.1
- reducer can emit task for async work such as fetch resource
crates
squark
Core crate.
- Pure Rust virtual DOM implemention
- Definition of GUI application
- Definition of runtime to handle diffirence of virtual DOM
squark-macros
It provides macro like JSX for helping writing view.
Very thanks to pest parser.
Syntax
view! {
<button class="some-class" onclick={, _, Some(Action::Submit) }>
Button!
</button>
}
We can generate native Rust expression at compile-time.
squark-web
Runtime implemention for web browser with usinng wasm-bindgen.
Here is full example of counter app!
#![feature(proc_macro_hygiene)]
extern crate squark;
extern crate squark_macros;
extern crate squark_web;
extern crate wasm_bindgen;
extern crate web_sys;
use squark::{App, Runtime, View, Task};
use squark_macros::view;
use squark_web::WebRuntime;
use wasm_bindgen::prelude::*;
use web_sys::window;
#[derive(Clone, Debug, PartialEq)]
struct State {
count: isize,
}
impl State {
pub fn new() -> State {
State { count: 0 }
}
}
#[derive(Clone, Debug)]
enum Action {
ChangeCount(isize),
}
#[derive(Clone, Debug)]
struct CounterApp;
impl App for CounterApp {
type State = State;
type Action = Action;
fn reducer(&self, mut state: State, action: Action) -> (State, Task<Action>) {
match action {
Action::ChangeCount(c) => {
state.count = c;
}
};
(state, Task::empty())
}
fn view(&self, state: State) -> View<Action> {
let count = state.count;
view! {
<div>
{ count.to_string() }
<button onclick={ move, _, Some(Action::ChangeCount(count.clone() + 1)) }>
increment
</button>
<button onclick={ move, _, Some(Action::ChangeCount(count - 1)) }>
decrement
</button>
</div>
}
}
}
impl Default for CounterApp {
fn default() -> CounterApp {
CounterApp
}
}
#[wasm_bindgen]
pub fn run() {
WebRuntime::<CounterApp>::new(
window()
.unwrap()
.document()
.expect("Failed to get document")
.query_selector("body")
.unwrap()
.unwrap(),
State::new(),
)
.run();
}
Project dir is located at examples/counter.
There are some other examples available on examples, most of them use rust-webpack-template.
TodoMVC is working on https://rail44.github.io/squark/.