github leptos-rs/leptos v0.9.0-rc0

2 hours ago

This is the first release candidate for 0.9.0. 0.9 should be mostly compatible with most user application code. i.e., the migration path should be to upgrade from 0.8 to 0.9 and, in most cases, not need to make any changes. However, note the following:

Notable changes:

  • lazy feature: Lazy-loading/code-splitting is now gated behind a lazy flag on the leptos crate. This saves binary size for anyone who's not using lazy-loading; if you are, just enable the feature.
  • serde_qs 1.0: we've migrated to the 1.0 series of releases for our default server-function input encoding (form URL data). This should reduce the requirement for #[server(default)] and similar workarounds for empty collections.
  • on:toggle is now typed as a ToggleEvent rather than plain Event
  • Function-call syntax for signal reads is now supported on stable (i.e., let (foo, set_foo) = signal(42); set_foo(13); foo() should work on both stable and nightly)
  • Some of the trait implementations around signals have changed: in the worst case, if you have a component or function that takes impl Fn() -> T and you pass it a Signal<T> you may need to dereference it (foo=*signal rather than foo=signal). Let us know if there are any more noticeable breakages here. There are some awkward tradeoffs with inference and #[prop(into)] and in some cases we've had to make the choice we think will be best for the most use cases. Let me know if there are things that seem obviously wrong or unhelpful.
  • A wide variety of semver-breaking changes that probably won't affect user code.

What's Changed Since 0.9.0-beta

  • fix(router): keep "" and "/" static segments as pass-through parents by @sabify in #4839
  • chore: make sure failing tests in CI actually cause failures by @gbj in #4840
  • test(integrations): gate static route tests on the default feature by @sabify in #4842
  • Surface failed lazy-route chunk loads to ErrorBoundary instead of panicking by @JohnHarrison in #4785
  • fix: include submit input value in FormData when submitting Form by @dav-wolff in #4836
  • Fix/islands router branch marker off by one by @seanaye in #4832
  • Fix two concurrency issues with Suspense by @gbj in #4853
  • fix: don't panic in the wasm-split prefetch machinery when its lock is unavailable by @JohnHarrison in #4830
  • Assorted islands-router fixes by @gbj in #4855
  • fix: check for resource reads inside Signal/Memo used as attribute values (see #4856) by @gbj in #4859
  • fix(reactive_graph): ignore dropped local-resource listener by @adrianncovaci in #4856
  • fix(router): three route-matching panics / silent match failures by @sabify in #4860
  • fix(router): static optional params, <Form> submission fidelity, initial route build race by @sabify in #4861
  • feat(reactive_stores): convert a subfield into MaybeProp by @svieujot in #4867
  • fix(leptos): nonce incorrectly generated for wasm preload by @Ofenhed in #4844
  • Adopt a better Suspense-polling approach by @gbj in #4864
  • fix: UnsyncCallback/Callback comments by @geovie in #4868
  • fix(server_fn): eight panics, leaks and protocol bugs by @sabify in #4863
  • fix: dynamically delegate add_any_attr in AnyView by @asemqaffaf in #4703
  • fix(examples): prevent Trunk auto-reload during browser tests by @larstobi in #4872
  • fix(examples): await the add-1000-counters click by @larstobi in #4871
  • fix(ci): use locked dependencies when installing Trunk by @larstobi in #4877
  • fix: register trailing-slash routes that work with Leptos router with Actix/Axum routers (closes #4034) by @gbj in #4878
  • refactor(macros): replace direct proc-macro-error2 usage with syn diagnostics by @larstobi in #4862
  • perf(leptos): erase nested views and event callbacks by @skyf0l in #4879
  • chore(deps): bump actions/setup-node from 6 to 7 by @dependabot[bot] in #4841
  • chore(deps): bump actions-rust-lang/setup-rust-toolchain from 1 to 2 by @dependabot[bot] in #4876
  • fix: hydrate <For> children in the same order we SSR them (closes #4881) by @gbj in #4882
  • chore(ci): build the erased mode of the CI matrix with erase_components by @sabify in #4893
  • test: wait for suspense inspect result by @larstobi in #4891
  • fix: after hydration is over, don't try to hydrate the wrong data (see #4895) by @gbj in #4896
  • chore(deps): update rstml to 0.13.1 (RUSTSEC-2026-0173) by @larstobi in #4892
  • chore(deps): bump the npm_and_yarn group across 2 directories with 2 updates by @dependabot[bot] in #4820
  • fix(static): pair cache-hit body and headers by file identity by @sabify in #4824
  • Fix two correctness bugs in const_str_slice_concat by @sabify in #4745
  • 🚨 CRITICAL USABILITY IMPROVEMENT by @gbj in #4901
  • fix: use nested serialization IDs to prevent mismatches that depend on the timing of Suspense on the server (closes #4897) by @gbj in #4900
  • Further extend the axum API to support embedded files through RustEmbed. by @metatoaster in #4715
  • reactive_stores: dedupe ArcField From impls, stop double-boxing guards by @maruschin in #4886
  • feat(leptos): add defer option to HydrationScripts (closes #4869) by @GauravPawar101 in #4889
  • feat(config): decouple public pkg URL from on-disk pkg dir by @sabify in #4817
  • wip: Leptos 0.9 by @gbj in #4522
  • fix: generate WASM split preloads under the correct owner by @ondradoksy in #4918
  • chore: update CI to handle erase-components tests, and various flakiness issues by @gbj in #4924
  • chore: fix broken intra-doc links by @sabify in #4926
  • fix: correctly skip island subtrees in island router by @gbj in #4934
  • fix: run the async render effect's first value under its own owner by @adrianncovaci in #4932
  • chore: upgrade deps by @sabify in #4929
  • fix: keep view markers when a View is resolved by @adrianncovaci in #4938
  • fix: don't drop nodes owned by an arena while holding the arena lock (see #4930) by @gbj in #4936
  • fix: fix diffing after <For/> when using islands router (closes #4937) by @gbj in #4939

New Contributors

Full Changelog: v0.9.0-beta...v0.9.0-rc0

Don't miss a new leptos release

NewReleases is sending notifications on new releases.