寫在前面
- 興趣是學習最好的老師
- 知古鑒今
- 概述
- Java+Servlet
- Java+JSP
- JSP和PHP
- 前后端分離架構(gòu)+Javascript+Restful+SpringMVC+Angular
- iframe實現(xiàn)企業(yè)應用集成
- 微應用架構(gòu)
概述
在互聯(lián)網(wǎng)飛速發(fā)展的過程中葛家,企業(yè)開發(fā)所使用的技術(shù)及架構(gòu)也在發(fā)生變化火欧。過早的內(nèi)容我們暫且不去描述蝶桶,本文只從九十年代說起厢拭。那時是沒有前端概念的流译,所有的事情都是后端在做,從業(yè)務邏輯到頁面繪制里覆,所使用的技術(shù)是java和servlet畜埋;后來頁面內(nèi)容逐漸豐富,引入了更加方便的jsp技術(shù)烟瞧;再后來jsp的弊端逐漸顯現(xiàn)诗鸭,一種新的想法橫空出世,引入前后端分離架構(gòu)参滴;隨著前端后各自的不斷深化强岸,所能支撐的業(yè)務體量和復雜度不斷攀升,也逐步引入了容器化砾赔、微服務蝌箍、微應用架構(gòu)...
Java+Servlet
Servlet是什么?
1997年暴心,Sun 公司推出了 Servlet妓盲。Servlet 是 一種基于 Java 的動態(tài)網(wǎng)站開發(fā)技術(shù)。
嚴格來說专普,Servlet 只是一套 Java Web 開發(fā)的規(guī)范悯衬,或者說是一套 Java Web 開發(fā)的技術(shù)標準。只有規(guī)范并不能做任何事情檀夹,必須要有人去實現(xiàn)它筋粗。所謂實現(xiàn) Servlet 規(guī)范,就是真正編寫代碼去實現(xiàn) Servlet 規(guī)范提到的各種功能炸渡,包括類娜亿、方法、屬性等蚌堵。
Servlet 規(guī)范是開放的买决,除了 Sun 公司,其它公司也可以實現(xiàn) Servlet 規(guī)范吼畏,目前常見的實現(xiàn)了 Servlet 規(guī)范的產(chǎn)品包括 Tomcat督赤、Weblogic、Jetty宫仗、Jboss够挂、WebSphere 等旁仿,它們都被稱為“Servlet 容器”藕夫。Servlet 容器用來管理程序員編寫的 Servlet 類孽糖。
如何使用Servlet?
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Hello World</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello World!</h1>");
out.println("</body>");
out.println("</html>");
}
}
可以看到Servlet在展示頁面的時候毅贮,輸出HTML語句采用了老的CGI(Common Gateway Interface: Servlet之前渲染頁面的方式办悟,因servlet效率更高、可移植性更強滩褥、功能更強大而被替代)方式病蛉,是一句一句輸出,所以瑰煎,編寫和修改HTML非常不方便铺然,如果一個頁面超級復雜,動不動幾千行代碼酒甸,那這個Servlet效率也就太低了魄健。而且整個Servlet代碼也會十分臃腫而且可讀性非常差。
Applet
您可能還聽說過 Applet插勤,它和 Servlet 是相對的:
Java Servlet 是“服務器端小程序”沽瘦,運行在服務器上,用來開發(fā)動態(tài)網(wǎng)站农尖;
Java Applet 是“客戶端小程序”析恋,一般被嵌入到 HTML 頁面,運行在支持 Java 的瀏覽器中盛卡。
Applet 和 Servlet 都是基于 Java 的一種技術(shù)助隧,功能都非常強大,但是 Applet 開發(fā)步驟繁雜窟扑,而且只能在安裝 Java 虛擬機(JVM)的計算機上運行喇颁,現(xiàn)在已經(jīng)被 JavaScript 全面替代,幾乎沒有人再學習 Applet嚎货。
PHP
PHP 繼承自一個老的工程橘霎,名叫 PHP/FI。PHP/FI 在 1995 年由 Rasmus Lerdorf 創(chuàng)建殖属,最初只是一套簡單的 Perl 腳本姐叁,用來跟蹤訪問他主頁的人們的信息。它給這一套腳本取名為“Personal Home Page Tools”洗显。隨著更多功能需求的增加外潜,Rasmus 寫了一個更大的 C 語言的實現(xiàn),它可以訪問數(shù)據(jù)庫挠唆,可以讓用戶開發(fā)簡單的動態(tài) Web 程序处窥。Rasmus ? 發(fā)布了 PHP/FI 的源代碼,以便每個人都可以使用它玄组,同時大家也可以修正它的 Bug 并且改進它的源代碼滔驾。
后續(xù)
1997 年 11月 發(fā)布PHP/FI 2.0
1998 年 6 月 發(fā)布 PHP 3.0
2000 年 5月 發(fā)布 PHP 4.0
2004 年 7 月 發(fā)布 PHP 5.0
Java+JSP
首先要說明的一點是JSP基于Servlet谒麦,JSP的本質(zhì)是將原本Servlet中關(guān)于頁面繪制的內(nèi)容單獨抽離出來由專人負責,最終還是要將JSP編譯成Servlet哆致。
剛剛說到Servlet在開發(fā)頁面時超級復雜绕德,這里我們看JSP是如何解決這些問題的:
// Servlet
public class List_book extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//聲明一個ArrayList.用來存放Book類中的數(shù)據(jù)
ArrayList<Book> list = new ArrayList<Book>();
for(int i=0;i<10;i++){
Book book = new Book();
book.setName(res.getString("name"+i));
book.setAuthor(res.getString("author"+i));
list.add(book);
}
//將list數(shù)據(jù)發(fā)送到.jap文件中
request.getRequestDispatcher("ListBook.jsp").forward(request, response);
}
}
// JSP
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%String path = request.getContextPath();%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="description" content="This is my page">
<script></script>
</head>
<body>
<% ArrayList list = (ArrayList) request.getAttribute("list"); %>
<h2 align = "center">圖書列表</h2>
<table border = 1px align = "center">
<tr><th>圖書名稱</th><th>圖書作者</th></tr>
<!-- 繼續(xù)使用jsp語句 循環(huán)放入存放于list中的Book實體類中的數(shù)據(jù) -->
<%
for(int i = 0;i<list.size();i++){
Book book =(Book)
list.get(i);%>
<tr><th><%=book.getName() %></th><th><%=book.getAuthor()%></th><tr>
}
%>
</table>
</body>
</html>
// EL表達式和JSTL標簽庫
<c:if test="${session.username==='admin'}">
Hello World!
</c:if>
<c:forEach items="${name}" var="name">
${name}<br />
</c:forEach>
首先頁面更加直觀了,然后利用MVC的思想將邏輯和UI分開摊阀,之后又引入了EL表達式和JSTL標簽庫耻蛇,有效的解決了Servlet存在的問題,也使頁面展示邁入一個新的臺階胞此。JSP曾經(jīng)風靡一時臣咖,直至現(xiàn)在,很多老的系統(tǒng)都有JSP的留存漱牵,需要進行維護亡哄。
JSP受到的威脅
雖然出現(xiàn)了EL和JSTL,但是還是有些程序員會忍不住直接在JSP中寫java代碼布疙。后來就出現(xiàn)了Free Marker和Velocity等模板引擎蚊惯,程序員完全無法里面寫java代碼了,其他都跟JSP差不多灵临,通過標簽來負責展示邏輯截型。另外模板引擎還可以脫離web容器使用,這是JSP無法做到的儒溉。模板引擎出現(xiàn)后宦焦,JSP損失了部分用戶。
JSP存在的問題
- 動態(tài)資源和靜態(tài)資源全部耦合在一起顿涣,服務器壓力大波闹,因為服務器會收到各種http請求,例如css的http請求涛碑,js的精堕,圖片的等等。一旦服務器出現(xiàn)狀況蒲障,前后臺一起玩完歹篓,用戶體驗極差。
- UI出好設(shè)計圖后揉阎,前端工程師只負責將設(shè)計圖切成html庄撮,需要由java工程師來將html套成jsp頁面,出錯率較高毙籽,修改問題時需要雙方協(xié)同開發(fā)洞斯,效率低下。
- JSP必須要在支持Java的web服務器里運行(例如tomcat坑赡,jetty烙如,resin等)扭仁,無法使用nginx等(nginx單實例http并發(fā)高達5w,沒有這個優(yōu)勢厅翔,性能提不上來)。
- 第一次請求JSP搀突,必須要在web服務器中編譯成servlet刀闷,第一次運行會較慢。
- 每次請求jsp都是訪問servlet再用輸出流輸出的html頁面仰迁,效率沒有直接使用html高甸昏。
- jsp內(nèi)有較多標簽和表達式,前端工程師在修改頁面時會遇到很多痛點徐许。
- 如果jsp中的內(nèi)容很多施蜜,頁面響應會很慢,因為是同步加載雌隅。
- 需要前端工程師使用java的ide(例如eclipse)翻默,以及需要配置各種后端的開發(fā)環(huán)境,前端人員門檻較高恰起。
JSP和PHP的區(qū)別
整體區(qū)別
- PHP是服務器腳本語言修械;JSP是服務器端編程技術(shù)。
- jsp使用Java語言检盼,通過JDBC來訪問數(shù)據(jù)庫肯污,訪問數(shù)據(jù)庫的接口比較統(tǒng)一;PHP對于不同的數(shù)據(jù)庫采用不同的訪問接口吨枉,訪問數(shù)據(jù)庫的接口不是很統(tǒng)一蹦渣。
- Java采用面向?qū)ο螅琍HP采用面向過程貌亭。
php和jsp的語言比較
PHP是一種專為Web開發(fā)而設(shè)計的柬唯,解釋執(zhí)行的服務器腳本語言,它大量地借用C和Perl語言的語法圃庭,具有簡單容易上手的特點权逗,所以學過c語言的都可以很快的熟悉php的開發(fā)。
JSP是一種服務器端編程技術(shù)冤议,有助于創(chuàng)建動態(tài)網(wǎng)頁斟薇。它是以Java語言作為腳本語言,結(jié)合HTML語法的恕酸;熟悉JAVA語言和HTML語法的人可以很快上手堪滨。但java不光要需要學習語法,好用熟悉一些核心的類庫蕊温,了解、掌握面向?qū)ο蟮南嚓P(guān)知識。java要比PHP難學犬辰,因而JSP技術(shù)要比PHP難掌握瞳秽。
php和jsp的數(shù)據(jù)庫訪問比較
- jsp使用Java語言,通過JDBC來訪問數(shù)據(jù)庫岔绸,通過不同的數(shù)據(jù)庫廠商提供的數(shù)據(jù)庫驅(qū)動方便地訪問數(shù)據(jù)庫。訪問數(shù)據(jù)庫的接口比較統(tǒng)一。
- PHP對于不同的數(shù)據(jù)庫采用不同的數(shù)據(jù)庫訪問接口捻激,所以數(shù)據(jù)庫訪問代碼的通用性不強。例如:用Java開發(fā)的web應用從MySQL數(shù)據(jù)庫轉(zhuǎn)到Oracle數(shù)據(jù)庫只需要做很少的修改前计。而PHP則需要做大量的修改工作胞谭。
php和jsp的性能比較
- JSP是基于Java編程語言,所以對API的支持非常龐大男杈,在Web開發(fā)方面支持大量的第三方庫丈屹。;而PHP對API的訪問權(quán)限有限伶棒,支持的第三方庫比較少旺垒。
- JSP支持對象緩存,而PHP不支持緩存肤无。
- JSP是Java類的抽象袖牙,因此它可以被垃圾收集;而PHP不支持垃圾收集舅锄。
- JSP非常擅長維護用戶會話鞭达,而PHP每次都會破壞用戶的會話。
- JSP執(zhí)行需要更多時間皇忿,因為它被轉(zhuǎn)換為Servlet畴蹭,編譯和執(zhí)行;而PHP執(zhí)行所需的時間比JSP少鳍烁,隨著編碼減少和快速開發(fā)和執(zhí)行叨襟,即時反饋和更高的生產(chǎn)力。
php和jsp的系統(tǒng)設(shè)計架構(gòu)比較
- 采用Java的web開發(fā)技術(shù)幔荒,需要使用的是面向?qū)ο蟮南到y(tǒng)設(shè)計方法糊闽,而PHP還是采用面向過程的開發(fā)方法。所以用Java進行開發(fā)前期需要做大量的系統(tǒng)分析和設(shè)計的工作爹梁。
php和jsp的跨平臺性比較
- Java和PHP都有很好的跨平臺的特性右犹。幾乎都可以在不作任何修改的情況下運行在Linux或者Windows等不同的操作系統(tǒng)上。
php和jsp的開發(fā)成本比較
- PHP最經(jīng)典的組合就是:PHP + MySQL + Apache姚垃。非常適合開發(fā)中小型的web應用念链,開發(fā)的速度比較快。而且所有的軟件都是開源免費的,可以減少投入掂墓。
- JSP在學習周期和開發(fā)周期都比較長谦纱,且所需的軟件不是全都免費的,開發(fā)成本比較高君编。
前后端分離架構(gòu)+Javascript+Restful+SpringMVC+Angular
前后端分離
JSP存在的問題在淘寶等電商急速發(fā)展后越發(fā)明顯跨嘉。成千上萬的頁面管理,也讓大家也意識到前端需要投入更多的精力了吃嘿。這種前后端分離的思想就是后端工程師只關(guān)注于后端頁面的開發(fā)祠乃,不再處理前端問題。前端工程師只關(guān)注于自己的頁面開發(fā)唠椭。需要數(shù)據(jù)交互的時候,兩者會有一份接口文檔忍饰。
新的開發(fā)方式 SpringMVC+Angular
前后端分離思想很快流行起來贪嫂,java從JSP轉(zhuǎn)向了Restful結(jié)構(gòu),SpringMVC也開始流行起來艾蓝。
前端頁面上放棄了JSP力崇,只使用簡單的Html、CSS負責展示赢织,動態(tài)的內(nèi)容就引入了JavaScript亮靴。一般的做法就是使用ajax請求JSON,根據(jù)JSON內(nèi)容動態(tài)渲染DOM于置。
為了讓DOM渲染的更高效茧吊,前端工程師將MVC也搬到了前端,Angular框架就是如此八毯,Angular使用js作為控制器搓侄,html作為視圖,在js中異步去請求數(shù)據(jù)话速,然后html使用Angular標簽來負責展示邏輯(就像JSTL讶踪、EL一樣),把請求到的數(shù)據(jù)填充到html中泊交,可以避免去直接操縱DOM乳讥。
從此,前后端各立門戶廓俭,各建工程云石,分了前端工程和后端工程(前端也做工程化,也需要打包研乒、測試留晚、部署),只要約定好數(shù)據(jù)接口,大家在需求開發(fā)時可以并行開發(fā)错维,各司其職奖地。展示有問題找前端,數(shù)據(jù)有問題找后端赋焕。
架構(gòu)上的改變
以前的做法是所有動態(tài)参歹、靜態(tài)資源都打包成一個war包,部署到tomcat中隆判,單機部署犬庇,單機提供服務,這對于以往一些流量不大的網(wǎng)站或者一些內(nèi)部系統(tǒng)來講侨嘀,這種做法完全足夠了臭挽。但是如今互聯(lián)網(wǎng)性能要求越來越高,單點是不可能滿足高性能咬腕,高并發(fā)欢峰,高可用的要求的。
現(xiàn)在的做法是靜態(tài)資源全部部署到nginx中涨共,動態(tài)資源放在tomcat中纽帖,也就是動靜分離的思想。一個請求過來举反,先請求nginx的靜態(tài)資源懊直,瀏覽器加載靜態(tài)資源后,通過nginx的反向代理請求后端服務器火鼻,這里還可以使用nginx的負載均衡室囊,添加多臺后端服務器
這樣,html頁面+json渲染 == 最終展示在用戶面前的頁面魁索。
tomcat和nginx區(qū)別:
nginx是Http服務器波俄,專為處理Http請求而誕生,處理Http請求能力強蛾默,適合用于處理靜態(tài)資源(通過Http請求如實地返回內(nèi)容懦铺,并且每個請求處理時間不會很長),底層采用單線程異步非阻塞方式支鸡,當讀取靜態(tài)資源發(fā)生IO時冬念,可以先處理其他請求。據(jù)說nginx單機能抗5W并發(fā)牧挣。
tomcat是servlet/JSP容器急前,就是servlet/JSP運行的環(huán)境,tomcat把接收到的http請求交給servlet處理瀑构,然后servlet處理那些不講邏輯的業(yè)務邏輯裆针,適合處理動態(tài)資源刨摩。tomcat一般采用線程池的方式處理請求,當請求數(shù)量多世吨,線程處理時間長澡刹,線程處理不過來,線程間會頻繁切換耘婚,消耗大量cpu資源和內(nèi)存罢浇。當請求超過一定的數(shù)量,會拒絕連接沐祷。因此JSP并不適合用于高并發(fā)的場景
iframe實現(xiàn)企業(yè)應用集成
企業(yè)應用集成的概念在JSP嚷闭、PHP時代就已經(jīng)比較廣泛了。在開發(fā)大型項目時赖临,為了提高性能胞锰,往往要分成多個模塊進行開發(fā),并且需要具有一定的擴展性兢榨,來應對未來的變化嗅榕。
基于iframe的企業(yè)集成方案應運而生。
當用戶訪問嵌入第三方服務的iframe頁面時色乾,本方服務向統(tǒng)一身份認證平臺驗證用戶服務權(quán)限并得到第三方服務令牌誊册,通過URL傳送給第三方服務领突,第三方服務解析后向統(tǒng)一身份認證平臺驗證該用戶權(quán)限令牌信息暖璧,若用戶權(quán)限令牌信息正確則提供服務。
在此基礎(chǔ)上君旦,還可以通過瀏覽器提供的postMessage實現(xiàn)跨源通信澎办。
這種集成方案被廣泛應用與各個生產(chǎn)平臺。
微應用架構(gòu)
什么是微應用金砍?
20世紀末局蚀,隨著電商的興起,業(yè)務需求越發(fā)旺盛恕稠,代碼量驟增琅绅。網(wǎng)絡公司,如 Netflix 和亞馬遜鹅巍,都面臨著大規(guī)模軟件開發(fā)的挑戰(zhàn)千扶。要將數(shù)百個貢獻者對龐大的共享代碼庫進行修改所產(chǎn)生的摩擦降到最小,從而將代碼庫進行切割骆捧,使團隊可以更快地行動澎羞,減少操作沖突。如今敛苇,移動開發(fā)團隊也面臨同樣的挑戰(zhàn)妆绞,另外,他們還面臨著額外的挑戰(zhàn):應用程序作為單一的二進制文件交付,用戶可以下載到自己的設(shè)備上運行括饶。隨著移動應用程序代碼庫的增長株茶,編譯成越來越大的二進制文件所需的時間也越來越長。為了應對這些問題巷帝,產(chǎn)生了微應用的概念忌卤。
微服務將后端分離出來的區(qū)域單獨部署。與此類似楞泼,移動開發(fā)者可以將應用程序的不同核心部分——單一特性驰徊、共享業(yè)務邏輯和低級特性——轉(zhuǎn)移到獨立的模塊庫中。由此產(chǎn)生的模塊彼此獨立堕阔,并且獨立于主要的應用程序代碼庫棍厂,團隊可以自行處理它們。這種架構(gòu)不同于其他強調(diào)模塊化的方法超陆,即微應用(Microapp)牺弹。
因此,微應用的架構(gòu)包括一個模塊化設(shè)計时呀,并輔之以專門的應用程序(稱為微應用)张漂,供開發(fā)和測試使用,這就是為了提高開發(fā)者的速度谨娜。與 MVC (模型-視圖-控制器)或 MVVM (模型-視圖-控制器) 等明確定義的框架相比航攒,它更像是一種抽象的框架,因為架構(gòu)根據(jù)具體應用的特性而有所不同趴梢。然而漠畜,盡管沒有一種放之四海而皆準的辦法,但所有的成功實施都是一樣的坞靶。
微應用的特點
- 技術(shù)棧無關(guān):主框架不限制接入應用的技術(shù)棧憔狞,子應用具備完全自主權(quán)。
- 獨立性強:獨立開發(fā)彰阴、獨立部署瘾敢,子應用倉庫獨立。
- 狀態(tài)隔離:運行時每個子應用之間狀態(tài)隔離尿这。
微應用的操作手冊
注意系統(tǒng)間的界限:采用微應用架構(gòu)需要時間簇抵,需要大量的學習和實驗。在你最初的幾次模塊提取過程中妻味,要注意你的系統(tǒng)組件之間的界限正压、一個組件的隔離和遷移要求,代碼庫應該如何組織责球,以及你的工具需要如何改進以支持應用程序的構(gòu)建焦履、測試和部署拓劝,因為應用程序已經(jīng)變得完全模塊化。
先抽離完全獨立的模塊:在應用程序中已被隔離或由多個特性共享的部分可以成為你第一個模塊提取的理想選擇嘉裤。這幾個模塊只需對代碼做一些簡單的更改郑临,讓你的團隊專注于提取過程本身并加以學習。例子包括基礎(chǔ)組件屑宠,如 API 客戶端厢洞;無處不在的用戶界面元素,例如具有自定義風格的按鈕典奉;或沒有上游依賴關(guān)系的低級特性集群躺翻,例如標準庫擴展。
時澄谰粒總結(jié)拆分模塊的標準和方法:一旦你提取出三到五個模塊公你,就把你所學到的轉(zhuǎn)化為創(chuàng)建新模塊的明確標準。這些標準應該規(guī)定一個模塊的代碼庫應該如何組織假瞬,它應該如何集成到面向用戶的應用程序中陕靠,以及它的 CI 設(shè)置。自動化應該使任何人都能生成構(gòu)建新模塊所需的“腳手架”脱茉。這種在學習剪芥、文檔和工具方面的早期投資將為剩余的遷移工作奠定堅實的基礎(chǔ)。
目前國內(nèi)對微應用的應用
single-spa
single-spa是一個用于前端微服務化的JavaScript前端解決方案琴许。single-spa的核心就是定義了一套協(xié)議税肪。協(xié)議包含主應用的配置信息和子應用的生命周期,通過這套協(xié)議虚吟,主應用可以方便的知道在什么情況下激活哪個子應用寸认。
配置信息
在single-spa中的配置信息也稱為:Root Config签财,如下就是具體的配置項串慰。需要配置子應用的名稱,加載方式以及加載時機唱蒸。
{
name: "subApp1", //子應用的名稱
app: () =>//告訴主應用如何加載子應用的代碼邦鲫,
System.import("/a/b/subAPP/code"),
activeWhen: "/subApp1", //告訴主應用何時激活子應用
}
single-spa提供registerApplication將子應用的信息注冊到主應用中。
singleSpa.registerApplication(
{
name: 'appName',
app: () => System.import('appName'),
activeWhen: '/appName',
}
)
過程如圖
qiankun
qiankun是基于single-spa提出的微前端框架, 提供了更加開箱即用的API(single-spa+sandbox+import-html-entry)神汹。
Module Federation以及EMP
Module Federation是webpack5中的新特性庆捺,主要是用來解決多個應用之間代碼共享的問題,可以更加優(yōu)雅的實現(xiàn)跨應用的代碼共享屁魏,使用這個方法也可以實現(xiàn)微前端滔以。
公司內(nèi)以及其他微前端框架
在搜索相關(guān)資料的時候,關(guān)注到公司內(nèi)部和其他企業(yè)也有很多優(yōu)秀的微前端的解決方法氓拼,比如司內(nèi)的微前端oteam你画,無界和Hel微前端等產(chǎn)品抵碟,美團的基于React的中心路由基座式微前端和Bifrost框架,字節(jié)的lModern.js和lGarfish坏匪。微前端的生態(tài)逐漸繁榮拟逮,之后也會繼續(xù)學習其相關(guān)的知識。
技術(shù)選型
當理解完理論開始實踐時适滓,第一關(guān)便是技術(shù)選型敦迄,現(xiàn)有的備選方案如上一章所述,這里提出一些具體的選型建議:
single-spa:是第一個微前端框架凭迹,當前流行的大量框架都是single-spa的上層封裝罚屋,但是如果作為生產(chǎn)選型,single-spa提供的是較為基礎(chǔ)的api嗅绸,應用在實際項目中需要進行大量封裝且入侵性強沿后,使用起來不太方便。但是如果想學習相關(guān)技術(shù)或者封裝一套更靈活的解決方法還是很值得使用的朽砰。
qiankun: 阿里開源的一套框架尖滚,基于single-spa的上層封裝,社區(qū)活躍度較高瞧柔,在國內(nèi)的生態(tài)較好漆弄,中文文檔齊全,有大量的先行者鋪路造锅,比較適合用于生產(chǎn)環(huán)境撼唾。
EMP: 基于module federation實現(xiàn)的一套可以跨應用共享資源的框架,除了具備微前端的能力外哥蔚,還實現(xiàn)了跨應用狀態(tài)共享倒谷、跨框架組件調(diào)用的能力,屬于司外最年輕的微前端框架(暫時不適用于生產(chǎn)環(huán)境中),目前在github上是1.6kstar (qiankun是11.9k)糙箍。
微前端的進一步探索詳見參考文章渤愁。
參考文章:
曾經(jīng)風光無限的jsp技術(shù),為什么現(xiàn)在很少有人用了呢深夯?
從JSP的發(fā)展歷程談談前后端分離
JSP的缺點和前后端分離的好處
了解一下iframe頁面嵌入使用抖格,輕松實現(xiàn)頁面集成
JSP的前世今生~
PHP 的歷史
Servlet到底是什么(非常透徹)
Servlet 簡介
php和jsp之間有哪些區(qū)別
FreeMarker 快速入門
CGI與Servlet的區(qū)別和聯(lián)系
了解新興架構(gòu)模式:微應用架構(gòu)
微前端究竟是什么?微前端核心技術(shù)揭秘咕晋!