Skip to content

Make frender runtime-independent #1

@EqualMa

Description

@EqualMa

Currently frender and react-rs rely on react-sys to work.
react-sys uses a feature flag import-react to control whether to import from react module or just use global variable React.

A better design could be as following:

frender and react-rs shouldn't rely on any runtime implementation details (e.g. where React is imported).
Instead, they provide a trait ReactRuntime defining common behaviors.
For libraries, they also rely on the ReactRuntime trait to call hooks and create elements.
For binaries, only at frender::main or the beginning of main fn should the runtime be specified globally.

Going further, there could be a pure rust implementation of the runtime, which is independent of wasm-bindgen and can run in server side. (SSR might be implemented with this)

frender is at v1-alpha versions. BREAKING CHANGES are unavoidable to apply the new design. But I will make as least BREAKING CHANGES as possible with the following todos:

  • In react-rs and frender, wasm-bindgen and other wasm-related dependencies should be under optional feature js.
    • Some impl AsRef<JsValue> must be removed as they no longer contain JsValue.
    • Into<JsValue> can only be implemented with feature js.
  • In react-rs, provide Runtime trait, which defines common behaviors of React runtime.
    • react-rs should maintain a thread_local static cell of runtime instance and this can be set once (maybe OnceCell<Box<dyn Runtime>>)
    • frender should re-pub react::Runtime as ReactRuntime

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions