- β‘ End-To-End Reactivity with LiveView
- π§ββοΈ One-line Install - Automated setup via Igniter installer
- π Server-Side Rendered (SSR) Vue
- π Lazy-loading Vue Components
- π¦ Efficient Props Diffing - Only changed data is sent over WebSocket
- πͺ ~VUE Sigil as an alternative LiveView DSL with VS Code syntax highlighting
- π― Phoenix Streams Support with efficient patches
- π¦ Tailwind Support
- π¦₯ Slot Interoperability
- π File Upload Composable -
useLiveUpload()for seamless Vue integration with LiveView uploads - π Comprehensive Form Handling -
useLiveForm()with server-side validation via Ecto changesets - π Amazing DX with Vite
- Live Examples - Interactive demos
- HexDocs
- HexPackage
- Phoenix LiveView
After installation, you can use Vue components in the same way as you'd use functional LiveView components. You can even handle Vue events with JS hooks! All the phx-click, phx-change attributes works inside Vue components as well.
<script setup lang="ts">
import {ref} from "vue"
// props are passed from LiveView
const props = defineProps<{count: number}>()
// local state
const diff = ref(1)
</script>
<template>
Current count: {{ props.count }}
<label>Diff: </label>
<input v-model.number="diff" type="range" min="1" max="10" />
<button phx-click="inc" :phx-value-diff="diff">
Increase counter by {{ diff }}
</button>
</template>defmodule MyAppWeb.CounterLive do
use MyAppWeb, :live_view
def render(assigns) do
~H"""
<.vue count={@count} v-component="Counter" v-socket={@socket} />
"""
end
def mount(_params, _session, socket) do
{:ok, assign(socket, count: 0)}
end
def handle_event("inc", %{"diff" => value}, socket) do
{:noreply, update(socket, :count, &(&1 + value))}
end
endPhoenix Live View makes it possible to create rich, interactive web apps without writing JS.
But once you'll need to do anything even slightly complex on the client-side, you'll end up writing lots of imperative, hard-to-maintain hooks.
LiveVue allows to create hybrid apps, where part of the session state is on the server and part on the client.
- Your hooks are starting to look like jQuery
- You have a complex local state
- You'd like to use a massive Vue ecosystem
- You want transitions, graphs etc.
- You simply like Vue π
New project:
mix archive.install hex igniter_new
mix igniter.new my_app --with phx.new --install [email protected]Existing project (Phoenix 1.8+ only):
mix igniter.install [email protected]Igniter installer works only for Phoenix 1.8+ projects. For detailed installation instructions, see the Installation Guide.
For syntax highlighting of the ~VUE sigil:
- VS Code Marketplace: Install LiveVue extension
- Manual Installation: Download VSIX from releases and install via
Extensions > Install from VSIX...
- Getting Started - Create your first Vue component with transitions
- Basic Usage - Fundamental patterns, ~VUE sigil, and common examples
- Forms and Validation - Complex forms with server-side validation using useLiveForm
- Configuration - Advanced setup, SSR, and customization options
- Component Reference - Complete syntax documentation
- Client-Side API - Vue composables and utilities
- Architecture - How LiveVue works under the hood
- Testing - Testing Vue components in LiveView
- Deployment - Production deployment guide
- FAQ - Common questions and comparisons
- Troubleshooting - Debug common issues
- Comparison - LiveVue vs other solutions
This project is heavily inspired by β¨ LiveSvelte β¨. Both projects try to solve the same problem. LiveVue was started as a fork of LiveSvelte with adjusted ESbuild settings, and evolved to use Vite and a slightly different syntax. I strongly believe more options are always better, and since I love Vue and it's ecosystem I've decided to give it a go π
You can read more about differences between Vue and Svelte in FAQ or in comparison guide.
Ensure you have Node.js installed. Clone the repo and run mix setup.
No build step is required for the library itself - Vite handles TypeScript transpilation when consumers bundle their app.
Use npm run e2e:test to run the Playwright E2E tests.
To test local LiveVue changes in a separate Phoenix project, use a path dependency in your project's mix.exs:
{:live_vue, path: "../live_vue"}Then run mix deps.get && npm install. The installer already configures package.json to use file:./deps/live_vue, so both Elixir and npm will point to your local copy.
Elixir changes are reflected immediately. For TypeScript changes, run npm install again to pick them up.
Release is done with expublish package.
- Write version changelog in untracked
RELEASE.mdfile - Update version in
INSTALLATION.md
Run
git add INSTALLATION.md
git commit -m "INSTALLATION version bump"
# to ensure everything works fine
mix expublish.minor --dry-run --allow-untracked --branch=main
# to publish
mix expublish.minor --allow-untracked --branch=main-
useLiveEvent- automatically attaching & detachinghandleEvent - JSON Patch diffing - send only changed props over the WebSocket
- VS Code extension - syntax highlighting for
~VUEsigil - Igniter installer - one-line installation for Phoenix 1.8+ projects
-
useEventReply- easy handling of{:reply, data, socket}responses -
useLiveForm- Ecto changesets & server-side validation - Phoenix Streams - full support for
stream()operations
