Change the output path for certain files during build - ViteJS
Asked Answered
M

2

9

I'm making a static multipage website with ViteJS (html, scss and JS) and I can't find the way to change the build path of html files to put them into the root of dist folder.

My project structure is:

├── dist
    └──...
    └──src
       └── pages
             └── some-page.html
    └──...
├── node_modules
├── src
    └── pages
        └── some-page.html
├── .gitignore
├── index.html
├── package-lock.json
├── package.json
└── vite.config.js

and I want:

├── dist
    └── ...
    └── some-page.html
    └── ...
├── node_modules
├── src
    └── pages
        └── some-page.html
├── .gitignore
├── index.html
├── package-lock.json
├── package.json
└── vite.config.js

my vite.config.js (as the documentation recommends) is:

const { resolve } = require('path')
const { defineConfig } = require('vite')

module.exports = defineConfig({
    build: {
        rollupOptions: {
            input: {
                main: resolve(__dirname, 'index.html'),
                multiminerales: resolve(__dirname, 'src/pages/some-page.html')
            }
        }
    }
})

So, I think I need to change the input object but I can't find any information about it, I know about public directory but it will break all my folders structure. What can I do?

Menzies answered 7/3, 2022 at 22:51 Comment(3)
Relevant, I think: Changing the input and output directory for multipage site - vitejs/vite GitHubGyrfalcon
This answer to "Vite - change ouput directory of assets" seems to indicate that you can change the entire path and filename of built files as you like, so that could be worth looking into. I could try it out and write up an answer?Gyrfalcon
I have tried, but I can't find how to make Vite actually use Rollup to bundle anything in a vanilla project. I may look into it more sometime if I get a chance.Gyrfalcon
L
0

You can use this configuration -

import { fileURLToPath, URL } from 'node:url'

    import { defineConfig } from 'vite'
    import vue from '@vitejs/plugin-vue'
    import vueJsx from '@vitejs/plugin-vue-jsx'

    export default defineConfig({
      root: resolve(path, 'templates'),
      base: 'https://aaronchristian.test/wp-content/themes/portfolio/',
      plugins: [vue(), vueJsx()],
      resolve: {
        alias: {
          '@': fileURLToPath(new URL('./src', import.meta.url))
        }
      },
      build: {
        rollupOptions: {
          input: {
            index: fileURLToPath(new URL('./src/main.js', import.meta.url)),
            'index.html': fileURLToPath(new URL('./templates/index.html', import.meta.url))
          },
          output: {
            dir: 'dist',
            entryFileNames: 'assets/[name].js',
            assetFileNames: 'assets/[name].[extname]',
            chunkFileNames: 'assets/[name].js'
          }
        }
      }
    })
Lotic answered 24/3, 2023 at 21:22 Comment(1)
Having that code as a snippet makes no sense, as it cannot be run on its own. Please edit it to be just a plain code block (with the javascript language identifier).Gyrfalcon
C
-1

Yeah, I faced such problem, too.

For me it works to move index.html to src/pages

Then in vite.config.js specify root: './src/pages'

So, your config may look like:

const { resolve } = require('path')
const { defineConfig } = require('vite')

module.exports = defineConfig({
    root: './src/pages',
    build: {
        rollupOptions: {
            input: {
                main: resolve(__dirname, 'src/pages/index.html'),
                multiminerales: resolve(__dirname, 'src/pages/some-page.html')
            }
        }
    }
})
Circumpolar answered 9/5, 2022 at 16:34 Comment(1)
The root option doesn't work if you want to use .env files or public folder. I'd like to just set output html pathPearle

© 2022 - 2024 — McMap. All rights reserved.