vite-static 0.4.0

Embed Vite chunks into your Rust application and query them individually.
Documentation

Vite Static

Embed Vite chunks into your Rust application and query them individually.

How it works

Vite Static has Manifest trait, that requires to implement 2 methods and adds methods to query chunks and resolve output filename (f.e. main.SOMEHASH.js) from manifest key (f.e. main.ts).

Vite Static provides derive feature (enabled by default), that adds Manifest derive to automatically implement trait.

Also, Vite Static has integrations with web frameworks, to easily serve your static files.

Usage

  1. Add vite-static library

    cargo add vite-static # WIP
    
  2. Enable build.manifest vite option.

    In path/to/vite-project/vite.config.js:

    export default defineConfig({
        // <snip>
        build: {
            manifest: true, // <-- required
        }
        // <snip>
    })
    
  3. Add Manifest derive

    use vite_static::Manifest;
    
    #[derive(Manifest)]
    #[vite_dist = "path/to/vite-project/dist"] // relative to Cargo.toml
    // OR: #[vite_dist = "/absolute/path/to/dist"]
    // OR: #[vite_dist = "env:ENVIRONMENT_VARIABLE_TO_DIST"]
    struct MyViteStatic;
    
  4. Use it!

    To see more use cases, look into examples/ folder and Manifest trait.

Features

Without any feature, you have Manifest trait, that helps you with quering chunks.

Feature Description
derive adds Manifest derive macro (default)
actix-web adds ActixFiles service
axum WIP
rocket WIP
html adds HTMLIntegration builder

Q&A

  • Q: Why should am I use this library, over vite-rs?

    A: It depends on your needs.

    You should use vite-rs, when you have frontend built with Vite, including routing and HTML, and you need a library to embed whole frontend into application.

    You should use vite-static, when you have assets (JS, CSS, PNGs, etc.) built with Vite, but you use HTML templating to build faster and lighter websites, so you need to embed only assets.

    Because of vite-static use case and lightness, it doesn't have development server and auto-running npm build in derive macro.

  • Q: Why it doesn't run npm build automatically?

    A: Because it only adds problems.

    First, it will run npm build on every rust compilation and will require adding additional options.

    Second, it will make configuration only harder. For example you use nix. While building release, you build vite project in separate derivation, but during development you would use automatic npm build.

    So it's simpler to just open 2 terminals: first to watch and re-run cargo run, second to run vite watch.

    KISS principle!

Credits

  • vite-rs - good library to embed entire frontend into rust application
  • actix-web-static-files - ActixFiles service implementation is partially taken from this crate