Coder Social home page Coder Social logo

allenli178 / dioxus Goto Github PK

View Code? Open in Web Editor NEW

This project forked from dioxuslabs/dioxus

0.0 0.0 0.0 7.83 MB

Elegant React-like library for building user interfaces for desktop, web, mobile, SSR, liveview, and more.

Home Page: https://dioxuslabs.com

License: Other

Rust 97.74% HTML 0.05% RenderScript 0.43% JavaScript 1.78%

dioxus's Introduction

๐ŸŒ—๐Ÿš€ 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...

Tutorial Web Desktop SSR Mobile State

Example Projects:

File Navigator (Desktop) WiFi scanner (Desktop) TodoMVC (All platforms) E-commerce w/ Tailwind (SSR/LiveView)
File Explorer Wifi Scanner Demo TodoMVC example E-commerce Example

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 โœ… โœ… if/then to hide/show component
Map, Iterator โœ… โœ… map/filter/reduce to produce rsx!
Keyed Components โœ… โœ… advanced diffing with keys
Web โœ… โœ… renderer for web browser
Desktop (webview) โœ… โœ… renderer for desktop
Shared State (Context) โœ… โœ… share state through the tree
Hooks โœ… โœ… memory cells in components
SSR โœ… โœ… render directly to string
Component Children โœ… โœ… cx.children() as a list of nodes
Headless components โœ… โœ… components that don't return real elements
Fragments โœ… โœ… multiple elements without a real root
Manual Props โœ… โœ… Manually pass in props with spread syntax
Controlled Inputs โœ… โœ… stateful wrappers around inputs
CSS/Inline Styles โœ… โœ… syntax for inline styles/attribute groups
Custom elements โœ… โœ… Define new element primitives
Suspense โœ… โœ… schedule future render from future/promise
Integrated error handling โœ… โœ… Gracefully handle errors with ? syntax
NodeRef โœ… โœ… gain direct access to nodes
Re-hydration โœ… โœ… Pre-render to HTML to speed up first contentful paint
Jank-Free Rendering โœ… โœ… Large diffs are segmented across frames for silky-smooth transitions
Effects โœ… โœ… Run effects after a component has been committed to render
Portals ๐Ÿ›  โœ… Render nodes outside of the traditional tree structure
Cooperative Scheduling ๐Ÿ›  โœ… Prioritize important events over non-important events
Server Components ๐Ÿ›  โœ… Hybrid components for SPA and Server
Bundle Splitting ๐Ÿ‘€ โœ… Efficiently and asynchronously load the app
Lazy Components ๐Ÿ‘€ โœ… Dynamically load the new components as the page is loaded
1st class global state โœ… โœ… redux/recoil/mobx on top of context
Runs natively โœ… โ“ runs as a portable binary w/o a runtime (Node)
Subtree Memoization โœ… โ“ skip diffing static element subtrees
High-efficiency templates ๐Ÿ›  โ“ rsx! calls are translated to templates on the DOM's side
Compile-time correct โœ… โ“ Throw errors on invalid template layouts
Heuristic Engine โœ… โ“ track component memory usage to minimize future allocations
Fine-grained reactivity ๐Ÿ‘€ โ“ Skip diffing for fine-grain updates
  • โœ… = implemented and working
  • ๐Ÿ›  = actively being worked on
  • ๐Ÿ‘€ = not yet implemented or being worked on
  • โ“ = 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.

dioxus's People

Contributors

chris-morgan avatar jkelleyrtp avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.