Reputation: 875
I am using Vite (https://vitejs.dev/) for a static multipage site. This is the default project folder structure after the build command.
my-app/
├─ node_modules/
├─ dist/
│ ├─ assets/
│ ├─ index.html
├─ index.html
├─ main.js
├─ style.scss
├─ package.json
But I want to make this a multipage site and change the input and output directory for a better organizable way like this
my-app/
├─ node_modules/
├─ package.json
├─ src/
│ ├─ about.html
│ ├─ index.html
│ ├─ main.js
│ ├─ style.scss
├─ dist/
│ ├─ assets/
│ ├─ about.html
│ ├─ index.html
Basically, it should take the src
as an input folder and output dist
as a child of the my-app
. When I try to do this it shows errors, then I change the scripts of the package.json
into this
"scripts": {
"dev": "vite src",
"build": "vite build src",
"serve": "vite preview"
},
This way the dev
command works fine. But the 'build' command makes the dist folder inside the src
folder and does not generate other HTML files except index.html
.
Now how can I fix this? Any suggestion?
Upvotes: 83
Views: 213223
Reputation: 26
I tested on Mac OS with Vite for React
If you want to change output dist -> build
(for expample) when you run npm run build
project, you should add in your vite.config.js build.outDir
property.
export default defineConfig({
plugins: [react()],
build: {
outDir: './build'
}
})
Upvotes: 1
Reputation: 2331
Create a vite.config.js
file and define your project root and output directory as such:
module.exports = {
root: 'src',
build: {
outDir: '../dist',
emptyOutDir: true, // also necessary
}
}
For more info, checkout config.
Upvotes: 136
Reputation: 857
another example, on my vite project
my-app/
├─ node_modules/
├─ dist/
│ ├─ registerSW.js
│ ├─ index.html
├─ index.html
├─ index.ts
├─ style.css
├─ vite.config.ts
├─ index.ts
├─ package.json
Depending on the structure project as above, the URL was https://domain_name.com/my-app/dist/. The default "index.html" file is located in "dist" folder. How to display it without subfolder in URL ? I mean how to convert from https://domain_name.com/my-app/dist/ to just https://domain_name.com/
My solution ^^ here we have slight changes in the configuration file. Pay attention, if you set emptyOutDir to true, that will remove all files on your server
export default defineConfig({
base: "./",
root:"../my-app",
build: {
emptyOutDir: **false**, //Pay attention !
outDir: '../',
rollupOptions: {
output: {
assetFileNames: "[name].[ext]",
chunkFileNames: "[name].[ext]",
entryFileNames: "[name].js",
},
},
},
The structure project will be like this
├─ my-app/
│ ├─ node_modules/
│ ├─ index.html
│ ├─ index.ts
│ ├─ style.css
│ ├─ vite.config.ts
│ ├─ index.ts
│ ├─ package.json
├─ registerSW.js
├─ index.html
Upvotes: 0
Reputation: 29
Create a vite.config.js
file and specify it's location in your package.json
scripts using the --config
flag:
"scripts": {
"dev": "vite --config ./config/vite.config.js",
"build": "vite build --config ./config/vite.config.js
"preview": "vite preview --config ./config/vite.config.js"
},
Inside your vite config file include the following:
import { defineConfig } from 'vite';
// https://vitejs.dev/config/
export default defineConfig({
root: 'src',
build: {
outDir: '../dist',
emptyOutDir: true,
},
});
Upvotes: 2
Reputation: 263
For multipage apps you need to specify each entry point.
To dynamically specify all .html
files in src/
directory as the entry points you can set up your vite.config.js
like this:
import path from "path";
import glob from "glob";
export default {
root: path.join(__dirname, "src"),
build: {
outDir: path.join(__dirname, "dist"),
rollupOptions: {
input: glob.sync(path.resolve(__dirname, "src", "*.html")),
},
},
};
Make sure to install glob
like this
npm install glob -D
Upvotes: 26
Reputation: 129
If you want to use defineConfig in your vite.config.ts you can use it like this:
import { defineConfig } from 'vite'
import reactRefresh from '@vitejs/plugin-react-refresh'
import eslintPlugin from 'vite-plugin-eslint'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [reactRefresh(), eslintPlugin({ cache: false })],
root: 'src',
build: {
outDir: '../dist'
}
})
Upvotes: 12
Reputation: 99
You can set up your vite.config.js like this:
import path from 'path'
export default {
root: path.resolve(__dirname, 'src'),
build: {
outDir: path.resolve(__dirname, 'dist'),
rollupOptions: {
input: {
index: path.resolve(__dirname, 'src/index.html'),
about: path.resolve(__dirname, 'src/about.html')
}
}
}
}
Upvotes: 7
Reputation: 330
Make sure you add vite.config.js inside your Vite root directory (src).
module.exports = defineConfig({
base: '',
root: 'src',
build: {
outDir: '../dist'
}
});
Don't forget to update your package scripts. You'll need to add the --emptyOutDir
flag if you want the same behavior as in the default project structure (clear output folder before building).
"scripts": {
"dev": "vite src",
"build": "vite build src --emptyOutDir",
}
Upvotes: 18