51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 355|回复: 0
打印 上一主题 下一主题

[资料] Monorepo 架构搭建微前端部署

[复制链接]
  • TA的每日心情
    无聊
    前天 09:14
  • 签到天数: 938 天

    连续签到: 5 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2023-5-16 14:45:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    前端项目在本地开发完成后,接下来就需要考虑如何部署上线。主应用和微应用都应该是独立开发和部署的,属于不同的仓库。
      一、 部署在同一服务器
      如果服务器数量有限,或不能跨域等原因需要把主应用和微应用部署在一起。
      通常的做法是主应用部署在一级目录,微应用部署在二/三级目录。
      1.1 微应用改造
      由于微应用部署在非根目录,微应用打包之前需要配置webpack构建时的publicPath为目录名称,以便于主应用注册微应用后能正常访问。
      output: {
              filename: isBuild ? '[name].[contenthash].js' : '[name].js',//编译时要加hash防止缓存
              path: path.join(__dirname, 'dist'),//产物输出目录
              publicPath: "/mkc/",
              chunkFilename: isBuild ? '[name].[contenthash].chunk.js' : '[name].chunk.js',
              library: `${pkgJson}-[name]`,
              libraryTarget: 'umd',
              jsonpFunction: `webpackJsonp_${pkgJson}`,
              globalObject: 'window'
          },


      1.2 主应用改造
      主应用在注册微应用时,需要注意:
      ·activeRule不能和微应用的真实访问路径一样;
      · 微应用的真实访问路径就是entry,entry可以是相对路径;
      · 微应用entry路径最后面的 / 不可省略;
      /**
       * 微应用为hash,注册微应用
       * @param {*} hash
       * @returns
       */
      const getActiveRule = (hash) => (location) => location.hash.startsWith(hash);
      const defApps = [
        {
          name: 'imarket',
          entry: `/life/`,
          container: '#subapp-container',
          activeRule: getActiveRule('#/imarket'),
        },
        {
          name: 'MKCenter',
          entry: `/mkc/`,
          container: '#subapp-container',
          activeRule: getActiveRule('#/MKCenter'),
        },
      ]


      二、部署在不同服务器
      第二种方案主微应用部署在不同的服务器,使用Nginx代理进行访问。一般这么做是因为不允许主应用跨域访问微应用。
      具体思路是将主应用服务器上一个特殊路径的请求全部转发到微应用的服务器上,即通过代理实现“微应用部署在主应用服务器上”的效果。
      例如,主应用在 A 服务器,微应用在 B 服务器,使用路径?/app1?来区分微应用,即 A 服务器上所有 /app1 开头的请求都转发到 B 服务器上。
      此时主应用的?Nginx?代理配置为:
      /app1/ {
        proxy_pass http://www.b.com/app1/;
        proxy_set_header Host $hostserver_port;
      }


      主应用注册微应用时,entry?可以为相对路径,activeRule?不可以和?entry?一样(否则主应用页面刷新就变成微应用):
      registerMicroApps([
        {
          name: 'app1',
          entry: '/app1/', // http://localhost:8080/app1/
          container: '#container',
          activeRule: '/child-app1',
        },
      ],


      三、方案选择
      具体选择那种部署方案,依据项目组实际情况而定,这里我选取了第一种部署方案即:主、微应用部署在同一服务器上。
      进行部署时,下面四个要素需要注意:
      ·真实路径:服务器上,微应用的真实访问路径;
      · publicPath:微应用打包时,webpack构建时output出口配置;
      · activeRule:注册微应用时,微应用响应路由的规则;
      · entry:微应用入口路径;

      部署到线上后的目录结构如下:



    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-4-28 03:16 , Processed in 0.063495 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表