基于vite多页面实现多端同构开发和部署

京东云开发者
• 阅读 235

背景

由于在开发前端项目中,后台管理端和用户端存在多个模块和页面逻辑可以复用,管理模块和用户端渲染模块使用同一套状态管理机制,只是在管理端和用户端的入口和路由模块不同,为了能够在开发时同时修改管理端和用户端共用模块,不用多项目工程修改和发布,我们基于vite多页面的基础上实现了多端同构开发和部署。



多端同构实现流程



基于vite多页面实现多端同构开发和部署



具体配置流程

1,多页面入口配置

首先我们可以在工程目录下创建多页面文件,不同页面配置的入口entry不同来建立多入口,

以下我们以管理端和用户端两个端为例来说明实现流程

比如:

管理端入口配置

admin/index.html

<body>
    <div id="app"></div>
    <script type="module" src="/src/admin.js"></script>
  </body>

admin.js

import { createApp } from 'vue'
import App from './admin.vue'
import router from './adminRouter';
import store from './store'
const app = createApp(App)
app.use(store).use(router)
app.mount('#app')



用户端:public/index.html

<body>
    <div id="app"></div>
    <script type="module" src="/src/public.js"></script>
 </body>

public.js

import { createApp } from 'vue'
import App from './public.vue'
import router from './publicRouter';
const app = createApp(App)
app.use(store).use(router)
app.mount('#app')

2,用户访问权限判断

不同的用户有不同的角色身份,我们需要根据用户登录后的角色来判断是否可以访问该入口,如果该用户不具备该入口的访问权限,我们需要在入口处拦截进行提示或者让页面重定向到拥有权限的入口处, 这块可以通过前端请求处理也可以,通过服务端配置角色和白名单类型处理。

下边以前端调用后端接口实现

以public.js为例

import { createApp } from 'vue'
import App from './public.vue'
import router from './publicRouter';
fetch(/xxx/).then((res)=> {
    if(res) {
        const app = createApp(App)
        app.use(store).use(router)
        app.mount('#app')
    } else {
        /** 跳转到其他有权限页面 或者进行无权限提示**/
    }
})

3,路由模式匹配

每个端应用建议配置自己的路由,用于和其他端模块资源划分

常用的路由分为hash模式和history模式,不同模式下的配置路由略有差异,一般history模式需要通过服务端支持实现,否则会出现刷新页面出现404的情况。

hash模式实现

管理端:adminRouter

import { createRouter, createWebHashHistory } from 'vue-router';
const router = createRouter({
    history: createWebHashHistory('/pageadmin/'),
    routes:[{
        path: '/page1',
        name: 'page1',
        component:() => import('@/page1.vue')
    }]
});

export default router;

用户端:publicRouter

import { createRouter, createWebHashHistory } from 'vue-router';
const router = createRouter({
    history: createWebHashHistory('/pagepublic/'),
    routes:[{
        path: '/page1',
        name: 'page1',
        component:() => import('@/page1.vue')
    }],
});

export default router;

history模式实现

history模式的实现管理端和用户端同hash模式,将createWebHashHistory改为createWebHistory即可:

import { createRouter, createWebHistory } from 'vue-router';
const router = createRouter({
    history: createWebHistory('/xxx/'),
    routes:[{
        path: '/page1',
        name: 'page1',
        component:() => import('@/page1.vue')
    }],
});

export default router;

history本地开发刷新404解决

history模式,由于hash模式时url带的#号后面是哈希值不会作为url的一部分发送给服务器,而history模式下当刷新页面之后浏览器会直接去请求服务器,而服务器没有这个路由,于是就出现404, 为了解决该问题,我们可以采用如下方案

通过配置代理,将访问的路由指向我们本地开发服务器目录文件

proxy: {
  '/pageadmin/': {
    target: 'http://easy-page.local.jdl.com:8089',
    changeOrigin: true,
    rewrite: (path) =>'/admin/index.html'
  },
  '/pagepublic/': {
     target: 'http://easy-page.local.jdl.com:8089/',
     changeOrigin: true,
     rewrite: (path) => '/public/index.html'
  }
}



4,vite.config.js入口配置

build: {
      rollupOptions: {
        input: {
          admin: resolve(__dirname, 'admin/index.html'),
          public: resolve(__dirname, 'public/index.html'),
        },
      },
}

打包后的目录结构

打包后,我们可以看到生成了两个入口文件 admin/index.html 和 public/index.html

assets是两个入口共用的资源内容包括 js,css,png等等



基于vite多页面实现多端同构开发和部署



生产配置

生产环境我们也需要根据url路由区分访问入口, 我们可以根据资源的访问路径,将其指定到不同的应用入口来实现不同端访问的资源内容不同,同时可以在服务端配置检测客户端的userAgent来现在各个端访问设备,可以给各个端配置白名单来限制用户访问

location /pageadmin {
   add_header Cache-Control  no-store;
   try_files $uri $uri/  /admin/index.html;
}
location /pagepublic {
    add_header Cache-Control  no-store;
    try_files $uri $uri/  /public/index.html;
}

总结

以上是我们基于vite多页面同构方案来实现多个端一套代码开发构建部署,实现工程模块中相同模块和资源的共享复用,减少多个应用的创建和多域名申请,以及多个应用之间相互关联交互,通过path来区分不同的用户访问。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java高级软件架构师实战培训阶段一
第01节课:整体课程内容概览\以下为Maven补充和Git部分第02节课:Maven补充:分模块、分工程管理第03节课:Maven补充:多模块,多Web应用,合并成一个
kenx kenx
3年前
SpringBoot+Maven 多模块项目的构建、运行、打包实战
前言最近在做一个很复杂的会员综合线下线上商城大型项目,单模块项目无法满足多人开发和架构,很多模块都是重复的就想到了把模块提出来,做成公共模块,基于maven的多模块项目,也好分工开发,也便于后期微服务重构使用场景我刚开始创建项目的时候是基于单模块,开发的,我先开发的接口api项目结构是这样的core模块是公共模块,mallapi是小程序api,随然单体
Stella981 Stella981
3年前
FikkerCDN主控
FikkerCDN主控系统是一个免费的,开源的CDN加速管理平台,可对大量FikkerCDN节点进行集中管理,系统分为管理端和用户端,可以快速搭建好CDN运营平台,3分钟建立自有的CDN节点群;如果你有多余的服务器资源,就可以通过FikkerCDN快速的建立起自己的CDN加速节点,国内、国外、联通、电信等线路任由你分发。每部署一个CDN节点只需
Stella981 Stella981
3年前
Spring Boot 监控和管理生产环境
springbootactuator模块提供了一个监控和管理生产环境的模块,可以使用http、jmx、ssh、telnet等拉管理和监控应用。审计(Auditing)、健康(health)、数据采集(metricsgathering)会自动加入到应用里面。首先,写一个最基本的springboot项目。基于Maven的项目添加‘starte
Stella981 Stella981
3年前
SpreadJS 纯前端表格控件应用案例:表格数据管理平台
由某科技公司研发的表格数据管理平台,是一款面向业务和企业管理系统定制开发的应用平台,包括类Excel设计器、PC应用端和移动应用端等应用模块。该平台具备强大的业务配置和集成开发能力,对于企业客户的信息系统在管理模式、业务流程、表单界面等个性化需求,均可快速实现个性化配置。下面,让我们一起来看看该公司是如何在“表格数据管理平台”中应用表格技术,实现“
蓝牙智能设备数据采集平台化方案 | 京东云技术团队
由于AndroidAPP/IOSAPP平台和开发语言的差异,对开发端和用户端来说,在系统兼容适配、外接蓝牙的安装更新,以及不同平台之间的移植都有不同程度的制约。
提升前端开发效率的五种实用技术
组件化开发是一种将页面拆分成独立的可重用组件的开发方式。通过组件化开发,我们能够将复杂的界面逻辑拆分成独立的模块,提高代码的复用性和维护性。常用的组件化框架如React、Vue和Angular,它们提供了强大的组件化开发能力,使我们能够轻松构建复杂的用户界面,并提供了组件的生命周期管理和状态管理机制。