Vue Structure

Understand the folders and files generated by a Vite-powered Vue project.

Overview

A Vue project separates source code, static files, dependencies, and tooling configuration into purposeful locations. Understanding this structure helps you find the right place for components, images, styles, and application logic while keeping the project maintainable as it grows.

Key concepts

  • src contains the application source
  • App.vue is the root component
  • main.js creates and mounts Vue
  • components contains reusable interface pieces

Why is project structure important?

A house separates rooms according to their purpose. A Vue project similarly separates source code, static files, dependencies, and configuration so development and teamwork remain organized.

Typical Vue project structure

devbrainbox.local/output
my-vue-app/
├── node_modules/
├── public/
├── src/
├── .gitignore
├── index.html
├── package.json
├── package-lock.json
├── vite.config.js
└── README.md

The node_modules folder

node_modules contains Vue and all other packages installed by npm. Do not edit or commit its contents manually. If it is removed, recreate it from package.json and the lock file.

devbrainbox.local/output
npm install

The public folder

public stores static files that should be copied to the production build without Vite processing them, such as a robots.txt file, fixed-name icons, PDFs, or other externally referenced assets.

The src folder

src is the heart of the application and contains most files you edit during development.

devbrainbox.local/output
src/
├── assets/
├── components/
├── App.vue
└── main.js

assets

assets stores imported CSS, images, fonts, and SVG files. Because these files pass through Vite, they can be transformed, hashed, and optimized during the build.

components

components contains reusable Vue Single-File Components. Splitting the interface into focused pieces avoids one large, difficult-to-maintain file.

devbrainbox.local/output
components/
├── Header.vue
├── Footer.vue
├── ProductCard.vue
└── BaseButton.vue

The App.vue file

App.vue is the root component. It usually assembles the main layout and renders other components or the current routed view.

Vue SFC
<template>
  <h1>Welcome to Vue.js</h1>
</template>

The main.js file

main.js is the application entry point. It imports the root component, creates the Vue app, installs global plugins when needed, and mounts the app.

JavaScript
import { createApp } from "vue";
import App from "./App.vue";

createApp(App).mount("#app");

The index.html file

A client-side Vue application normally starts from one index.html file containing the element where Vue mounts.

HTML
<body>
  <div id="app"></div>
  <script type="module" src="/src/main.js"></script>
</body>

The package.json file

package.json records project metadata, npm scripts, and dependencies. It enables commands such as npm run dev and npm run build.

The package-lock.json file

The lock file records the exact dependency versions installed so developers and automated builds can reproduce the same dependency tree. It should normally be committed to version control.

The vite.config.js file

vite.config.js customizes the development server and production build. Beginners often leave it unchanged; larger projects may add aliases, plugins, proxies, or build options.

How everything works together

devbrainbox.local/output
Browser
   ↓
index.html
   ↓
main.js
   ↓
App.vue
   ↓
Child components

Growing the src structure

Projects commonly add views, router, stores, composables, services, and test folders as features require them.

devbrainbox.local/output
src/
├── assets/
├── components/
├── composables/
├── router/
├── services/
├── stores/
├── views/
├── App.vue
└── main.js

Real-life example

An online store can use separate navigation, product list, product card, cart, and footer components. Each piece stays focused and can be reused wherever the interface needs it.

Best practices

  • Use meaningful file and component names
  • Keep components small and focused
  • Store assets in the appropriate folder
  • Group related features together as the application grows
  • Do not modify node_modules
  • Avoid placing the entire application in App.vue
  • Commit package-lock.json

Tips for beginners

  • Explore the generated files before deleting them
  • Trace index.html → main.js → App.vue
  • Practice importing one child component
  • Learn the difference between public and assets
  • Start simple and add folders only when needed