vite配置多页面利用

官网的例子:

在开发过程中,简略地导航或链接到 /nested/ - 将会按预期工作,与失常的动态文件服务器体现统一。

也就是说,如果你的文件夹有如下层级:

{  src: {    pages: {      demo1: {        App.vue        main.ts      },      demo2: {        App.vue        main.ts      },      demo1.html      demo2.html    }  }}

那么通过vite的开发服务器拜访你的页面,须要拜访localhost:3000/src/pages/demo1.html#/index这样的链接,打包后index.html也会呈现在dist/src/pages文件夹下,很不不便。

能够通过配置vite.config.ts中的root选项解决

我的项目根目录(index.html 文件所在的地位)。能够是一个绝对路径,或者一个绝对于该配置文件自身的相对路径。
// vite.config.jsconst { resolve } = require('path')const { defineConfig } = require('vite')module.exports = defineConfig({    root:'src/pages'})

然而配置了root后,vite.config.ts中的大部分地址都会主动从root选项开始,例如:

// vite.config.jsComponents({      resolvers: [VantResolver()],      dts: 'src/types/components.d.ts' //这里的地址会被解析为src/pages/src/types,导致报错    })

这里的地址会被解析为src/pages/src/types,导致报错

no such file or directory, open '/xxxxx/src/pages/src/types/components.d.ts'

拼出绝对路径即可:

import { join } from 'path'const resolve = dir => join(__dirname, dir)Components({  resolvers: [VantResolver()],  dts: resolve('src/types/components.d.ts')})

此时的vite.config.ts:

// vite.config.jsconst { resolve } = require('path')const { defineConfig } = require('vite')module.exports = defineConfig({  root: 'src/pages',  build: {    rollupOptions: {      input: {        piat: resolve('src/pages/demo1.html'),        demo: resolve('src/pages/demo2.html')      }    }  }})

此时开发环境通过localhost:3000/demo1.html#/index即可拜访
打包后demo1.html也会在dist下

vite-plugin-html配置

vite-plugin-html依照官网文档配置即可。中文文档

import { defineConfig } from 'vite'import { createHtmlPlugin } from 'vite-plugin-html'export default defineConfig({  plugins: [    createHtmlPlugin({      minify: true,      pages: [        {          entry: 'src/main.ts',          filename: 'index.html',          template: 'public/index.html',          injectOptions: {            data: {              title: 'index',              injectScript: `<script src="./inject.js"></script>`,            },          },        },        {          entry: 'src/other-main.ts',          filename: 'other.html',          template: 'public/other.html',          injectOptions: {            data: {              title: 'other page',              injectScript: `<script src="./inject.js"></script>`,            }          },        },      ],    }),  ],})

但在多页面利用中,如果指定了root,vite-plugin-html会报错,相似问题:github-issue#53

屡次尝试后发现,vite-plugin-html配置项中的template,必须在没有root配置的状况下配置,而且应用resolve绝对路径会注入失败

ReferenceError: ejs:7title is not defined

解决:按环境配置root

root: mode === 'development' ? 'src/pages' : '',

vite-plugin-html配置:

pages: [        {          entry: resolve('src/pages/demo1/main.ts'), // 多页面的入口文件          filename: 'demo1.html', // 打包后生成的html文件名          template: 'src/pages/demo1.html', // 打包和注入应用的模板文件          injectOptions: {            data: {              title: '轻易什么title',              injectScript: `<script type="text/javascript" src="/anyscript.js"></script>`,            }          }        }      ],