vue3配置多页面应用

28616次阅读 2125人点赞 作者: WuBin 发布时间: 2021-12-02 13:50:40
扫码到手机查看

多页面的目录结构

最近接到一个项目,要开发一套内部的资源管理系统。客户端界面我打算使用vue3构建,而使用vue3创建的项目默认都是单页面应用,但项目给开发人员暴露了配置多页面的方法:

在vue.config.js中配置pages对象。

本文通过一个案例,另外配置两个入口,并简单说一下多页面项目的目录规划。

我们先来搭建一下目录结构。首先初始化项目,流程可以参考:

Vue3.0基础项目的创建【配合gitee】

先来看一下我这次项目的设计图

通过设计图可以看到,我要添加的就是图库、视频、音频、字体4个分页。初始化项目后,就需要再对本地的src目录进行一下修改了,由于要分4个分页,所以在public中新增3个html文件,除了index.html,分别是video.html、audio.html、font.html。

之后在src中新增pages目录,作为多页面目录,并在pages目录下新建各个页面文件夹,将最终目录结果修改如下:

(名称后未加后缀的 代表是文件夹目录)
pics ------- 项目文件夹
  |-- node_modules
  |-- public
        |-- audio.html
        |-- favicon.ico
        |-- font.html
        |-- index.html
        |-- video.html
  |-- src
       |-- api 存放接口
       |-- common 存放公共的方法、样式等
       |-- components 各种公共组件 
       |-- pages 存放各种多页的文件夹
            |-- audio 音频库组件 对应audio.html
                 |-- views  存放该页面独有的视图组件文件夹
                 |-- App.vue  该(模板)页的主文件,等同单页应用src目录下的的App.vue
                 |-- main.js  该(模板)页的入口文件,等同单页应用src目录下的的main.js
            |-- font 字体库组件 对应font.html
                 |-- views  
                 |-- App.vue  
                 |-- main.js
            |-- image 图片库组件 对应index.html
                 |-- views
                 |-- router 该(模板)页(图库)的路由
                      |-- index.js
                 |-- App.vue  
                 |-- main.js
            |-- video视频库组件 对应video.html
                 |-- views  
                 |-- App.vue  
                 |-- main.js
    |-- vue.config.js 项目的webpack配置文件
注意: 多页面配置后,默认的index.html将无法正常访问,我们可以剪切src下的main.js、App.vue 将他们移动到pages/index目录下(本例中,我是移动到了image目录下),然后在vue.config.js中添加配置,添加index.html指向的组件(下面会介绍)。

在项目的初始化阶段,我们可以将原来的app.vue和main.js直接分别复制到pages下的每个单独的目录中即可。

// main.js是每个分页的入口
import { createApp } from 'vue';
import App from './App.vue';
import '@/common/less/index.less';
createApp(App).mount('#app');
// App.vue是每个分页面的根组件
<template>
<div>font</div>
</template>

<script type="text/ecmascript-6">
export default {
  name: "fontApp"
}
</script>

<style lang="less" rel="stylesheet/less" scoped></style>

如果那个分页需要路由的话,就在该分页下添加router/index.js文件,专门配置该分页下的路由配置。

这里我以vue-router4为例,简单贴一个使用的配置作为大家参考,更多详细使用,参考我的另一篇文章:

vue-router4使用

import { createRouter, createWebHashHistory } from 'vue-router';
import Detail from 'components/detail/detail';
import MainList from 'components/main-list/main-list';

const router = createRouter({
  history: createWebHashHistory(),
  routes: [
    {
      path: '/',
      redirect: '/home'
    },
    {
      path: '/home',
      name: 'mainlist',
      component: MainList,
      // 路由元信息定义每个路由进入退出的不同动画
      meta: { transition: 'aside-right' }
    },
    {
      path: '/detail',
      name: 'detail',
      component: Detail,
      meta: { transition: 'aside-right' }
    }
  ]
});

export default router;
最后需要注意的一点是,每个分页的vuex也是单独的!如果要共享数据,就要使用本地缓存等,切不要以为多个分页都可以用一个vuex,必须在每个分页的目录下单独配置store文件!

vue.config文件的配置

const path = require('path');
function resolve(dir) {
    return path.join(__dirname, dir)
}

module.exports = {
  // 打包文件的路径 注意每次需要更换
  publicPath: '',
  productionSourceMap: false,
  chainWebpack(config) {
    config.resolve.alias
        .set('components', resolve('src/components'))
        .set('common', resolve('src/common'))
        .set('api', resolve('src/api'))
  },
  // 多页面的配置 重点
  pages: {
    //配置展开写法
    // 如果是多页面配置,那么Index需要单独移动到pages字段中进行配置一下
    index: {
      entry: 'src/pages/image/main.js',
      template: 'public/index.html',
      filename: 'index.html',
      title: '信网资源 | 图库',
    },
    video: {
      // 必需项:应用入口配置,相当于单页面应用的main.js
      entry: 'src/pages/video/main.js',
      //可选项: 应用的html模版,相当于单页面应用的public/index.html,省略时默认与模块名一致
      template: 'public/video.html',
      // 编译后在dist目录的输出文件名,可选项,省略时默认与模块名一致
      filename: 'video.html',
      // 可选项,html中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>
      title: '信网资源 | 图库',
      // 可选项,需要引入的打包后的块
      // chunk-vendors指的是项目打包后抽离的公共库 video指的是我们的当前页面打包后的业务块
      // chunks: ['chunk-vendors','video']
    },
    audio: {
      entry: 'src/pages/audio/main.js',
      template: 'public/audio.html',
      filename: 'audio.html',
      title: '信网资源 | 音频库',
    },
    font: {
      entry: 'src/pages/font/main.js',
      template: 'public/font.html',
      filename: 'font.html',
      title: '信网资源 | 字体库',
    }
  }
};

具体配置参考上面的配置文件。其中请注意看pages字段的配置,关于每个字段的意义,参考video字段。

值得注意的是,每个字段,我推荐html文件名与字段名和组件名都相同。比如:

pages.video字段对应public/video.html文件pages/video组件目录

pages.index字段对应public/index.html文件pages/image组件目录(index作为分页一部分,比较特殊)

单独解释chunks的配置

chunks: ['chunk-vendors','video']

chunk-vendors指的是项目打包后抽离的公共库,video指的是我们的当前页面打包后的业务块,运行npm run build,在dist中可以看到,这块不明白的可以了解一下webpack的dllPlugin插件,或者干脆使用第二种简写配置,vuecli会帮助我们自动引入。

pages: {
       // 配置简写 直接用字符串表示模块入口,其他采用默认
       index: 'src/pages/image/main.js',
}

但是我不推荐大家这样做,如果不懂chunks功能的(比如我),直接省略此配置项目即可,让vue使用默认配置完成。

相关资料

点赞 支持一下 觉得不错?客官您就稍微鼓励一下吧!
关键词:vue,多页面
推荐阅读
  • uniapp实现被浏览器唤起的功能

    当用户打开h5链接时候,点击打开app若用户在已经安装过app的情况下直接打开app,若未安装过跳到应用市场下载安装这个功能在实现上主要分为两种场景,从普通浏览器唤醒以及从微信唤醒。

    10049次阅读 659人点赞 发布时间: 2022-12-14 16:34:53 立即查看
  • Vue

    盘点Vue2和Vue3的10种组件通信方式

    Vue中组件通信方式有很多,其中Vue2和Vue3实现起来也会有很多差异;本文将通过选项式API组合式API以及setup三种不同实现方式全面介绍Vue2和Vue3的组件通信方式。

    4677次阅读 346人点赞 发布时间: 2022-08-19 09:40:16 立即查看
  • JS

    几个高级前端常用的API

    推荐4个前端开发中常用的高端API,分别是MutationObserver、IntersectionObserver、getComputedstyle、getBoundingClientRect、requ...

    14754次阅读 967人点赞 发布时间: 2021-11-11 09:39:54 立即查看
  • PHP

    【正则】一些常用的正则表达式总结

    在日常开发中,正则表达式是非常有用的,正则表达式在每个语言中都是可以使用的,他就跟JSON一样,是通用的。了解一些常用的正则表达式,能大大提高你的工作效率。

    13961次阅读 525人点赞 发布时间: 2021-10-09 15:58:58 立即查看
  • 【中文】免费可商用字体下载与考证

    65款免费、可商用、无任何限制中文字体打包下载,这些字体都是经过长期验证,经得住市场考验的,让您规避被无良厂商起诉的风险。

    12705次阅读 1023人点赞 发布时间: 2021-07-05 15:28:45 立即查看
  • Vue

    Vue3开发一个v-loading的自定义指令

    在vue3中实现一个自定义的指令,有助于我们简化开发,简化复用,通过一个指令的调用即可实现一些可高度复用的交互。

    16940次阅读 1357人点赞 发布时间: 2021-07-02 15:58:35 立即查看
  • JS

    关于手机上滚动穿透问题的解决

    当页面出现浮层的时候,滑动浮层的内容,正常情况下预期应该是浮层下边的内容不会滚动;然而事实并非如此。在PC上使用css即可解决,但是在手机端,情况就变的比较复杂,就需要禁止触摸事件才可以。

    15465次阅读 1257人点赞 发布时间: 2021-05-31 09:25:50 立即查看
  • Vue

    Vue+html2canvas截图空白的问题

    在使用vue做信网单页专题时,有海报生成的功能,这里推荐2个插件:一个是html2canvas,构造好DOM然后转canvas进行截图;另外使用vue-canvas-poster(这个截止到2021年3月...

    30556次阅读 2403人点赞 发布时间: 2021-03-02 09:04:51 立即查看
  • Vue

    vue-router4过度动画无效解决方案

    在初次使用vue3+vue-router4时候,先后遇到了过度动画transition进入和退出分别无效的情况,搜遍百度没没找到合适解决方法,包括vue-route4有一些API都进行了变化,以前的一些操...

    26527次阅读 2041人点赞 发布时间: 2021-02-23 13:37:20 立即查看
交流 收藏 目录