---
name: bootstrap-vite
description: Include and bundle Bootstrap 6's CSS and JavaScript in a project using Vite. Use when setting up Bootstrap with Vite, bundling Bootstrap's Sass and JS through Vite, or creating a Vite-based Bootstrap project.
guide: /guides/vite
---
# Bootstrap 6 with Vite
Set up a Bootstrap 6 project bundled with Vite. Requires Node.js and terminal familiarity.
## Workflow
- [ ] Step 1: Set up npm and install dependencies
- [ ] Step 2: Create the project structure
- [ ] Step 3: Configure Vite
- [ ] Step 4: Import Bootstrap's CSS and JS
- [ ] Step 5: Verify
---
## Step 1: Set up npm and install dependencies
1. Create the project and initialize npm:
```sh
mkdir my-project && cd my-project
npm init -y
```
2. Install Vite:
```sh
npm i --save-dev vite
```
3. Install Bootstrap and its optional peer dependencies (omit `@floating-ui/dom` if not using menus/popovers/tooltips; omit `vanilla-calendar-pro` if not using the datepicker):
```sh
npm i --save bootstrap@6.0.0-alpha.1 @floating-ui/dom vanilla-calendar-pro
```
4. Install Sass to compile Bootstrap's source:
```sh
npm i --save-dev sass
```
---
## Step 2: Create the project structure
```sh
mkdir {src,src/js,src/scss}
touch src/index.html src/js/main.js src/scss/styles.scss vite.config.js
```
Target layout:
```text
my-project/
├── src/
│ ├── js/
│ │ └── main.js
│ ├── scss/
│ │ └── styles.scss
│ └── index.html
├── package-lock.json
├── package.json
└── vite.config.js
```
---
## Step 3: Configure Vite
1. `vite.config.js`:
```js
import path from 'path'
export default {
root: path.resolve(__dirname, 'src'),
build: {
outDir: '../dist'
},
server: {
port: 8080
}
}
```
2. `src/index.html` — load the entry module:
```html
Bootstrap w/ Vite
Hello, Bootstrap and Vite!
```
3. `package.json` — add the start script:
```json
{
"scripts": {
"start": "vite",
"test": "echo \"Error: no test specified\" && exit 1"
}
}
```
4. Start Vite:
```sh
npm start
```
---
## Step 4: Import Bootstrap's CSS and JS
1. `src/scss/styles.scss` — import the source Sass with `@use` (never `@import`):
```scss
// Import all of Bootstrap's CSS
@use "bootstrap/scss/bootstrap";
```
To customize, override Bootstrap's CSS token maps (`$root-tokens`, `$*-tokens`) — see [Customize › Sass](https://getbootstrap.com/docs/6.0/customize/sass/#compile-time-overrides). Token names are written unprefixed in Sass; Bootstrap's dist/CDN CSS adds the `--bs-` prefix via PostCSS, so compiling the source yourself keeps them unprefixed.
2. `src/js/main.js` — load the CSS and import Bootstrap's JS. Floating UI and Vanilla Calendar Pro are imported automatically through Bootstrap:
```js
// Import our custom CSS, then all of Bootstrap’s JS
import '../scss/styles.scss'
import * as bootstrap from 'bootstrap'
```
Import only the plugins you need to keep bundle sizes down:
```js
import { Tooltip, Toast, Popover } from 'bootstrap'
```
---
## Step 5: Verify
1. Run `npm start` and open `http://localhost:8080` — the `.container` and `.btn-solid.theme-primary` button should be styled.
2. Confirm the browser console is free of module-resolution errors (Bootstrap, Floating UI, Vanilla Calendar Pro).
3. Trigger a JS component (tooltip/dialog) to confirm the JS bundle works.
4. Bootstrap 6 requires a browser that supports `oklch()` and `color-mix()`.
For an optimized build that imports only the parts of Bootstrap you use, see the [twbs/examples Vite project](https://github.com/twbs/examples/tree/main/vite).