我個人是比較不喜歡去正兒八經的比較兩個框架的,這樣沒有意義,不過欲善其事先利其器!
技術是相通的,但是在某個特定的領域的某個階段肯定有相對最適合的一個工具!
這裡比較不是從技術角度比較,而是從公司技術選型考慮的,特別是初創的網際網路創業公司。沒辦法,誰讓網際網路公司離不開軟體呢!哈哈哈。
首先是雙方選手出場介紹:
Laravel
Laravel框架號稱是Web藝術家的框架,富有生產力,代表了最優雅最流行的PHP框架,經過一段時間的使用,也上了一個專案,感覺特點如下:- 比較規範(PHP的框架中),適合團隊分工協作
- 開發速度快(社群生態和腳手架加持)
- 部署方便(PHP的部署就那樣吧,Git一套推拉下來就搞定了)
- 功能模組比較全面
- 架構較複雜(在PHP框架中,O(∩_∩)O哈哈~)
- 全棧,前後端一個IDE搞定
- 其他文中再說
Spring Boot
Spring Boot準確來說並不是一個完整的框架,而是為了使 Spring 全家桶更方便使用、更親民而產生的一個整合框架。所以Spring Boot 的背後是 Spring 近乎無敵的生態和解決方案。 先簡單說一下特點吧:- 背靠 Java 這個老傢伙,還有 Spring 這個J2EE 的標準背書,生態非常強大
- 開發速度快(在Java系列中。。。),約定大於配置
- 基於JVM,執行效率有保障
- 需要掌握Spring的那一套,對於本身不是 J2EE 的童鞋學習成本有點高
- 有Cloud 加持,微服務在召喚
- 智慧到令人髮指的Spring Data JPA
- 其他稍後文中再說
好啦,介紹完選手,就開始來分析一下該用哪個啦,這裡我們設定一個情境:
假設 小紅 是一位有一個自認為價值 20億 的Idea,並且打算付諸實踐的小BOSS(即將成為),稍懂軟體架構和開發技術,沒錯,是很菜的那種(如果很厲害那隨便怎麼用框架了,沒所謂),且啟動資金只有 30萬。
我也不想假設的這麼慘的,現實中這種情況很多,那我們就以這種情景展開分析。小紅要以最低成本、最快速度推出 1.0 版本,投放市場,收集反饋,持續迭代。這是一個系統工程,講其他因素剔除,只考慮技術問題,可以總結成以下幾點:
- 成本(開發效率和人工成本)
- 響應(迭代和部署效率)
- 安全(穩定性和 BUG解決速度)
- 協作(團隊協作和擴充套件性)
1.開發效率
開發這個過程,我們將它定義為需求和原型都已經確定,並且已經簡單建模完畢,嗯,就是猿們到崗後拿著需求文件開啟電腦(Windows)的時候開始,到 1.0 版本釋出這段時間,是誰跑得快!O(∩_∩)O哈哈~
首先是 Laravel 框架,步驟是這樣的:
- 配置本地環境:包括PHP-CLI、Vagrant 、VirtualBox、HomeStead Box、Composer、nodejs(Mix要用到)、Python、Visual Studio、Node-gyp(Node-Sass要用到)、PHPStorm、Git,一切就緒後
composer create-project laravel/laravel xxx
- 開發:定義migration、model,然後transformer和repository,再寫service和passport啥的,再寫controller,view檢視,然後完善 Event、Notification、推送啥的,期間伴隨著單元測試
- 部署:Git push、Git Clone 、Pull,env整一個,上線
對 Laravel 的開發流程熟悉的人呢,開發速度是很快的。
我們再來看看Spring Boot:
業務不復雜就不要折騰微服務啦,不要像某人一樣明明只有一臺機器,硬是要開幾十個埠,然後跑幾十個Spring Boot的小服務,還用Cloud全家桶串起來了。我竟無言以對
單體應用擼起來,步驟如下:
- 配置開發環境:IntelliJ IDEA下一個、JDK裝一個、其他要用到的Redis啥的裝上,分分鐘就搞定可以開擼了。
- 開發:定義JAP Entity,Repository、Service,配置Spring Security(包括Oauth2),定義Validation,開擼Controller、異常處理,檢視層啥的,單元測試也少不了
- 部署:打出Jar包,扔到伺服器上執行吧,nginx對映一下,搞定
我個人覺得Spring Boot的開發效率要比 Laravel 框架高些!
為什麼呢? 因為如果對 Spring 的機制熟悉,也瞭解 Security、JPA、Thymeleaf模板、RabbitMQ 等等功能模組的使用,Spring Boot 的封裝是比 Laravel 要好的,但前提是對Spring 那一套熟悉,不然從何入手都弄不清楚。
Spring 有些元件是非常複雜的,例如 Spring Security
Laravel 框架借鑑了很多 Java Spring 的思想,比如容器,依賴注入、切面,這方面明顯 Spring Boot 是正宗,註解啥的6得飛起!
Java 語言非常嚴謹,在開發過程中的體驗比較好,至少像我這樣天馬行空的猿,還非得要 Java 這個老頭來管著,不然分分鐘要跑偏。
回到開發效率這個問題上,如果對兩個框架都比較熟悉的情況下,Spring Boot 是開發比較快的,但 Laravel在某些方面是完勝Spring Boot,如下:
- Laravel 框架的 ORM 構建需要經歷兩個步驟,migration 和 model ,而且改動 migration 需要調整 model,無法向 JPA 一樣Entity 即資料庫結構;
- Laravel 框架需要手動實現一些注入繫結,通常是
$app->bind
,儘管這不消耗多少時間,但是比起Spring強大的註解還是慢不少,而且主流IDE對 Spring 的 Bean 提供了導航檢視功能,牛逼哄哄啊; - 如果要做網頁渲染,Laravel的動態指令碼語言特性加上Blade模板基本是秒殺Spring Boot 的;
- 要讓層次更分明一些的話,Laravel 需要手動實現Repository 模式,反正我是受不了Model 直接定義業務邏輯的,放在Controller裡也受不了,不但難看,還不好擴充套件;
- 在授權這方面,Laravel 自帶的和Spring Security 都很強大,可以說是開箱即用,打平;
- Laravel框架開發反饋除錯方面是完勝Spring Boot的,這方面可以說所有非編譯型的語言都很爽!儘管Spring Boot 也有DevTool,但是架不住 PHP 根本就不需要重新啟動呀。
- Laravel框架的程式碼提示遠遠比不上Spring Boot,而且還需要第三方包Ide-Helper的加持,不然程式碼追蹤都不行,可是就算用了第三方包還是看不了 容器內長啥樣啊;
- 像 Laravel 這樣靠物件導向體現優雅的框架,卻遇到了PHP 這門物件導向不太完全的語言,以致於在 Java 體系內很容易實現的一個功能,到了PHP體系卻無能為力;
- Route 路由這方面 Laravel 非常強大,而且直觀,比Spring Boot 靈活,所以定義路由的時候效率完爆Spring Boot;
- 異常處理兩者都非常方便,提供了統一處理的方式,難分伯仲;
- Api Json資料定製這方面,Laravel 比 Spring Boot 要強大,這是因為PHP的陣列操作非常靈活,對於 Java 來說需要定義工具類和實體類來專門處理;
- i18n國際化,Laravel 比Spring Boot 方便;
- 前端資源處理,就這個功能本身來說,Laravel的Mix配合Blade模板完爆Spring Boot,但是話說回來,只要不是全棧,這不算什麼優勢。設想一下如果是前端做好頁面,拿到後端套模板,那Thymeleaf 完爆 Blade,因為Thymeleaf 可以保留預覽資料,渲染實際資料,Blade 做不到這一點。
總結:在技能掌握充足的情況下,個人感覺 Spring Boot 開發效率要略高於Laravel。個人掌握情況不一樣,請勿噴,可以參考文中的幾個維度,自己思考一下。
最後想提一下,順便求證:
Laravel 不念 “拉瓦”
Laravel 不念 “拉瓦”
Laravel 不念 “拉瓦”
時候不早了,有點困。今天就寫到這,明天再寫人工成本的考量。
大家晚安!謝謝