Single File Applications With Svelte

Building Single File Applications using Svelte

In the dynamic and ever-evolving landscape of web development, efficiency and simplicity often make the difference between a good project and a great one. Today, we’re going to delve into an exciting approach that brings these two elements together: building single file applications using Svelte.

This might sound counter-intuitive if you’re used to developing sprawling applications, each with its own array of files and directories. But we’re about to venture into a territory that’s less explored yet comes with its unique use-cases. The focus of our discussion will be on how to compile an entire Svelte project into a single HTML file (which itself includes Javascript and CSS).

While this approach isn’t typically used for production-grade applications, it brings immense value for smaller projects. It enables easy sharing, quicker loading times, and the ability to run your application just about anywhere - even directly on your phone. The magic of this technique is that your entire application - HTML, CSS, JavaScript, and Svelte components - all reside within a single, self-contained HTML file.

Step 1: Setting up ViteJS

Our journey into building a single file application using Svelte starts by setting up our project with ViteJS. Vite provides a build tool that is designed to facilitate and streamline the development process. It allows us to quickly scaffold our project, and it’s incredibly efficient when working with modern frameworks like Svelte.

To initiate our project, we’ll use the command npm create vite@latest. Let’s take a look at this in action:

 river@river-pc  ~/Coding  npm create vite@latest
✔ Project name: … my-awesome-sfa
✔ Select a framework: › Svelte
✔ Select a variant: › TypeScript

Scaffolding project in /home/river/Coding/my-awesome-sfa...

Upon executing this command, Vite asks for the project name, the framework we wish to use (Svelte in our case), and the variant we prefer (we’ve selected TypeScript). The tool then scaffolds our project in the specified directory.

To get our project up and running, we follow the provided steps:

cd my-awesome-sfa
npm install
npm install @sveltejs/vite-plugin-svelte unocss vite-plugin-singlefile
npm run dev

This will navigate us into our project directory, install all necessary dependencies, and start our development server. Note that we install three additional packages: @sveltejs/vite-plugin-svelte, unocss, and vite-plugin-singlefile.

  1. @sveltejs/vite-plugin-svelte: This is a Vite plugin that allows seamless integration of Svelte within a Vite project, enabling you to write and compile Svelte components.
  2. unocss: This is a highly configurable, utility-first CSS library that allows you to write efficient, reusable CSS, significantly reducing the size and complexity of your stylesheets.
  3. vite-plugin-singlefile: This Vite plugin enables the compilation of your entire project into a single HTML file, which is ideal for creating self-contained, easily distributable applications.

Next, we need to install some additional libraries and configure Vite to suit our needs. Let’s examine our Vite configuration:

// vite.config.js
import { defineConfig } from 'vite';
import { svelte } from '@sveltejs/vite-plugin-svelte';
import UnoCSS from 'unocss/vite';
import { viteSingleFile } from 'vite-plugin-singlefile';

export default defineConfig(({ command }) => ({
	plugins: [
			/* plugin options */
		command === 'build' &&
				removeViteModuleLoader: true
	build: {
		minify: false

From the above code, it’s clear that we’re importing and using the @sveltejs/vite-plugin-svelte, unocss/vite, and vite-plugin-singlefile plugins. @sveltejs/vite-plugin-svelte is used to integrate Svelte with Vite, unocss/vite to handle our CSS needs, and vite-plugin-singlefile to enable our goal of compiling into a single HTML file.

The defineConfig function helps us customize our build and development behavior. Here, we’re adding our plugins to the Vite configuration and specifying that the vite-plugin-singlefile should only be used during the build process. This is achieved through the conditional statement command === 'build'. When we run the build command, this plugin will step in to compile our entire Svelte application into a single HTML file.

The removeViteModuleLoader: true option within vite-plugin-singlefile configuration is particularly significant. This option strips away the Vite module loader from the final build, further simplifying our HTML file and ensuring that all our code is self-contained.

Lastly, within the build configuration, we have set minify: false. This means that the output HTML file won’t be minified. While minification can reduce the file size and improve load times, it can make the code difficult to read. Depending on your requirements, you can choose to enable or disable minification.

That’s all there is for our initial setup. We’ve successfully configured Vite and are now ready to start developing our single file Svelte application. In the next section, we will delve into the process of writing our Svelte components and preparing our application for the build process.

Step 2: Building and Compiling Your Svelte Application

Now that we’ve successfully set up our development environment, let’s jump into the exciting part - writing our Svelte components and experiencing the magic of hot-reloading development environment.

With Svelte and Vite, you can create multiple Svelte files (.svelte) each containing its own component. This might include individual components for different parts of your app such as a header, a footer, a main content area, and so forth. This component-based approach makes your codebase easier to manage and understand, as each component is responsible for a specific piece of functionality.

As you’re developing your application, Vite’s hot module replacement (HMR) will become your best friend. Any changes you make to your Svelte components will be instantly reflected in your browser, without requiring a full page reload. This makes for a very smooth and efficient development experience, allowing you to see the results of your changes in real-time.

Here’s what this development process might look like:

  1. Create a new .svelte file for each component in your application.
  2. Write your HTML, CSS, and JavaScript directly in each .svelte file.
  3. Run npm run dev to start your development server.
  4. Make changes to your components and see those changes instantly in your browser, thanks to Vite’s hot module replacement.

Once you’re satisfied with your application, it’s time to prepare it for deployment. This is where our earlier setup with vite-plugin-singlefile shines. By simply running npm run build, Vite will compile your entire Svelte application - including all your individual .svelte components - into a single HTML file.

This single HTML file is entirely self-contained, meaning it includes all of the HTML, CSS, and JavaScript needed to run your application. This makes it incredibly easy to share your project. You can distribute this single HTML file, and anyone can open it in their browser to run your application, without any additional setup or installation.

This ability to compile an entire Svelte project into a single, portable HTML file is a game-changer for sharing and deploying small-scale projects.


In this blog post, we’ve explored an innovative approach to web development: building a single file application using Svelte and Vite. We began by setting up our project with Vite, using the command npm create vite@latest, and installing the necessary libraries for Svelte integration, CSS handling, and single file output.

We then delved into creating multiple Svelte components, taking advantage of Vite’s hot module replacement for real-time updates during development. With a simple npm run build command, Vite compiles the entire Svelte project into a single, self-contained HTML file that’s easy to share and run anywhere.

By following these steps and practices, you can create a streamlined, high-performing single file Svelte application that’s easy to share and deploy.