-
使用 HTTP 服务器的路由来重定向多个应用
-
在不同的框架之上设计通讯、加载机制,诸如 Mooa 和 Single-SPA
-
通过组合多个独立应用、组件来构建一个单体应用
-
iFrame。使用 iFrame 及自定义消息传递机制
-
使用纯 Web Components 构建应用
-
结合 Web Components 构建
基础铺垫:应用分发路由 -> 路由分发应用
后端:函数调用 -> 远程调用
-
首页,用于面向用户展示特定的数据或页面。这些数据通常是有限个数的,并且是多种模型的。
-
列表,即数据模型的聚合,其典型特点是某一类数据的集合,可以看到尽可能多的数据概要(如 Google 只返回 100 页),典型见 Google、淘宝、京东的搜索结果页。
-
详情,展示一个数据的尽可能多的内容。
@RequestMapping(value="/")
public ModelAndView homePage(){
return new ModelAndView("/WEB-INF/jsp/index.jsp");
}
@RequestMapping(value="/detail/{detailId}")
public ModelAndView detail(HttpServletRequest request, ModelMap model){
....
return new ModelAndView("/WEB-INF/jsp/detail.jsp", "detail", detail);
}
@RequestMapping("/name")
public String name(){
String name = restTemplate.getForObject("http://account/name", String.class);
return Name" + name;
}
前端:组件调用 -> 应用调用
const appRoutes: Routes = [
{ path: 'index', component: IndexComponent },
{ path: 'detail/:id', component: DetailComponent },
];
const appRoutes: Routes = [
{ path: 'index', component: IndexComponent },
];
const appRoutes: Routes = [
{ path: 'detail/:id', component: DetailComponent },
];
路由分发式微前端
-
首先,使用静态网站生成动态生成首页
-
其次,使用 React 计划栈重构详情页
-
最后,替换搜索结果页
http {
server {
listen 80;
server_name www.phodal.com;
location /api/ {
proxy_pass http://http://172.31.25.15:8000/api;
}
location /web/admin {
proxy_pass http://172.31.25.29/web/admin;
}
location /web/notifications {
proxy_pass http://172.31.25.27/web/notifications;
}
location / {
proxy_pass /;
}
}
}
-
不同技术栈之间差异比较大,难以兼容、迁移、改造
-
项目不想花费大量的时间在这个系统的改造上
-
现有的系统在未来将会被取代
-
系统功能已经很完善,基本不会有新需求
使用 iFrame 创建容器
-
网站不需要 SEO 支持
-
拥有相应的应用管理机制。
自制框架兼容应用
-
在页面合适的地方引入或者创建 DOM
-
用户操作时,加载对应的应用(触发应用的启动),并能卸载应用。
-
需要设计一套管理应用的机制。
-
对于流量大的 toC 应用来说,会在首次加载的时候,会多出大量的请求
组合式集成:将应用微件化
-
独立构建组件和应用,生成 chunk 文件,构建后再归类生成的 chunk 文件。(这种方式更类似于微服务,但是成本更高)
-
开发时独立开发组件或应用,集成时合并组件和应用,最后生成单体的应用。
-
在运行时,加载应用的 Runtime,随后加载对应的应用代码和模板。
-
统一依赖。统一这些依赖的版本,引入新的依赖时都需要一一加入。
-
规范应用的组件及路由。避免不同的应用之间,因为这些组件名称发生冲突。
-
构建复杂。在有些方案里,我们需要修改构建系统,有些方案里则需要复杂的架构脚本。
-
共享通用代码。这显然是一个要经常面对的问题。
-
制定代码规范。
纯 Web Components 技术构建
-
Custom elements,允许开发者创建自定义的元素,诸如 。
-
Shadow DOM,即影子 DOM,通常是将 Shadow DOM 附加到主文档 DOM 中,并可以控制其关联的功能。而这个 Shadow DOM 则是不能直接用其它主文档 DOM 来控制的。
-
HTML templates,即 <template> 和 <slot> 元素,用于编写不在页面中显示的标记模板。
-
HTML Imports,用于引入自定义组件。
<link rel="import" href="components/di-li.html">
<link rel="import" href="components/d-header.html">
-
重写现有的前端应用。是的,现在我们需要完成使用 Web Components 来完成整个系统的功能。
-
上下游生态系统不完善。缺乏相应的一些第三方控件支持,这也是为什么 jQuery 相当流行的原因。
-
系统架构复杂。当应用被拆分为一个又一个的组件时,组件间的通讯就成了一个特别大的麻烦。
结合 Web Components 构建
-
使用 Web Components 构建独立于框架的组件,随后在对应的框架中引入这些组件
-
在 Web Components 中引入现有的框架,类似于 iframe 的形式
在 Web Components 中集成现有框架
platformBrowser()
.bootstrapModuleFactory(MyPopupModuleNgFactory)
.then(({injector}) => {
const MyPopupElement = createCustomElement(MyPopup, {injector});
customElements.define(‘my-popup’, MyPopupElement);
});
集成在现有框架中的 Web Components
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
import 'test-components/testcomponents';
ReactDOM.render(<App />, document.getElementById('root'));
registerServiceWorker()
复合型
结论