7

GitHub - DioxusLabs/dioxus: Elegant React-like library for building user interfa...

 2 years ago
source link: https://github.com/DioxusLabs/dioxus
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

last_quarter_moonrocket Dioxus

Frontend that scales.

Dioxus is a portable, performant, and ergonomic framework for building cross-platform user interfaces in Rust.

fn app(cx: Scope) -> Element {
    let mut count = use_state(&cx, || 0);

    cx.render(rsx!(
        h1 { "High-Five counter: {count}" }
        button { onclick: move |_| count += 1, "Up high!" }
        button { onclick: move |_| count -= 1, "Down low!" }
    ))
}

Dioxus can be used to deliver webapps, desktop apps, static sites, liveview apps, mobile apps (WIP), and more. At its core, Dioxus is entirely renderer agnostic and has great documentation for creating new renderers for any platform.

If you know React, then you already know Dioxus.

Unique features:

  • Desktop apps running natively (no Electron!) in less than 10 lines of code.
  • Incredibly ergonomic and powerful state management.
  • Comprehensive inline documentation - hover and guides for all HTML elements, listeners, and events.
  • Extremely memory efficient - 0 global allocations for steady-state components.
  • Multi-channel asynchronous scheduler for first-class async support.
  • And more! Read the full release post here.

Examples

All examples in this repo are desktop apps. To run an example, simply clone this repo and use cargo with the desktop feature enabled. For SSR examples, you might need to enable SSR instead.

cargo run --features desktop --example EXAMPLE

Get Started with...

Example Projects:

File Navigator (Desktop) WiFi scanner (Desktop) TodoMVC (All platforms) E-commerce w/ Tailwind (SSR/LiveView)

See the awesome-dioxus page for a curated list of content in the Dioxus Ecosystem.

Why Dioxus and why Rust?

TypeScript is a fantastic addition to JavaScript, but it's still fundamentally JavaScript. TS code runs slightly slower, has tons of configuration options, and not every package is properly typed.

In contrast, Dioxus is written in Rust - which is almost like "TypeScript on steroids".

By using Rust, we gain:

  • Static types for every library
  • Immutability by default
  • A simple and intuitive module system
  • Integrated documentation (go to source actually goes to source)
  • Advanced pattern matching
  • Clean, efficient, composable iterators
  • Inline built-in unit/integration testing
  • Best-in-class error handling
  • Powerful and sane standard library
  • Flexible macro system
  • Access to crates.io

Specifically, Dioxus provides us many other assurances:

  • Proper use of immutable datastructures
  • Guaranteed error handling (so you can sleep easy at night not worrying about cannot read property of undefined)
  • Native performance on mobile
  • Direct access to system IO

And much more. Dioxus makes Rust apps just as fast to write as React apps, but affords more robustness, giving your frontend team greater confidence in making big changes in shorter time.

Why NOT Dioxus?

You shouldn't use Dioxus if:

  • You don't like the React Hooks approach to frontend
  • You need a no-std renderer
  • You want to support browsers where Wasm or asm.js are not supported.
  • You need a Send+Sync UI solution (Dioxus is not currently ThreadSafe)

Comparison with other Rust UI frameworks

Dioxus primarily emphasizes developer experience and familiarity with React principles.

  • Yew: prefers the elm pattern instead of React-hooks, no borrowed props, no SSR.
  • Percy: Supports SSR but less emphasis on state management and event handling.
  • Sycamore: VDOM-less using fine-grained reactivity, but lacking in ergonomics.
  • Dominator: Signal-based zero-cost alternative, less emphasis on community and docs.

Parity with React

Dioxus is heavily inspired by React, but we want your transition to feel like an upgrade. Dioxus is most of the way there, but missing a few key features. This parity table does not necessarily include important ecosystem crates like code blocks, markdown, resizing hooks, etc.

Feature Dioxus React Notes for Dioxus

Conditional Rendering white_check_markwhite_check_mark if/then to hide/show component

Map, Iterator white_check_markwhite_check_mark map/filter/reduce to produce rsx!

Keyed Components white_check_markwhite_check_mark advanced diffing with keys

Web white_check_markwhite_check_mark renderer for web browser

Desktop (webview) white_check_markwhite_check_mark renderer for desktop

Shared State (Context) white_check_markwhite_check_mark share state through the tree

Hooks white_check_markwhite_check_mark memory cells in components

SSR white_check_markwhite_check_mark render directly to string

Component Children white_check_markwhite_check_mark cx.children() as a list of nodes

Headless components white_check_markwhite_check_mark components that don't return real elements

Fragments white_check_markwhite_check_mark multiple elements without a real root

Manual Props white_check_markwhite_check_mark Manually pass in props with spread syntax

Controlled Inputs white_check_markwhite_check_mark stateful wrappers around inputs

CSS/Inline Styles white_check_markwhite_check_mark syntax for inline styles/attribute groups

Custom elements white_check_markwhite_check_mark Define new element primitives

Suspense white_check_markwhite_check_mark schedule future render from future/promise

Integrated error handling white_check_markwhite_check_mark Gracefully handle errors with ? syntax

NodeRef white_check_markwhite_check_mark gain direct access to nodes

Re-hydration white_check_markwhite_check_mark Pre-render to HTML to speed up first contentful paint

Jank-Free Rendering white_check_markwhite_check_mark Large diffs are segmented across frames for silky-smooth transitions

Effects white_check_markwhite_check_mark Run effects after a component has been committed to render

Portals hammer_and_wrenchwhite_check_mark Render nodes outside of the traditional tree structure

Cooperative Scheduling hammer_and_wrenchwhite_check_mark Prioritize important events over non-important events

Server Components hammer_and_wrenchwhite_check_mark Hybrid components for SPA and Server

Bundle Splitting eyeswhite_check_mark Efficiently and asynchronously load the app

Lazy Components eyeswhite_check_mark Dynamically load the new components as the page is loaded

1st class global state white_check_markwhite_check_mark redux/recoil/mobx on top of context

Runs natively white_check_markquestion runs as a portable binary w/o a runtime (Node)

Subtree Memoization white_check_markquestion skip diffing static element subtrees

High-efficiency templates hammer_and_wrenchquestion rsx! calls are translated to templates on the DOM's side

Compile-time correct white_check_markquestion Throw errors on invalid template layouts

Heuristic Engine white_check_markquestion track component memory usage to minimize future allocations

Fine-grained reactivity eyesquestion Skip diffing for fine-grain updates

  • white_check_mark = implemented and working
  • hammer_and_wrench = actively being worked on
  • eyes = not yet implemented or being worked on
  • question = not sure if will or can implement

License

This project is licensed under the MIT license.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Dioxus by you, shall be licensed as MIT, without any additional terms or conditions.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK