Dioxus: Difference between revisions

Initial setup.
 
m Fix page hierarchy.
 
(9 intermediate revisions by 3 users not shown)
Line 1: Line 1:
[https://dioxuslabs.com Dioxus] is a fullstack app framework for web, desktop, mobile, and more.
[https://dioxuslabs.com Dioxus] is a full-stack [[Rust]] app framework for web, desktop, mobile, and more.
[[Category:Applications]]
 
=== Troubleshooting ===
 
==== ''wasm-bindgen'' mismatch ====
A common issue when using the ''dioxus-cli'' version from Nixpkgs is encountering the following error:<syntaxhighlight lang="text">
it looks like the Rust project used to create this Wasm file was linked against
version of wasm-bindgen that uses a different bindgen format than this binary:
 
  rust Wasm file schema version: 0.2.99
    this binary schema version: 0.2.97
</syntaxhighlight>
 
===== Why does this happen? =====
Unlike most Rust crates, ''wasm-bindgen'' doesn't follow [https://semver.org semantic versioning (SemVer)]. This means even a patch version difference (like 0.2.97 vs 0.2.98) can contain breaking changes or incompatibilities.
 
When you install ''dioxus-cli'' from Nixpkgs, it uses the exact versions of dependencies specified in the packages lock file, just like running <code>cargo install dioxus-cli --locked</code>. The versions present in the packages lock file are chosen '''at publishing time'''.
 
When you add ''dioxus'' as a dependency in your project's ''Cargo.toml'' (or any other crate that requires on ''wasm-bindgen''), [https://doc.rust-lang.org/cargo/reference/resolver.html#semver-compatibility Cargo assumes that all dependencies follow SemVer], and pulls in the latest SemVer compatible version of ''wasm-bindgen.'' This will likely be a different version than was present in the ''dioxus-cli'' lock file, since ''wasm-bindgen'' tends to release quite often.
 
There are two solutions to solving this:
 
# Pin ''wasm-bindgen'' to the version that ''dioxus-cli'' expects.
# Update ''dioxus-cli'' to use a newer lock file.
 
===== Pin ''wasm-bindgen'' =====
Within your ''Cargo.toml'' file, force ''wasm-bindgen'' to use the expected version by pinning it.<syntaxhighlight lang="toml">
[dependencies]
wasm-bindgen = "=0.2.97"
 
</syntaxhighlight>Run ''cargo update'', and you should see the version being downgraded.<syntaxhighlight lang="text">
Downgrading wasm-bindgen v0.2.99 -> v0.2.97 (available: v0.2.99)
</syntaxhighlight>
 
===== Updating lock file =====
If you can't downgrade, you can instead manually update the lock file.
 
Download the source from [https://crates.io/crates/dioxus-cli crates.io] for the given version of the CLI.
 
e.g. https://crates.io/api/v1/crates/dioxus-cli/0.6.0/download
 
Extract the file, <code>cd</code> into the directory, and run <code>cargo update</code>. You should be able to see the ''wasm-bindgen'' version being updated.<syntaxhighlight>
Updating wasm-bindgen v0.2.97 -> v0.2.99
</syntaxhighlight>Copy the newly updated lock file into your project (here called ''Dioxus.lock''), and override the Nixpkgs version.<syntaxhighlight lang="nix">
dioxus-cli = pkgs.dioxus-cli.overrideAttrs (_: {
  postPatch = ''
    rm Cargo.lock
    cp ${./Dioxus.lock} Cargo.lock
  '';
 
  cargoDeps = pkgs.rustPlatform.importCargoLock {
    lockFile = ./Dioxus.lock;
  };
});
</syntaxhighlight>
 
==== Choosing ''wasm-bindgen-cli'' version ====
You will also want to ensure the version of ''wasm-bindgen-cli'' matches whatever is in your lock file.<syntaxhighlight lang="nix">
cargoLock = builtins.fromTOML (builtins.readFile ./Cargo.lock);
 
wasmBindgen = pkgs.lib.findFirst
  (pkg: pkg.name == "wasm-bindgen")
  (throw "Could not find wasm-bindgen package")
  cargoLock.package;
 
wasm-bindgen-cli = pkgs.wasm-bindgen-cli.override {
  version = wasmBindgen.version;
  hash = pkgs.lib.fakeHash;
  cargoHash = pkgs.lib.fakeHash;
};
</syntaxhighlight>
 
[[Category:Rust]]