1. 程式人生 > >漫談 Perl 的 web 應用開發框架

漫談 Perl 的 web 應用開發框架

忍不住在 PerlChina 郵件列表中盤點了一下 Perl 裡的 Web 應用框架(巧的是 PerlBuzz 最近也有一篇相關的討論帖),於是乎,決定在我自己的 blog 上也貼一下 :)

原生 CGI/FastCGI 的 web app 對於較小的應用非常合適,但稍複雜一些就有些痛苦,但執行效率是最高的 ;) 如果是自己用 Perl 開發高效能的站,多推薦之。

Catalyst, CGI::Application, 和 Jifty 是最流行的三大框架。CGI::Application 是 CGI 之上很薄的一層,非常 popular,呵呵,這裡的許多哥們使用之。Catalyst 也見過許多網站應用,包括比較大的網站。從技術和想法上講,Jifty 的創新點非常多,有許多非常酷的設計,甚至有些獨創之處。唐鳳,Jesse Vincent, clkao 都是 Jifty 的開發者,我也為 Jifty 貢獻過一些補丁和文件。

從架構上講,這些框架與 Ruby 的 RoR 和 Python 的 Django 沒有本質區別,甚至可以說是大同小異,只是許多細節和設計理念若有區別。比如 Catalyst 是典型的 N 種方式完成同一件事情,使用起來感覺更像是自組裝的自行車;而 Jifty 則是 full-stack 那種,哲學是 One Best Way. 這些框架都存在一個問題,即多是"解釋型"的,多是多層堆砌起來的。Web server 上都得跑一個很大的 runtime,都有 N 多 CPAN 依賴項,佈署的成本都非常高(不是一般的免費租用空間能勝任的)。於是我發現,雖然我很喜歡 Jifty,但我卻不願在自己的 web 伺服器上佈署之,即使我有 root 許可權。

這讓我陷入了很深的思考。。。我和 Jifty 的老大 Jesse 也交流過。。。我們的 web 應用框架是否應該學習一下 C/C++ 這些程式語言的編譯器?是否應該做成"編譯型"的框架,而非解釋型的?這樣,即使我們開發時使用很多庫,很多 Perl,很多工具,但經過框架的處理,最終我們可以得到一個高效能的依賴項極少的很薄的而且高度自治的網路應用?而且這種應用還可以在多機叢集的環境中很容易地 scale?

這個最終得到的"二進位制"的網站是什麼樣子,就依賴我們的想象力和需求了。它可以是一個非常輕便的 CGI/FastCGI 的 perl 指令碼,或者根本不含 Perl,只有佈署成本極易的 JavaScript 程式碼或者 PHP 程式碼。

在過去的一年內我做了許多有趣的嘗試。

XUL::App 就是這種思考的實踐,我們在開發過程中可以使用許多 Perl,包括 Template::DeclareLocale::Maketext::Lexicon 這樣的模組,但最終得到的 Firefox 外掛產品中卻不含一行 Perl 程式碼,可以安裝在任何機器上。當然了,XUL::App 並非建站框架了,但有許多類似之處。

隨後,因為工作需要,開始開發 OpenResty。在這裡,我們的"最終的二進位制網站"是一種極端,即完全由 .html, .js, .css 等靜態檔案組成,但卻是高度互動性的。所以這種網站的佈署成本嚴格為 0,畢竟它是純客戶端的網站,完全運行於使用者的瀏覽器中,因此即使沒有 lighttpd 和 apache 這樣的伺服器,直接從桌面雙擊開啟也能正確執行。

然而,我們同時必須解決中央資料來源的問題,所以我們走了通用目的但同時又是使用者可定製的 web service 平臺和跨域 AJAX 的道路。我們已經成功地得到了
純 JS 的部落格
小BBS以及公司主頁性質的網站。我們下面還要嘗試純 JS 的全功能論壇,純 JS 的 Gmail 和 RSS Reader,以及原生 PHP 站的生成(不能否認 PHP 的佈署在許多最一般的情況下比 Perl web app 要容易要經濟,所以我們是朋友,不是敵人 ;) )關於這個主題,我可以一直說下去,呵呵,不過這次 Perl Workshop 上的 OpenResty talk 我還可以慢慢道來,呵呵。

巧的是,clkao 也在我之前做過類似的嘗試。他試圖從使用了 Template::Declare 的 Perl 程式碼生成原生的客戶端 JavaScript 程式碼,利用了一些 B::Deparse 模組的高階技巧。與 XUL::App 類似,他也把 perl 的 Maketext 的 I18N love
帶給了
客戶端的 JavaScript 程式碼。必須承認,這一點也值得 XUL::App 學習,目前 XUL::App 的 I18N love 只限於 XUL 程式碼(雖然 JS 程式碼可以利用隱藏的 DOM 節點技巧而享受到 I18N,但無疑有些 hacky 了)。

無論如何,Jifty (以及最近的 Prophet)都是非常值得一看的好東東。我參加工作以來的大部分 $project 的靈感都來源於 Jifty. 所以我曾和 Jesse 說過:"I've found myself stealing good ideas or even code from Jifty in $work but avoiding using Jifty directly."

那麼作為初學者,學習那個好呢?以鄙人之見,博採眾家之所長方是"萬全之策" ;)