rust寫前端真香

語言: CN / TW / HK

最近在考慮給sealer 寫個雲產品,我們叫sealer cloud, 讓使用者線上就可以完成k8s叢集的自定義,分享,執行。

作為一個先進的系統,必須有高大上的前端技術才能配得上!為了把肌肉秀到極限,決定使用 rust+wasm實現。

這裡和傳統後端語言在後端渲染html返回給前端完全不一樣,是真正的把rust程式碼編譯成wasm執行在瀏覽器中

從此和js說拜拜,前後端都用rust寫

不得不佩服rust的牛逼,從核心作業系統一直寫到前端,效能還這麼牛逼。

yew框架

yew 就是一個rust的前端框架。通過一系列工具鏈把rust程式碼編譯成wasm執行在瀏覽器中。

建立一個app

cargo new yew-app

在Cargo.toml中配置如下資訊:

[package]
name = "yew-app"
version = "0.1.0"
edition = "2018"

[dependencies]
# you can check the latest version here: https://crates.io/crates/yew
yew = "0.18"

在src/main.rs中寫程式碼:

use yew::prelude::*;

enum Msg {
    AddOne,
}

struct Model {
    // `ComponentLink` is like a reference to a component.
    // It can be used to send messages to the component
    link: ComponentLink<Self>,
    value: i64,
}

impl Component for Model {
    type Message = Msg;
    type Properties = ();

    fn create(_props: Self::Properties, link: ComponentLink<Self>) -> Self {
        Self {
            link,
            value: 0,
        }
    }

    fn update(&mut self, msg: Self::Message) -> ShouldRender {
        match msg {
            Msg::AddOne => {
                self.value += 1;
                // the value has changed so we need to
                // re-render for it to appear on the page
                true
            }
        }
    }

    fn change(&mut self, _props: Self::Properties) -> ShouldRender {
        // Should only return "true" if new properties are different to
        // previously received properties.
        // This component has no properties so we will always return "false".
        false
    }

    fn view(&self) -> Html {
        html! {
            <div>
                <button onclick=self.link.callback(|_| Msg::AddOne)>{ "+1" }</button>
                <p>{ self.value }</p>
            </div>
        }
    }
}

fn main() {
    yew::start_app::<Model>();
}

這裡要注意的地方是callback函式會觸發update, 那update到底應該去做什麼由訊息決定。 Msg就是個訊息的列舉,根據不同的訊息做不同的事。

再寫個index.html:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>sealer cloud</title>
		<p>安裝k8s就選sealer</p>
  </head>
</html>

執行app

trunk是一個非常方便的wasm打包工具

cargo install trunk wasm-bindgen-cli
rustup target add wasm32-unknown-unknown
trunk serve

CSS

這個問題非常重要,我們肯定不希望我們寫的UI醜陋,我這裡整合的是 bulma

非常簡單,只需要在index.html中加入css:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Sealer Cloud</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/css/bulma.min.css">
  </head>
  <body>

  </body>
</html>

然後我們的html巨集裡面就可以直接使用了:

    fn view(&self) -> Html {
        html! {
            <div>
            <nav class="navbar is-primary">
            <div class="navbar-brand navbar-item">
                { "Sealer Cloud" }
            </div>
            </nav>
            <section class="section">
                <div class="container">
                <h1 class="title">
                    { "[sealer](https://github.com/alibaba/sealer) is greate!" }
                </h1>
                <a class="button is-dark">
                  { "Button" }
                </a>
                <p class="subtitle">
                    { "安裝k8s請用sealer, 打包叢集請用sealer, sealer實現分散式軟體Build&Share&Run!" } 
                </p>
                </div>
            </section>
            </div>
        }
    }

後續還會有路由使用,模組聚合,請求後臺等系列文章,敬請期待! kubernetes一鍵安裝

sealer叢集整體打包!