【框架實踐之路】為什麼要開發 Codekart 框架

楊捷發表於2014-01-15

兩年前,在被php的$符號和字串處理折磨得半夜罵娘之後,我義無反顧地決定:珍愛生命,遠離php。

之後一直在尋找一門“完美的語言”,先後接觸了Lisp、python、java、Ruby。Lisp幾乎在語法和思想上達到了完美,但卻由於過於小眾和開發環境的不完善,導致基本找不到工作,也只能作為業餘時間的寫一些有趣的東西了。python的強制縮排,說實話相當於告訴程式設計師:嘿,你個SB!到底會不會排版?我一直堅定的認為,充分相信程式設計師給於程式設計師最大的自由,而不是害怕程式設計師犯錯誤替程式設計師做出決定的語言更加Geek,難道不是麼?java的語法像老奶奶的裹腳布,又臭又長,各種庫臃腫龐大,我可不想到哪兒都揹著一個沉重的工具箱,我希望的是一把瑞士軍刀,或者一件能製作工具的工具。Ruby各方面比較平衡,看起來還比較適合。

就在我做好準備投入Ruby的懷抱時,由於專案需要寫了一些javascript程式碼,才對這個一直被我忽略的語言有了充分的認識和了解。如果說寫js有什麼體會,那就是“自由”!你只需要專注於功能本身的實現,不用花大量時間和精力去跟語言本身的特徵打交道。舉個反例,我的入門語言是C++,當時做MFC開發的感覺就是自己簡直是一個弱智,巨大的挫折感每天都在打垮自己的意志,因為大量的時間被耗費在瞭解和突破語言的限制、擔心記憶體洩露和程式出錯上面,戰戰兢兢如履薄冰,甚至半夜驚醒。後來寫js之後發現,之前在c++裡寫的大量程式碼,居然是在實現另一們語言本身的“高階”特徵!

當Node.js帶著精簡優雅的設計和優越的效能撲面而來時,我感覺自己像墜入了愛河。關於Node.js的優缺點,可以看我在君鑑上的文章專輯:Node.js技術研究。在這個文章大大地將node誇讚了一番,極盡諂媚馬屁之能事。

接下來就是長時間高強度的瞭解Node.js了。在基本閱讀了手冊之後,我開始寫了一些程式碼,比如按照教程寫了靜態檔案伺服器,和websocket聊天程式。之後開始尋找一個開發框架,當然第一個映入眼簾的就是大名鼎鼎的Express。簡單嘗試之後,驚歎於Express的url路由真的十分強大!但是也學是因為自己長時間習慣於php開發,總覺得Express“不像”是一個框架,因為Express還需要自己組織程式的模組化,需要自己進行檢視和處理程式的分離,等等。

於是,我決定不借助任何框架從零開始重寫君鑑,並在重寫的過程中開發一個MVC模式的框架。我認為這是一個大工程,將要耗費我大量的時間。

事實上,得益於語言本身的“高階”,重寫並沒有花掉我太多的時間。一路暢快的完成開發後,一個粗略的框架基本完成了。由於之前寫php時一直使用codeigniter,我把這個新開發的框架命名為 Codekart,kart的意思是卡丁車,Codekart 是小巧精簡、高效能、功能完善的框架,使用Codekart開發web程式就像駕駛卡丁車一樣暢快而且“好玩兒”。Codekart已經幫你出色的完成了下面的工作:

  1. 高效能 MVC 開發框架
  2. 具備客戶端快取支援的靜態檔案伺服器
  3. view頁面、binary二進位制檔案處理、api請求等 url 路由
  4. view頁面繼承支援、配置生成化及模板資料解析
  5. js、css、html 的模組化按需載入,併合並壓縮
  6. Tool常用工具箱,例如模板解析和流程控制工具等等
  7. 精簡而強大的前端 js 常用方法庫

框架的設計思想和目錄結構一部分借鑑了codeigniter,將app與framework分開,在此基礎上再將靜態所有靜態檔案歸類到static目錄,大致如下:

│
├─ app ┐ //工程檔案目錄,程式開發工作在此進行
│
├─ framework ┐ //框架檔案目錄
│
├─ static ┐ //靜態檔案目錄
│

詳細資料夾結構,在這裡:Codekart目錄結構

由於篇幅所限,這裡不能一一介紹。下面就選取框架比較突出的功能:web頁面模組化配置。

例如: framework/view/html.js 內容如下:

//web頁面頂級頁面定義
exports.stuff = {
    tpl:{html:'html'}, //頁面的tpl模板檔案列表
    tpl_pre:[], //待用的tpl檔案列表 會被加入js檔案裡面待用 
                //儲存在app/view/tpl資料夾 格式{note_list:'abc/abc'}
    less:'html', //頁面的css模板檔案列表
    csslib:[], //css庫檔案,在static/csslib目錄下
    js:[
        'functions',
        'json',
        'cookie',
        'jq-extend',
        'tmpl',
        'pro'
    ], //頁面的js模板檔案列表
    jslib: 'jquery-2.0.3.min' //js庫檔案列表,在static/jslib目錄下
};

var website = require_config('website');

/**
 * tpl模板資料獲取函式
 * @param callback 返回模板資料
 */
exports.data = function(callback){
    var that = this
      , req = this.request; //Codekart擴充套件的request請求物件
    callback({
        title: website.name,
        time: req.time,
        website: website
    },{
        website: website
    });
};

exports.stuff 物件及為web頁面的配置,exports.data函式為頁面模板資料的獲取函式。你也可以方便的進行頁面的繼承。更多內容可以訪問 Codekart文件手冊

目前為止,Node.js仍然是一個年輕的但卻充滿活力的伺服器解決方案。國內的使用者包括阿里巴巴、一些大資料處理和一些遊戲公司使用,但它的適用環境卻遠不止做遊戲後端和大資料介面。用Node可以讓網站更加“實時”,效能更加突出,可以處理海量的資料請求,Codekart的開發初衷是為了在享受高效能的同時,讓網站開發更加快速和便捷。

你可以在如下地方下載或瞭解 Codekart,歡迎在Github上star和fork我!

主頁: http://codekart.jojoin.com/

使用手冊: http://docs.codekart.jojoin.com

Github: https://github.com/myworld4059/Codekart

歡迎提出建議或者BUG反饋!

相關文章