Стройте приложения браузера Frontend с Rust + Webassembly. Поддерживает рендеринг на стороне сервера.
Этот Readme дает легкое введение в Перси. Проверьте книгу Перси, чтобы пройтись.
Перси компилизируется на стабильной ржавчине с одним предостережением:
На ночной ржавчине вы можете создавать текстовые узлы без кавычек.
// Nightly Rust does not require quotes around text nodes.
html ! { <div> My text nodes here </div> } ;На стабильной ржавчине требуются кавычки.
// Stable Rust requires quotes around text nodes.
html ! { <div> { "My text nodes here " } </div> } ;Эта разница исчезнет после стабилизированного места пролета в компиляторе ржавчины - проблема отслеживания ржавчины.
Лучший способ встать на скорость - это проверить книгу Перси, но вот очень простой пример, чтобы промокнуть ноги.
Перси позволяет создавать приложения, которые имеют только рендеринг на стороне сервера, только рендеринг на стороне клиента или рендеринг на стороне сервера и клиента.
Вот быстрый и легкий рабочий пример рендеринга на стороне клиента, который вы можете попробовать прямо сейчас:
Во -первых, создайте новый проект, используя
cargo new client-side-web-app --lib
cd client-side-web-appДобавьте следующие файлы в ваш проект.
touch build.sh
touch index.html
touch app.cssВот структура каталогов:
.
├── Cargo.toml
├── build.sh
├── index.html
├── app.css
└── src
└── lib.rsТеперь отредактируйте каждый файл со следующим содержимым:
# contents of build.sh
#! /bin/bash
cd " $( dirname " $0 " ) "
mkdir -p public
cargo build --target wasm32-unknown-unknown
wasm-bindgen target/wasm32-unknown-unknown/debug/client_side_web_app.wasm --no-typescript --target web --out-dir ./public --debug
cp index.html public/
cp app.css public/ // contents of src/lib.rs
use wasm_bindgen :: prelude :: * ;
use web_sys ;
use percy_dom :: prelude :: * ;
# [ wasm_bindgen ]
struct App {
pdom : PercyDom
}
# [ wasm_bindgen ]
impl App {
# [ wasm_bindgen ( constructor ) ]
pub fn new ( ) -> App {
let start_view = html ! { <div> Hello </div> } ;
let window = web_sys :: window ( ) . unwrap ( ) ;
let document = window . document ( ) . unwrap ( ) ;
let body = document . body ( ) . unwrap ( ) ;
let mut pdom = PercyDom :: new_append_to_mount ( start_view , & body ) ;
let greetings = "Hello, World!" ;
let end_view = html ! {
// Use regular Rust comments within your html
<div class= [ "big" , "blue" ] >
/* Interpolate values using braces */
<strong> { greetings } </strong>
<button
class= "giant-button"
onclick=|_event| {
web_sys :: console :: log_1 ( & "Button Clicked!" . into ( ) ) ;
}
>
// No need to wrap text in quotation marks (:
Click me and check your console
</button>
</div>
} ;
pdom . update ( end_view ) ;
App { pdom }
}
} # contents of Cargo.toml
[ package ]
name = " client-side-web-app "
version = " 0.1.0 "
authors = [ " Friends of Percy " ]
edition = " 2018 "
[ lib ]
crate-type = [ " cdylib " ] # Don't forget this!
[ dependencies ]
wasm-bindgen = " 0.2 "
js-sys = " 0.3 "
percy-dom = " 0.9 "
[ dependencies . web-sys ]
version = " 0.3 "
features = [
" Document " ,
" MouseEvent " ,
" Window " ,
" console "
] <!-- contents of index.html -->
<!DOCTYPE html >
< html lang =" en " >
< head >
< meta charset =" UTF-8 " >
< meta name =" viewport " content =" width=device-width, initial-scale=1 " >
< link rel =" stylesheet " type =" text/css " href =" app.css " />
< title > Client Side Demo </ title >
</ head >
< body style =' margin: 0; padding: 0; width: 100%; height: 100%; ' >
< script type =" module " >
import init , { App } from '/client_side_web_app.js'
async function run ( ) {
await init ( '/client_side_web_app_bg.wasm' )
new App ( )
}
run ( )
</ script >
</ body >
</ html > /* contents of app.css */
. big {
font-size : 30 px ;
}
. blue {
color : blue;
}
. giant-button {
font-size : 24 px ;
font-weight : bold;
}Теперь беги
# Used to compile your Rust code to WebAssembly
cargo install wasm-bindgen-cli
# Or any other static file server that supports the application/wasm mime type
cargo install https
chmod +x ./build.sh
./build.sh
# Visit localhost:8080 in your browser
http ./public --port 8080И вы должны увидеть следующее:

Хорошая работа!
Изоморфное веб -приложение
Компоненты просмотра модульных тестирования
Откройте проблему или PR, если у вас есть идея для полезного примера!
Percy-Dom API Docs
HTML-MACRO API DOCS
Percy-Router API Docs
Всегда не стесняйтесь открывать проблемы и PR с любыми вопросами / мыслями, которые у вас есть!
Даже если это кажется простой или простой - если у вас есть вопрос, что вы не можете быстро ответить на себя, то это неудача в документации.
Гораздо больше информации о том, как внести свой вклад в кодовую базу, можно найти в разделе «Содействие» книги Перси!
Чтобы запустить все блок, интеграцию и браузер
./test.shГрань