webpack将vue3单页面应用改造成多页面应用

news2025/1/6 20:02:32

上篇文章搞了个单页面vue,现在要将其改成多页面,只是简单尝试,给了例子

其实也就是改个webpack的入口和html模版的配置,其他的话,每个页面都有自己的vue和路由实例,pinia的话就共享吧

!important,这里是根据上篇文章配置的更改,更具体的配置可以参考上篇文章

一、改一下项目结构

大概就是在src下新建一个pages目录,然后再文件件下新建一个单页面运用,每个页面都有自己的main.js和App.vue,此外还有自己的views和router,至于通用组件components和pinia文件夹就放在pages的目录的同级区域,截图如下:

这里我把index文件夹具体展开了,page1里面也是类似的结构,只不过page1当中的index.js换成了page1.js,index.vue换成了page1.vue(实际上全写成main.js和App.vue也没啥事,我就是手欠)。每个page的配置其实类似vue-cli生成的单页面运用。( 忽略一下最下面的templates,那是存放html模板的地方)

二、更改webpack的配置

两个部分,首先我们这里有两个page,就有两个入口文件

entry: {
        index: path.resolve(__dirname, './src/pages/index/index.js'),
        page1: path.resolve(__dirname, './src/pages/page1/page1.js')
    },
    output: {
        path: path.resolve(__dirname, 'dist'), // 打包出口
        filename: '[name].js', // 打包完的静态资源文件名
        clean: true,//每次打包都会删除dist里面旧的内容
    },

注意和上篇比较,我这里的output的filename有些更改,这些配置不是最终的,最后还有优化一下结构

第二个则是html模板的改变,这里的话需要创建两个模板

plugins: [
        new HtmlWebpackPlugin({
            template: path.resolve(__dirname, './templates/index.html'), // 我们要使用的 html 模板地址
            filename: 'index.html', // 打包后输出的文件名
            title: 'index页面',
            chunks: ["index"]
        }),
        new HtmlWebpackPlugin({
            template: path.resolve(__dirname, './templates/page1.html'), // 我们要使用的 html 模板地址
            filename: 'page1.html', // 打包后输出的文件名
            title: 'page1页面',
            chunks: ["page1"]
        }),
        new VueLoaderPlugin() //vue-loader插件
    ],

 这里有两个htmlwebpackplugin的插件配置,每个配置对应了一个页面,两个模板我也放在了pages同级的template文件夹之中,template文件夹如下:

 里面的模版都是一样的,如下

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>
        <%= htmlWebpackPlugin.options.title %>
    </title>
</head>

<body>
    <div id="root"></div>
</body>

 就是body里面加了个id是root的格子,方便我们vue实例的挂载

另外要注意一下,我们两个page的vue实例是公用的一个pinia例子,我不太确定能不能用,所以的话,测试了一下,大体就是创建了一个userInfor的pinia模块,写下如下的配置

import { defineStore } from 'pinia'

export const useUserStore = defineStore('user', {
    state: () => {
        return { userName: "黄烽" }
    },
    // 也可以这样定义
    // state: () => ({ count: 0 })
    actions: {
        changeName () {
            this.userName = "gss"
        }
    },
})

在index页面的views的Home.vue上进行一下展示,这个页面还有一个按钮,触发之后会触发change函数,将页面导向page1.html

<template>
    <div class="msg">this msg is from page index
        <span>this is from span</span><br />
        <span>{{ "userName: " + user.userName }}</span>
        <button @click="change">跳转</button>
    </div>
</template>
<script setup>
import { onMounted } from 'vue';
import { useUserStore } from "../../../pinia/userInfor.js"
const user = useUserStore()
const testFunction = (msg) => {
    alert(msg)
}
onMounted(() => {
    testFunction("hhhh")
})
const change = () => {
    window.location.href = "./page1.html"
}
</script>
<style scoped lang="scss">
.msg {
    color: red;

    span {
        color: green;
    }
}
</style>

 对应的page1当中的Home.vue的配置如下

<template>
    <div class="msg">this msg is from page1
        <span>this is from span</span><br />
        <span>{{ "userName: " + user.userName }}</span>
        <button @click="change">改变用户姓名</button>
    </div>
</template>
<script setup>
import { onMounted } from 'vue';
import { useUserStore } from "../../../pinia/userInfor.js"
const user = useUserStore()
const change = () => {
    user.changeName()
}
const testFunction = (msg) => {
    alert(msg)
}
onMounted(() => {
    testFunction("hhhh")
})
</script>
<style scoped lang="scss">
.msg {
    color: red;

    span {
        color: green;
    }
}
</style>

基本上是一样的,除了msg内容不同之外,就是这里的change函数测试的是pinia当中的一个mutation。

最后一步就是打开dev 服务器测试,npm run dev,然后就行了,虽然有点简单,但是基本的意思是有了 ,打包之后dist文件夹里就是这个样子

 三、结尾

其实还是比较简单的,难的还是相关的优化,我个人对优化还是有些模糊的,有机会写几个优化的例子。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/543266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

界面控件DevExpress Blazor UI v22.2 - 报表、富文本编辑器组件增强

DevExpress拥有.NET开发需要的所有平台控件&#xff0c;包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具&#xff0c;该组件拥有众多新产品和数十个具有高影响力的功能&#xff0c;可为桌面、Web和移动应…

Linux做爬虫被封IP怎么办

如果您的 Linux 爬虫被目标网站封禁了 IP 地址&#xff0c;可以考虑以下几种解决方案&#xff1a; 1、切换 IP 地址 您可以使用代理服务器或 PPTP 等工具来改变您的 IP 地址。这些工具可以模拟不同的网络位置并使您的爬虫变得更加隐蔽。例如在 Python 中&#xff0c;可以通过…

Maven基础学习---2、Maven安装与配置

1、Maven核心程序解压与配置文件 1、Maven官网地址 首页&#xff1a; Maven – Welcome to Apache Maven(opens new window) 下载页面&#xff1a; Maven – Download Apache Maven(opens new window) 下载链接&#xff1a; 具体下载地址&#xff1a;https://dlcdn.apache.…

爱奇艺新财报:转机频频

配图来自Canva可画 今年开年&#xff0c;一部《狂飙》拉开了剧集大幕。据灯塔专业版数据显示&#xff0c;《狂飙》的全网正片播放市占率最高超过30%&#xff0c;春节期间稳定在25%以上。《狂飙》的爆火在观众群体中掀起了一波追剧狂潮&#xff0c;除了一路“狂飙”的收视率外&…

mysql,oracle使用区别

1.1concat&#xff0c;concat_ws&#xff0c;group_concat 配置方式 临时&#xff1a;SET SESSION group_concat_max_len 10240; 永久&#xff1a;配置文件my.ini增加group_concat_max_len10240 查看配置&#xff1a;show variables like group_concat_max_len; 2.1oracle-sta…

【C++】22.单例模式+类型转换

1.单例模式 1定义 之前已经学过一些设计模式 迭代器模式 -- 基于面向对象三大特性之一的 封装设计出来的 用一个迭代器类封装以后 不暴露容器结构的情况下 统一的方式访问修改容器中的数据 适配器模式 -- 体现的是一种复用 还有一些常见的设计模式如:工厂模式 装饰器模式…

定义制造业操作(定义 MES/MOM 系统)

制造业操作包含众多工厂级活动&#xff0c;涉及设备&#xff08;定义、使用、时间表和维护&#xff09;、材料&#xff08;识别、属性、位置和状态&#xff09;、人员&#xff08;资格、可用性和时间表&#xff09;&#xff0c;以及这些资源与包含其信息碎片的众多系统之间的互…

BFT 最前线 | 腾讯发布Q1季报;超2000伙伴测试阿里云通义千问;黄仁勋:芯片是NVIDIA加速与AI计算的的“理想应用”

原创 | 文 BFT机器人 AI视界 TECHNOLOGY NEWS 01 阿里云&#xff1a;超2000伙伴测试通义千问 行业专属大模型将成趋势 2023阿里云常州峰会上&#xff0c;阿里云智能中国区总裁黄海清透露&#xff1a;目前通义千问大模型已有超2000个合作伙伴进行测试。未来大模型面向各行各…

微信视频怎么录屏?2个方法教您轻松录制!

案例&#xff1a;怎么录制微信视频通话&#xff1f; 【我在和家人或者朋友打微信视频电话时&#xff0c;总是会发生一些有趣的事情&#xff0c;我想把这些美好的画面通过录屏记录下来。但我不知道如何录制微信视频通话&#xff1f;有没有大佬支个招&#xff01;】 微信视频通…

macOS Big Sur 11.7.7 (20G1345) 正式版 ISO、PKG、DMG、IPSW 下载

本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Windows 和 Linux 中创建可引导介质。 2023 年 5 月 18 日&#xff08;北京…

Boost开发指南-1.2progress_timer

progress_timer progress_timer也是一个计时器&#xff0c;它继承自timer&#xff0c;会在析构时自动输出时间&#xff0c;省去了timer手动调用elapsed()的工作&#xff0c;是一个用于自动计时相当方便的小工具。 progress_timer位于名字空间boost&#xff0c;为了使用progre…

浅谈PMO对组织战略的支持︱美团骑行事业部项目管理中心负责人边国华

美团骑行事业部项目管理中心负责人边国华先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;浅谈PMO对组织战略的支持。大会将于6月17-18日在北京举办&#xff0c;更多内容请浏览会议日程 议题内容简要&#xff1a; 战略是组织运行的…

Mysql【基础篇】—— mysql基础知识

Mysql【基础篇】—— mysql基础知识 ~&#x1f60e; 前言&#x1f64c;关系型数据库SQl 总结撒花&#x1f49e; &#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神贯注的上吧&#xff01;&#xff01;&#xff01; &#x1f60a;作者简介…

CPU、内存使用率告警问题处理

可能原因 CPU 或内存使用率过高&#xff0c;容易引起服务响应速度变慢、服务器登录不上等问题。而引起 CPU 或内存使用率过高可能由硬件、系统进程、业务进程或者木马病毒等因素所致。 排查思路 定位消耗 CPU 或内存的具体进程。对 CPU 或内存占用率高的进程进行分析。 如果是…

Mac下webstorm安装运行ant desgin pro踩坑记录

最近在跟做鱼皮大佬的《用户中心》项目练手&#xff0c;由于是2022年的项目而且不是用Mac做的&#xff0c;遇到了很多问题&#xff0c;在此记录一下。 1.安装node.js版本过高&#xff0c;目前官网最新长期支持版本是18.16.0 LTS。视频中安装的是16.14.0 LTS&#xff0c;如果遇…

文档处理容易“翻车”,来看看CCIG上的大咖怎么说

一、前言 哪怕在互联网时代高速发展的今天&#xff0c;文档依然是人们在日常生活、工作中产生的信息的重要载体。 学生的作业、开具的发票、医生的医嘱、合同、简历、金融票据等都是通过文档来呈现的&#xff0c;它在我们的生活中随处可见。 现在我们为了更高效、安全的开展业务…

金铲铲之战8.5版本

金币篇 1、如果有强大的经济基础&#xff0c;那么这个游戏赢下来回变的超级简单&#xff0c;因此获取更多的金币是吃鸡最基础也是最关键的保障 说明&#xff1a;金币可以用来升级、刷新商店和购买人口 金币来源&#xff1a; 1、基础金币&#xff1a;根据野怪波次给予金币奖励…

Spread.NET 16.1.0 Winform Crack-new

添加对将表单控件添加到工作表的支持。 2023 年 5 月 18 日 - 16:24新版本 特征 窗体 支持表单控件- 添加了对将表单控件添加到工作表的支持。表单控件是可以插入到工作表中以处理数据并按指定处理数据的对象。可以轻松引用表单控件并与单元格数据进行交互。有 8 种不同类型的表…

第三十五章 多个组件状态数据共享

之前&#xff0c;我们的求和案例只是一个组件&#xff0c;属于是自己玩自己&#xff0c;接下来我们通过多个组件&#xff0c;通过redux实现它们之间的数据互通。 步骤1&#xff1a;更改项目目录结构 src |--containers | |--Count |--redux | |--actions | |--count.js | |-…

内网渗透(七十八)之域权限维持之ACL滥用(下)

ACL滥用(下) 7、GenericAll 权限 应用于组 再来看看GenericAll 权限 应用于组如何进行权限维持。 由于用户hack是普通的域用户,因此他没有往Domain Admins 组添加用户的权限,如图所示,以用户hack 身份往Domain Admins 组中添加用户,可以看到,添加用户失败。 现在我们…