vue脚手架3——多页路由与模板解析

Vue3 多页面开发详解,详细配置、场景、问题及解决方案 在 Vue3 中,虽然默认推荐单页面应用(SPA),但多页面应用(MPA)在一些场景下更合适。 阅读详情

构建实战篇 3:多页路由与模板解析

上篇文章中我们成功打包并输出了多页文件,而构建一个多页应用能够让我们进一步了解项目配置的可拓展性,可以对学习 Vue 和 webpack 起到强化训练的效果,本文将在此基础上主要针对多页路由及模板的配置进行系列的介绍。

路由配置

1. 跳转

在配置路由前,首先我们要明确一点就是,多页应用中的每个单页都是相互隔离的,即如果你想从 page1 下的路由跳到 page2 下的路由,你无法使用 vue-router 中的方法进行跳转,需要使用原生方法:location.href 或 location.replace。

此外为了能够清晰的分辨路由属于哪个单页,我们应该给每个单页路由添加前缀,比如:

  • index 单页:/vue/
  • page1 单页:/vue/page1/
  • page2 单页:/vue/page2/

其中 /vue/ 为项目的二级目录,其后的目录代表路由属于哪个单页。因此我们每个单页的路由配置可以像这样:

/* page1 单页路由配置 */

import Vue from 'vue'
import Router from 'vue-router'

// 首页
const Home = (resolve => {
    require.ensure(['../views/home.vue'], () => {
        resolve(require('../views/home.vue'))
    })
})

Vue.use(Router)

let base = `${process.env.BASE_URL}` + 'page1'; // 添加单页前缀

export default new Router({
    mode: 'history',
    base: base,
    routes: [
        {
            path: '/',
            name: 'home',
            component: Home
        },
    ]
})

我们通过设置路由的 base 值来为每个单页添加路由前缀,如果是 index 单页我们无需拼接路由前缀,直接跳转至二级目录即可。

那么在单页间跳转的地方,我们可以这样写:

<template>
  <div id="app">
    <div id="nav">
      <a @click="goFn('')">Index</a> |
      <a @click="goFn('page1')">Page1</a> |
      <a @click="goFn('page2')">Page2</a> |
    </div>
    <router-view/>
  </div>
</template>

<script>
export default {
    methods: {
        goFn(name) {
            location.href = `${process.env.BASE_URL}` + name
        }
    }
}
</script>

但是为了保持和 Vue 路由跳转同样的风格,我可以对单页之间的跳转做一下封装,实现一个 Navigator 类,类的代码可以查看本文最后的示例,封装完成后我们可以将跳转方法修改为:

this.$openRouter({
    name: name, // 跳转地址
    query: {
        text: 'hello' // 可以进行参数传递
    },
})

使用上述 $openRouter 方法我们还需要一个前提条件,便是将其绑定到 Vue 的原型链上,我们在所有单页的入口文件中添加:

import { Navigator } from '../../common' // 引入 Navigator

Vue.prototype.$openRouter = Navigator.openRouter; // 添加至 Vue 原型链

至此我们已经能够成功模仿 vue-router 进行单页间的跳转,但是需要注意的是因为其本质使用的是 location 跳转,所以必然会产生浏览器的刷新与重载。

2. 重定向

当我们完成上述路由跳转的功能后,可以在本地服务器上来进行一下测试,你会发现 Index 首页可以正常打开,但是跳转 Page1、Page2 却仍然处于 Index 父组件下,这是因为浏览器认为你所要跳转的页面还是在 Index 根路由下,同时又没有匹配到 Index 单页中对应的路由。这时候我们服务器需要做一次重定向,将下方路由指向对应的 html 文件即可:

/vue/page1 -> /vue/page1.html
/vue/page2 -> /vue/page2.html

在 vue.config.js 中,我们需要对 devServer 进行配置,添加 historyApiFallback 配置项,该配置项主要用于解决 HTML5 History API 产生的问题,比如其 rewrites 选项用于重写路由:

/* vue.config.js */

let baseUrl = '/vue/';

module.exports = {
    ...
    
    devServer: {
        historyApiFallback: {
            rewrites: [
                { from: new RegExp(baseUrl + 'page1'), to: baseUrl + 'page1.html' },
                { from: new RegExp(baseUrl + 'page2'), to: baseUrl + 'page2.html' },
            ]
        }
    }
    
    ...
}

上方我们通过 rewrites 匹配正则表达式的方式将 /vue/page1 这样的路由替换为访问服务器下正确 html 文件的形式,如此不同单页间便可以进行正确跳转和访问了。最后需要注意的是如果你的应用发布到正式服务器上,你同样需要让服务器或者中间层作出合理解析,参考:HTML5 History 模式 # 后端配置例子

而更多关于 historyApiFallback 的信息可以访问:connect-history-api-fallback

模板配置

上篇文章我们已经介绍了关于多模板的读取和配置,在配置 html-webpack-plugin 的时候我们提到了自定义配置,这里我将结合模板渲染的功能来进行统一介绍。

1. 模板渲染

这里所说的模板渲染是在我们的 html 模板文件中使用 html-webpack-plugin 提供的 default template 语法进行模板编写,比如:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>模板</title>
    <% for (var chunk in htmlWebpackPlugin.files.css) { %>
        <% if(htmlWebpackPlugin.files.css[chunk]) {%>
            <link href="<%= htmlWebpackPlugin.files.css[chunk] %>" rel="stylesheet" />
        <%}%>
    <% } %>
  </head>
  <body>
    <div id="app"></div>
    <!-- built files will be auto injected -->

    <% for (var chunk in htmlWebpackPlugin.files.js) { %>
        <% if(htmlWebpackPlugin.files.js[chunk]) {%>
            <script type="text/javascript" src="<%= htmlWebpackPlugin.files.js[chunk] %>"></script>
        <%}%>
    <% } %>
  </body>
</html>

以上我们使用模板语法手动获取并遍历 htmlWebpackPlugin 打包后的文件并生成到模板中,其中的 htmlWebpackPlugin 变量是模板提供的可访问变量,其有以下特定数据:

"htmlWebpackPlugin": {
    "files": {
        "css": [ "main.css" ],
        "js": [ "assets/head_bundle.js", "assets/main_bundle.js"],
        "chunks": {
            "head": {
                "entry": "assets/head_bundle.js",
                "css": [ "main.css" ]
            },
            "main": {
                "entry": "assets/main_bundle.js",
                "css": []
            },
        }
    }
}

我们通过 htmlWebpackPlugin.files 可以获取打包输出的 js 及 css 文件路径,包括入口文件路径等。

需要注意的是如果你在模板中编写了插入对应 js 及 css 的语法,你需要设置 inject 的值为 false 来关闭资源的自动注入:

/* utils.js */
...

let conf = {
    entry: filePath, // page 的入口
    template: filePath, // 模板路径
    filename: filename + '.html', // 生成 html 的文件名
    chunks: ['manifest', 'vendor',  filename],
    inject: false, // 关闭资源自动注入
}

...

否则在页面会引入两次资源,如下图所示:

2. 自定义配置

在模板渲染中,我们只能够使用 htmlWebpackPlugin 内部的一些属性和方法来进行模板的定制化开发,那么如果遇到需要根据不同环境来引入不同资源,同时不同模板间的配置还可能不一样的需求情况的话,我们使用自定义配置会比较方便。比如我们需要在生产环境模板中引入第三方统计脚本:

/* vue.config.js */

module.exports = {
    ...
    
    pages: utils.setPages({
        addScript() {
            if (process.env.NODE_ENV === 'production') {
                return `
                    <script src="https://s95.cnzz.com/z_stat.php?id=xxx&web_id=xxx" language="JavaScript"></script>
                `
            }

            return ''
        }
    }),
    
    ...
}

然后在页面模板中通过 htmlWebpackPlugin.options 获取自定义配置对象并进行输出:

<% if(htmlWebpackPlugin.options.addScript){ %>
    <%= htmlWebpackPlugin.options.addScript() %>
<%}%>

同时你也可以针对个别模板进行配置,比如我想只在 Index 单页中添加统计脚本,在 Page1 单页中添加其他脚本,那么你可以给 addScript 传入标识符来进行判断输出,比如:

<% if(htmlWebpackPlugin.options.addScript){ %>
    <%= htmlWebpackPlugin.options.addScript('index') %>
<%}%>

同时为 addScript 方法添加参数 from:

addScript(from) {
    if (process.env.NODE_ENV === 'production') {
        let url = "https://xxx";
    
        if (from === 'index') {
            url = "https://s95.cnzz.com/z_stat.php?id=xxx&web_id=xxx";
        }
        
        return `
            <script src=${url} language="JavaScript"></script>
        `
    }

    return ''
}

这样我们就完成了自定义配置中的模板渲染功能。当然根据实际项目需求你的自定义配置项可能会更加复杂和灵活。

结语

通过 2 小节的学习,相信大家对 Vue 多页应用的构建已经有所了解。本文在第 1 节的基础上重点介绍了多页路由及模板的配置,阐述了其与单页应用的不同之处,同时针对模板自定义配置的使用场景给出了简单的实例,希望大家在了解的基础上将下方的实例代码作为参考,进行相应的实战。

本案例代码地址:multi-page-project

思考 & 作业

  • 多页应用中各自的 Vuex Store 信息能实现共享吗?

  • html-webpack-plugin 如何解析非 .html 的模板,比如 .hbs,应该如何配置?

Vue 3 路由管理实战:构建多页面博客导航 - 掌握 Vue Router 实现 SPA 页面跳转 观察浏览器地址栏的 URL 变化,当您点击不同的导航链接时,URL 也会随之改变,这表明 Vue Router 已经成功实现了基于 URL 的路由管理。我们将构建一个简单的用户登录/注册功能,学习 Vuex 的状态管理模式,理解 store, mutations, actions, getters 的概念,构建更完善的 Vue 3 应用。接下来,我们将一步步使用 Vue Router 为我们的技术博客添加多页面导航功能,深入理解 Vue Router 的配置和使用。 阅读详情

相关推荐

Vue 项目构建与开发入门:使用 pages 构建多页应用

本文主要讲解了多页应用开发中多入口和多模板的实现方式,通过针对 webpack 配置的修改我们基本了解了多页模式与单页模式的差异性,下篇文章我们将以本文内容为基础进一步完善我们的多页应用配置,使其能够正常适应实际的开发与生产。

YOLO 773

vue3-ts-vite:vue 项目 配置 多页面应用

Vue是一种单页面应用程序(SPA)框架,这意味着Vue应用程序通常只有一个HTML页面,而在该页面上进行动态的内容更改,而不是每次都加载新的HTML页面。但是,有时候我们需要在同一应用程序中拥有多个独立的页面,每个页面都可以单独处理路由和逻辑。这就是多页面应用(MPA)的概念。在Vue中,实现多页面应用程序的方法是使用Vue的多入口特性,即通过配置多个入口文件来实现。每个入口文件都有自己的路由配置、组件和其他相关资源。

snow的博客 1万+

Vue CLI 3 多页面应用配置指南

在多页面应用(MPA)中,入口点HTML文件指的是每个页面的HTML文件,它们作为网页的骨架,负责承载和展示应用中的内容。每个入口点HTML文件对应一个页面,它们的存在是构建和组织多页面应用不可或缺的一部分。这些文件之所以重要,是因为它们为应用提供了一个结构化的视图,通过其中的引用标签(如<link>和<script>),将CSS样式和JavaScript脚本等资源与页面连接起来。同时,入口点HTML文件也能够帮助搜索引擎更好地理解和索引页面内容,这对于网站的SEO优化是至关重要的。

weixin_29009401的博客 1187

vue3配置多页面

vue3配置多页面

1733

基于VueCLI3的多页应用开发实战演示

Vue CLI 3 是 Vue 官方推出的现代化前端开发工具,基于 Webpack 4 构建,提供了开箱即用的项目初始化体验。相比 Vue CLI 2,其去除了繁琐的build和config目录,将配置抽象为,提升了可维护性与扩展性。核心优势包括:开箱即用:内置 Babel、TypeScript、ESLint、PostCSS 等常用工具,无需手动配置。Vue UI 图形化界面:通过vue ui命令即可可视化管理项目、插件与构建配置。插件系统架构。

weixin_35749796的博客 949

SLAM算法的优缺点

SLAM(Simultaneous Localization and Mapping,同时定位与地图构建)算法是一种通过传感器数据实时估计机器人自身位置和构建环境地图的技术。

selenia8860的博客 2906

Vue3多页面开发

Vue3多页面开发 在Vue3中,多页面开发的配置比较简单,下面来看一下具体的操作步骤: 1.使用vue创建单页面应用程序 见《Vue3脚手架指南》文章 2.在项目的根目录下创建vue.config.js文件,如果已经创建则忽略 3.在src目录下新建module文件夹,用于存放多页面相关文件 module文件夹下用来存放页面文件,一个页面需要有最少三个文件构成,.html、.js、.vue,所以要创建一个最终的页面,我们需要创建三个文件,在实际开发中,最好根据自己的习惯或者公司的.

chenhaiy的博客 1万+

【Proteus】NE555纯硬件实现LED呼吸灯效果,附源文件,效果展示

本设计通过NE555与三极管的巧妙配合,仅用基础元件实现了呼吸灯效果。核心在于利用RC积分电路将PWM信号转换为控制电压,并通过负反馈动态调节占空比。Proteus仿真验证了方案的可行性,读者可进一步优化参数或扩展功能,探索更多硬件设计可能性。

2201_75797484的博客 2979

Vue多页面路由与模版解析

本文介绍了Vue 多页应用的构建,介绍了多页路由及模板的配置,阐述了其与单页应用的不同之处。

念旧的博客 2066

机器学习入门指南:Jupyter Notebook实战

对于机器学习工程师而言,他们更擅长的是算法、模型、数据探索的工作,而对于工程化的能力则并不是其擅长的工作。Jupyter Notebook生成PMML文件1​​​​​​​。Jupyter Notebook生成PMML文件2​​​​​​​。PySpark Notebook建模 -折线图​​​​​​​。TensorFlowNotebook建模​​​​​​​。R Notebook建模 - 散点图​​​​​​​。PySpark Notebook建模​​​​​​​。R Notebook获取训练数据集​​​​​​​。

datacreating的博客 1974

WRF后处理:python cartopy绘制土地利用/土地分类图//python绘制WRF下垫面类型(以北极为例)

下垫面类型对于WRF的地表过程十分重要,而在我们研究WRF的地表过程之前,需要对输入的土地利用类型进行一些绘制,以便后续的修改。LU_MODIS21函数定义了绘制的土地类型、标签与对应色标,我们使用时,直接引用LU_MODIS21()即可返回。其实很简单,只要将你拥有的土地类型数据提取出来,将原本函数中的labels和C切片,重新定义色标再绘制即可。在这里,我将以北极地区为例,绘制北极地区的WRF下垫面数据,我使用的MODIS21这类。

weixin_43750300的博客 3856

构建实战篇 3:多页路由与模板解析

构建实战篇 3:多页路由与模板解析 上篇文章中我们成功打包并输出了多页文件,而构建一个多页应用能够让我们进一步了解项目配置的可拓展性,可以对学习 Vue 和 webpack 起到强化训练的效果,本文将在此基础上主要针对多页路由及模板的配置进行系列的介绍。 路由配置 1. 跳转 在配置路由前,首先我们要明确一点就是,多页应用中的每个单页都是相互隔离的,即如果你想从 page1 下的路由跳到 page2 下的路由,你无法使用 vue-router 中的方法进行跳转,需要使用原生方法:location.href

乐夫天命兮的博客 339

【STK】手把手教你利用STK进行仿真-STK软件简介02 STK专业分析模块

STK/Astrogator是一个交互式轨道机动和深空探测计划工具,用于飞行器运行及任务分析,通过定义推力模型、目标星历、飞行器姿态,提供轨道机动的解决及优化方案。应用Astrogator分析轨道机动的可见性和地面站覆盖,用户可以快速、方便地进行全局分析。任务控制序列保存在STK场景中,用于任务运行、快速制定精确轨道机动方案。为在轨运行的飞行器制定或执行机动计划时,分析人员可以根据飞行过程数据,如发动机定标参数、实际初始轨道,计算出推进器点火和点火时机数据,用于发出指令及精炼机动计划。

weixin_44184852的博客 1864

vue脚手架2——使用 pages 构建多页应用

构建实战篇 2:使用 pages 构建多页应用 经过对单页应用配置的了解,相信大家应该对如何构建一个 Vue 单页应用项目已经有所收获和体会,在大部分实际场景中,我们都可以构建单页应用来进行项目的开发和迭代,然而对于项目复杂度过高或者页面模块之间差异化较大的项目,我们可以选择构建多页应用来实现。那么什么是多页应用,如何构建一个多页应用便是本文所要阐述的内容。 概念 首先我们可以把多页应用理解为由...

ding___dong的博客 5580

Python爬虫实战:逆向工程与异步爬虫技术,高效抓取国家知识产权局专利数据

相比于传统的Selenium,Playwright由微软开发,支持多浏览器(Chromium, Firefox, WebKit),API更现代,执行速度更快,并且能轻松录制用户操作生成代码。通常,列表中的摘要信息是缩略的,我们需要进入每个专利的详情页获取完整信息(如主权要求、法律状态等)。我们的第一步是手动操作一遍搜索流程,并用Playwright的“录制”功能或开发者工具,找出真正返回专利数据的那一个或多个网络请求。以友好的、对人类行为模拟的方式爬取数据是基本的网络礼仪,也能有效避免你的IP被封锁。

2201_76125261的博客 2419

Allegro Design Entry HDL(OrCAD Capture HDL)原理图是设计快速入门图文教程

Allegro Design Entry HDL是Cadence公司开发的原理图设计工具,也可与Allegro PCB设计工具无缝对接,虽然板级开发中不如Design Entry CIS(又名 OrCAD Capture CIS)的使用那么广泛,但是由于Design Entry HDL支持芯片的开发,所以有不少公司尤其是芯片背景公司,选择使用Design Entry HDL进行原理图设计。两个原理图开发工具的使用方法大同小异,本文简单介绍使用Allegro Design Entry HDL开始一个新的设计,

fydar的博客 4118

Vue使用pages构建多页应用

本文主要讲解了多页应用开发中多入口和多模板的实现方式,通过针对 webpack 配置的修改我们基本了解了多页模式与单页模式的差异性

念旧的博客 1594

从零开始:手把手教你设计人形机器人锂电池供电系统

人形机器人要像人类一样“活起来”,必须有稳定的“能量血液”——供电系统。本文聚焦锂电池供电系统如何根据机器人功耗选择合适的锂电池参数(容量、电压、放电倍率);如何设计电池管理系统(BMS)保护电池安全;如何解决机器人运动时的“瞬时大电流”供电难题;如何通过硬件电路和代码实现供电系统的监测与控制。用“机器人小助手的能量危机”故事引入锂电池供电系统;拆解锂电池核心参数(容量、电压、放电倍率)和供电系统三大组件(电池组、BMS、电源转换模块);

AI天才研究院 1758

推荐:ASP.NET Core 3.1与Vue.js多页面应用模板

推荐:ASP.NET Core 3.1与Vue.js多页面应用模板 在这个数字化的时代,构建高效且易于扩展的Web应用变得越来越重要。今天,我们向您推荐一款基于ASP.NET Core 3.1和Vue.js的多页面应用模板,它充分利用了TypeScript、Vuex、Vue Router以及SASS等前沿技术,帮助开发者快速启动复杂的前端项目。 项目介绍 这个开源项目提供了一个强大的模板,将Vue...

gitblog_00078的博客 790

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

vue脚手架使用pages快速构建一个多页应用

以上目录结构我们可以看出其实 pages 下的一个目录就是一个单页包含的功能,这里我们包含了 2个目录就构成了多页应用在单页应用中,我们的入口文件只有一个,CLI 默认配置的是 main.js,但是到了多页应用,我们的入口文件便包含了 index.js、index.html等,数量取决于 pages 文件夹下目录的个数,这时候为了项目的可拓展性,我们需要自动计算入口文件的数量并解析路径配置到 webpack 中的 entry 属性上,所以我们可以通过glob读取指定文件下指定的文件集合,方法如下:...

monthover的博客 1957

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

vue多html页面路由配置,vue cli2.X 多页面配置 history 路由配置处理

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?https://huzai.github.io/1.多页面配置 vue.config.js 里配置pages vue cli多页面配置文档module.exports = {pages: {index: {// page 的入口entry: 'src/index/main.js',// 模板来源template: 'pu...

weixin_32028323的博客 1024

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【亲测免费】 探索Vue3 MPA:新一代前端多页应用解决方案

探索Vue3 MPA:新一代前端多页应用解决方案 在这个快速发展的前端世界里, 是一个值得关注的项目,它将Vue3的强大性能与多页面应用程序(MPA)的灵活性完美结合。本文将深入解析该项目的核心技术,应用场景及其独特特性,以帮助更多的开发者了解并充分利用这个工具。 项目简介 Vue3 MPA 是基于最新的Vue.js 3.0框架构建的多页面应用程序模板。它简化了大型项目的初始化工作,并且提供了一套...

gitblog_00070的博客 812

vue中SPA与路由

vue中SPA与路由一、什么是SPA??单页面应用程序传统多页面应用程序优势二、SPA实现思路和技术点 一、什么是SPA?? 单页Web应用(single page application,SPA),就是只有一个Web页面的应用,是加载单个HTML页面,并在用户与应用程序交互时动态更新该页面的Web应用程序 单页面应用程序 只有第一次会加载页面, 以后的每次请求, 仅仅是获取必要的数据.然后, 由页面中js解析获取的数据, 展示在页面中 传统多页面应用程序 对于传统的多页面应用程序来说, 每次请求服务器返回

小七 621

VUE多页面

基本原则 1、entry配置多个js文件   webpack.base.config.js,修改entry部分:   原来只有一个:    entry: { app: "./src/main.js" },   修改成自己的多个js文件,我的是放在src/page下存放多个页面,每个页面一个文件夹,下面分别是 page1/page1.js, page2/...

weixin_30399871的博客 94

【Vue】——路由

Vue Router 是构建 Vue 3 单页面应用的基石。通过理解和掌握上述知识点——从基本配置、两种参数传递、嵌套路由,到更高级的编程式导航、Props 解耦和工作模式——你将能够构建出结构清晰、用户体验流畅的复杂单页应用。务必在实践中多加运用,以融会贯通。

2301_78540522的博客 1066
上一篇: vue脚手架2——使用 pages 构建多页应用
下一篇: vue脚手架4——项目整合与优化
ding___dong
博客等级 码龄7年 303粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值