Vue3 + Vite 多页面开发

Vue3 + Vite 多页面开发

Vue 被设计用来制作 SPA (单页面应用),想要进行多页面开发需要在构建工具(如 Vite )中进行配置。

目前 Vue 默认的脚手架工具为 Vite,本文基于 Vue3 + Vite 简单介绍一下配置多页面应用的方式。

前言

回顾传统的 HTML 开发项目,想要在“主页”和“详情页”之间跳转,通常会开发两个不同的 .html 页面,然后通过 a 标签进行跳转。

在 Vue 中使用了 Vue-Router 可以实现组件的跳转和渲染,在 Bulbox 中就是在单页面应用中通过 Vue-Router 的配置实现了“首页”和“详情页”的不同渲染。但是路由和功能稍复杂一点,或者是不同页面之间的功能相对独立,那这种方式就有点捉襟见肘。

那么如何构建一个多页面应用呢?

多页面就是指的有多个 HTML 页面,因此多页面应用必然要在当前的 Vue 项目中创建新的 HTML 页面,起初我以为只需要构建新的 .vue 即可,还是囫囵吞枣对 Vue 的理解不够。

其实创建多页面应用和编写传统的 HTML 是类似的,使用 npm create vue@latest 可以创建一个 Vue3 + Vite 的单页面应用,此时在根目录会有一个 index.html,这个是项目的默认入口。

我们只需要在根目录下继续创建其他的 HTML 页面就能实现跳转:

简化的 Vue 项目目录结构:

TestMultiPage
├─src
│  ├─App.vue
│  ├─App2.vue
│  ├─main.js
│  └─main2.js
├─test.html
└─index.html

然后通过 main.jsApp.vue 挂载到 index.html,通过 main2.jsApp2.vue 挂载到 test.html:

<!-- App.vue -->
<script setup>
function change() {
  window.location.href = "/test.html";
}
</script>

<template>
  This is index
  <button @click="change">跳转</button>
</template>

<style></style>
<!-- App2.vue -->
<script setup>
function change() {
  window.location.href = "/";
}
</script>

<template>
  This is Test
  <button @click="change">跳转</button>
</template>

<style></style>

此时点击跳转可以跳转到其他页面,但当我们使用 npm run build 之后会发现新建的 test 页面并没有被打包到 dist 中,因此也无法在打包后实现正常的多页面功能。

这是因为在 Vite 还是根据单页面的配置进行打包,如果希望打包后仍然能够正常使用,就必须对 Vite 进行配置。

开始配置

规范项目目录

在刚才的例子中可以看到跳转中使用的是:window.location.href = "/test.html";,必须要指定到具体的页面才能实现跳转,除了 url 的美观度,另一方面也会让项目变得复杂,我们可以将根目录下的 test.html 替换为以下结构的文件夹:

test
├─main.js // 之前 src/main2.js 需要移动到这里
└─index.html

这样做的好处是:

  1. 根目录结构清晰
  2. 单页面的配置被集合在了一起
  3. url 访问时只需要 /test/ 即可,浏览器会自动寻找该目录下的 index.html

如果创建了多个页面,则其组织结构可能如下(省略了部分文件目录):

TestMultiPage
├─src
│   ├─App.vue
│   ├─main.js
│   ├─assets
│   ├─components
│   ├─router
│   │    ├─index.js
│   └─views
├─page1
│   ├─main.js 
│   └─index.html
├─page2
│   ├─main.js 
│   └─index.html
├─page3
│   ├─main.js 
│   └─index.html
├─index.html
├─package-lock.json
├─package.json
├─README.md
└─vite.config.js

在 Vite 中配置

在 vite.config.js 中添加 build 选项,可以配置其 rollupOptions 属性实现多页面打包的配置:

//vite.config.js
build: {
    rollupOptions: {
        input: {
            main: '/index.html',
            page1: '/page1/index.html',
            page2: '/page2/index.html',
            page3: '/page3/index.html'
        }
    }
},

经过以上配置之后就可以实现 Vite 打包多页面应用了,但是在编辑多页面的时候需要注意路径问题。

多页面应用的开发

与开发单页面应用相同,多页面的开发的组件仍需要放在 /src 下面,可以参考以下目录结构(省略了具体文件):

src
├─assets
│  ├─css
│  ├─font
│  ├─img
│  └─js
├─page1
│  ├─components
│  ├─router
│  ├─views
│  └─page1.vue
├─page2
│  ├─components
│  ├─router
│  ├─views
│  └─page2.vue
├─page3
│  ├─components
│  ├─router
│  ├─views
│  └─page3.vue
├─components
├─router
├─store
├─views
└─App.vue

将对应的组件放到对应的 /src/page 下。

多页面跳转

在之前开发时存在一个误区,错误的把多页面应用中的不同页面看成了一个整体,认为不同的页面之间可以共享 Pinia、Vue-Router 等内容,但实际上这个想法是错误的。

我们对每个子页面都构建了一个新的 Vue 应用,因此每个应用的 Pinia、Vue-Router 都是独立的,我们可以引用同一个配置文件,但是无法实现其中的信息共享。

以 Vue-Router 为例,Vue-Router 解析的作用范围是其挂载的 Vue 实例,如果让其解析 Vue 实例之外的 URL 则不会达到预定效果。在不同页面之间实际上是切换了不同的 Vue 实例,因此不能够使用 Vue-Router 进行操作。

因此想要实现不同页面的跳转仍然需要 a 标签或者是在 JS 中使用 WebAPI 进行跳转:

// WebAPI
window.location.href = 'target_path'
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇