普元EOS-微前端项目创建

1 前言

普元EOS采用微服务和微前端的思想来进行项目架构管理。

核心是Afcenter,这是框架的基座。Afcenter叫做应用联邦中心,提供了最核心的功能和服务,比如组织架构管理、人员账号管理、权限管理等等。

其他各功能都被开发为微服务(后端)和微前端(前端),然后整合到AFCenter中,最终形成一个完整的企业应用。

本文将简单的描述一下,如何基于EOS的微前端脚手架创建一个EOS的微前端项目。

2 环境准备

EOS的微前端是基于NodeJS的Vue2项目。

因此,需要安装nodejs,安装Vue2,这些就不啰嗦了,自行百度安装就行了。

然后需要安装primeton-cli 脚手架

安装命令如下:

bash 复制代码
npm install primeton-cli -g

3 创建微前端项目

命令格式如下

bash 复制代码
primeton create-m-app [moduleName] [debugPort]

primeton:primeton-cli 脚手架命令

create-m-app: 固定参数

moduleName: 自定义的微前端模块名,比如 myapp

debugPort: 测试环境的端口,比如 8003

例如:

bash 复制代码
primeton create-m-app myapp 8003

运行后生成的项目结构如下

4 安装项目的依赖

Vue项目都需要安装依赖,命令如下

bash 复制代码
npm install

这个时候可能会安装失败,因为有些依赖是普元EOS仓库才提供的。

执行下面的命令,注册一下新的仓库。当然,如果上面的命令执行没问题,就不需要再注册新的仓库了。

4.1 永久注册新仓库

下面这种方法注册仓库将永久生效。

bash 复制代码
npm config set registry=https://packages.aliyun.com/623d836256f85235f7dd713b/npm/npm-registry/

注册仓库后,需要登录这个仓库,命令如下

bash 复制代码
npm login
用户名: 623db7e13c6b5273a0764cb4
密码: UP1dH-IITR[I

最后执行下面代码安装依赖

bash 复制代码
npm install

4.2 临时注册新仓库

如果不希望新仓库被永久注册,可以采用临时注册的方法

临时方式进行登录,该命令将把新仓库的登录成功后的token存储到电脑上,后期使用该仓库的时候将直接取用该token。

bash 复制代码
npm login --registry=https://packages.aliyun.com/623d836256f85235f7dd713b/npm/npm-registry/

需要的账号和密码如下:

用户名: 623db7e13c6b5273a0764cb4
密码: UP1dH-IITR[I

登录成功后,就可以在npm install的命令上临时指定新仓库。

bash 复制代码
npm install --registry=https://packages.aliyun.com/623d836256f85235f7dd713b/npm/npm-registry/

这样,依赖就成功安装了。

5 开发方式启动

进行测试开发的时候,需要用下面的代码进行开发方式启动

bash 复制代码
npm run dev

启动后,在浏览器输入 http://127.0.0.1:8003 可以看到访问到了页面。

但是,EOS微前端是不能直接访问的,必须嵌入到AFCenter才行。

因此,到这一步,只是测试了一下微前端项目创建成功,并可以启动,但还没有结束。我们需要开发一个简单的页面,并访问它,才算成功了。

6 创建第一个vue页面

我不知道这样描述是不是准确,我不是做前端开发的,对vue也只知其然不知所以然,所以,我说创建一个vue页面,是不是有点措辞不准确?是组件?还是什么?不管了。反正目标就是项目中创建一个页面,然后有一些简单的功能,然后把这个页面在AFCenter中显示出来。

其实EOS微前端项目里面已经默认创建了一个页面,index.vue,内容很简单,就显示显示一行字符串。

bash 复制代码
<template>
    <div>
        myapp/src/views/index.vue
    </div>
</template>
<script>
export default {
    name: 'name', // 和菜单代码一致即可开启页面缓存
    data(){
        return {

        }
    },
    created(){

    },
    methods:{
        
    }
}
</script>

这个页面的路径如下:

所以,我就用这个页面来做演示了。

7 项目打包后嵌入到精简应用

这个例子,EOS项目我采用的是精简应用,关于精简应用的概念就不多说了,创建精简应用的例子可以看《普元EOS学习笔记-创建精简应用》。

在精简应用的项目下,有一个static文件夹,将微前端项目编译后的文件夹copy到精简应用的static文件夹,就完成了整合。

至于如何将微前端项目整合到微服务应用或独立应用,本文章不做表述,以后遇到了,我再另开文章吧。

7.1 生产方式嵌入精简应用

本方式是最终生产方式部署,将微前端项目编译后,然后嵌入到精简应用中。

在微前端项目文件夹中执行如下命令,完成编译。

bash 复制代码
npm run build:prod

编译后,可以在myapp文件夹的同级看到一个 dist 文件夹。看下图,红框的myapp是微前端项目的源代码,dist文件夹与myapp源代码同级,在dist文件夹下有一个 myapp文件夹,这个文件夹就是编译后的微前端静态资源。

将编译后的dist文件夹下的myapp 拷贝到精简应用的 static文件夹中。看下图,KgptDemo是精简应用,com.primeton.eos.KgptDemo.boot是精简应用的boot构件,将编译后的myapp拷贝到static文件夹下。

关于精简应用的项目结构,以及构件的概念,可以看我其他的文章了解。

然后就可以启动精简应用了。

这种方式是最终生产方式将微前端发布到精简应用中,这显然很不方便,总不能微前端改一点儿就编译发布到精简应用中啊。

所以,就需要第二种方式:开发方式嵌入。

7.2 开发方式嵌入精简应用

生产方式是直接将微前端编译后的静态资源拷贝到boot构件的static文件夹下,然后精简应用启动后,就可以通过 http://127.0.0.1:28015/myapp/ 这个地址访问。我的精简应用的端口是 28015

精简应用的启动后地址 http://127.0.0.1:28015

微前端项目启动后地址 http://127.0.0.1:8003/myapp

由此,我就想,如果我能将两个地址合并到一起,比如用nginx做方向代理

精简应用地址 http://127.0.0.1:28015 映射到 http://127.0.0.1:8015

微前端项目地址 http://127.0.0.1:8003/myapp 映射到 http://127.0.0.1:8015/myapp

这样,不就相当于微前端的路径嵌入到 精简应用下了,只要在精简应用的地址 http://127.0.0.1:8015 后访问路径 /myapp ,就可以访问到微前端的开发方式启动的服务了。

有了这个思路,我把精简应用启动,把微前端myapp也启动。

然后在nginx中配置反向代理如下:

bash 复制代码
server {
  listen       8015;
  server_name  localhost;

  location / {
    proxy_pass http://127.0.0.1:28015/;
    proxy_redirect off;

    proxy_set_header  Host $http_host;
    proxy_set_header  X-Real-IP $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto  $scheme;
    proxy_set_header  X-Forwarded-Uri  $request_uri;

    #rewrite "^/kkfv/(.*)$" /$1 break;
  }

  location /myapp/ {
    proxy_pass http://127.0.0.1:8003/myapp/;
    proxy_redirect off;

    proxy_set_header  Host $http_host;
    proxy_set_header  X-Real-IP $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto  $scheme;
    proxy_set_header  X-Forwarded-Uri  $request_uri;

    #rewrite "^/kkfv/(.*)$" /$1 break;
  }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   html;
  }
}

7.3 嵌入精简应用总结

这两种方式的思路,都是将myapp项目的访问路径放到精简应用下。

比如,精简应用的访问地址是 http://127.0.0.1:28015 ,想办法通过 http://127.0.0.1:28015/myapp 可以访问到myapp 就行了。

上面这些做到后,精简应用和myapp微前端的路径关系已经确立了,可以在AFCenter中进行具体的访问微前端页面的配置了。

8 精简应用中注册微前端

本节将演示在精简应用中注册微前端,并在AFCenter中访问微前端的页面。

8.1 精简应用和微前端的准备工作

精简应用命名为 KgptDemo ,端口是 28015

微前端命名为 myapp ,端口是 8003

启动精简应用 KgptDemo ,浏览器中访问 http://127.0.0.1:28015 看到AFCenter的登录页面。

启动微前端 myapp ,浏览器访问 http://127.0.0.1:8003/myapp/remoteEntry.js ,看到一个js代码。 这个remoteEntry.js文件是微前端的一个文件,有兴趣的同学请自行百度微前端进行学习了解。

在nginx中配置反向映射,配置脚本如下,关于这段代码放到nginx哪里,我就不啰嗦了,这属于nginx的知识。

bash 复制代码
server {
  listen       8015;
  server_name  localhost;

  location / {
    proxy_pass http://127.0.0.1:28015/;
    proxy_redirect off;

    proxy_set_header  Host $http_host;
    proxy_set_header  X-Real-IP $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto  $scheme;
    proxy_set_header  X-Forwarded-Uri  $request_uri;

    #rewrite "^/kkfv/(.*)$" /$1 break;
  }

  location /myapp/ {
    proxy_pass http://127.0.0.1:8003/myapp/;
    proxy_redirect off;

    proxy_set_header  Host $http_host;
    proxy_set_header  X-Real-IP $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto  $scheme;
    proxy_set_header  X-Forwarded-Uri  $request_uri;

    #rewrite "^/kkfv/(.*)$" /$1 break;
  }



  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   html;
  }
}

配置好后启动nginx

在浏览器访问 http://127.0.0.1:8015 看到AFCenter的登录页面。

浏览器访问 http://127.0.0.1:8015/myapp/remoteEntry.js ,看到一个js代码。

说明nginx已经完成了精简应用和微前端的反向代理。

至此,准备工作完成了。

8.2 AFCenter中添加myapp微前端模块

在浏览器访问 http://127.0.0.1:8015 , 打开AFCenter登录页面

输入账号和密码登录,建议用admin账号,防止因为权限问题又给操作者造成困惑。

在AFCenter上方主菜单点击应用中心

在应用中心 - 应用管理 - 应用信息 页面,找到 微前端模块设置

点击 添加微前端模块 按钮,在新增的微前端模块中,修改微前端模块的名字为 myapp ,微前端地址不用管。

然后点击测试按钮,如果显示下面的窗口说明微前端myapp添加成功。

8.3 添加myapp的index页面

刚刚已经将myapp添加到AFCenter中,然后需要将myapp的index页面添加为一个页面资源。

这里涉及两个概念:

8.3.1 myapp的index.vue是作为普通vue页面嵌入到AFCenter吗?

首先 myapp的index.vue文件,在开发的时候就是一个普通的vue页面,或者叫vue组件。

但index.vue是以微前端的一个组件被嵌入到AFCenter的。

在myapp项目下有一个 mfp.config.js 文件,这个文件将vue页面发布成为微前端的一个组件。

这些涉及到微前端技术的细节,有兴趣的同学可以自行百度。

8.3.2 AFCenter的页面资源是什么?

AFCenter中,页面是一种资源,程序员无论基于高开还是低开做出来的页面,都要添加到AFCenter中,作为页面资源,然后页面资源再被挂到AFCenter的菜单上,之后用户就可以访问了。

当然,AFCenter还有权限控制,控制着用户是否有权限访问页面资源。

好了,接下来我来操作如何将myapp的index添加为AFCenter的页面资源。

在应用中心 - 应用管理 - 资源管理 - 页面 ,点击 新建页面 按钮

然后在添加页面的窗口,输入如下内容

注意:类型、模块名称、标识,这三项都是下来选择的,编号和名称这两个是自己手动输入的。

添加成功后,在页面列表可以看到。

这里还要说一下页面分组,我这里没有添加新的分组,直接将页面添加到默认分组下,真实项目是需要自己管理页面分组的。

9 从页面myapp_index发布菜单

在页面myapp_index最右侧可以看到链接按钮"发布菜单",点击将该页面发布,并创建出对应的菜单。

菜单类型: 平台菜单。 不给自己找麻烦,就先选用平台菜单吧。平台指的是 AFCenter这个基座,当前应用指的是当前微服务项目。配置为平台菜单发布比较方便,发布为当前应用菜单后,角色权限管理要复杂的多,配置起来太麻烦。所以这里就选用平台菜单。

绑定角色:租户管理员。这是系统默认的一个角色,这个角色被分配给admin账号,具体实际项目中,要根据业务需要分配合理的角色。

根据我的理解,这里是对页面与角色进行了绑定,并不是对菜单与角色进行绑定

根据我的理解,AFCenter中角色绑定的是资源,资源包括页面、功能、数据等,菜单并不是一个资源

父菜单:我手动创建了一个菜单 测试菜单,姑且把它当做父菜单吧。

菜单编号、菜单名称:这些都是自动带出来的,也可以修改,默认是与页面的编号和名称相同,但完全可以自行改成任意名字。

菜单图标:随便选个图标,让菜单看起来漂亮点。

点击确定后,菜单就创建成功了

10 测试

在AFCenter中,刷新页面,然后在主菜单看到多出了一个 测试菜单,点击后,就可以打开 myapp的index页面了。

看起来好简陋啊,因为这个页面真的就是这么简陋。

简单对这个页面编辑一下,不需要重启 myapp 应用,不需要刷新页面,就看到页面内容变化了。

bash 复制代码
<template>
    <div>
        这是我第一个测试页面<br>
        添加一个按钮 <button>按钮01</button>
        <br>
         myapp/src/views/index.vue
    </div>
</template>

11 写在最后的话

粗糙的例子,但写的还算清楚,希望对各位同学有帮助,也是给自己的学习留下一点笔记。

相关推荐
研发小能1 分钟前
信创生态认证视角:国产DevOps平台选型的权威认证价值与实操评估方法
devops·devops平台·devops系统·devops厂商·研发效能平台
弹简特5 分钟前
【JavaEE03-前端部分】JavaScript入门:给网页注入灵魂,从基础到实战玩转交互!
前端·javascript·交互
天人合一peng5 分钟前
unity获得和修改button的text(TMP)
java·前端·unity
坚持不懈的大白6 分钟前
leetcode学习笔记2
笔记·学习·leetcode
jiayong237 分钟前
Vue 3 面试题 - 状态管理与数据流
前端·javascript·vue.js
九皇叔叔11 分钟前
【07】SpringBoot3 MybatisPlus 删除(Mapper)
java·开发语言·mybatis·mybatis plus
智慧化智能化数字化方案11 分钟前
向华为学习——解读华为云安全白皮书 2025【附全文阅读】
学习·安全·华为云·华为云安全白皮书
和风化雨12 分钟前
特勒根定理的证明
学习
sheji341612 分钟前
【开题答辩全过程】以 基于Spring Boot的化妆品销售系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
摇滚侠2 小时前
npm 设置了阿里云镜像,然后全局安装了 pnpm,pnpm 还需要设置阿里云镜像吗
前端·阿里云·npm