久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

快速web開發(fā)中的前后端框架選型最佳實(shí)踐

 icecity1306 2015-02-26
這個(gè)最佳實(shí)踐是我目前人在做的一個(gè)站點(diǎn),,主要功能:
  1. oauth登錄
  2. 發(fā)布文章(我稱為"片段"),片段可以自定義一些和內(nèi)容有關(guān)的指標(biāo),,如“文中人物:12”,。支持自定義排版、插圖,、建立相冊(cè),。
  3. 多個(gè)片段可以組織在一起,形成"事件",。
  4. 任意事件,、片段都可以互相標(biāo)記因果關(guān)系。
  5. 可以follow事件或者他人,。
  6. 事件和片段模糊搜索,。
我對(duì)目前前端框架的觀點(diǎn)已在另一篇文章中講過,這里只介紹一下目前實(shí)踐的情況,。
  1. 使用requirejs做模塊化,,上線時(shí)用r.js打包。
  2. 使用avalon做數(shù)據(jù)與視圖渲染框架,。
  3. 用page.js來管理路由,。
  4. 用harp來做靜態(tài)資源服務(wù)器。harp支持less,、coffeescript等自動(dòng)編譯,,當(dāng)前端有css或js請(qǐng)求而相應(yīng)的文件不存在時(shí),它就會(huì)自動(dòng)查找同名的less或coffeescript等文件并編譯輸出,。

后端選型經(jīng)歷了兩周左右,,目標(biāo)無非兩個(gè):開發(fā)便捷,適用于生產(chǎn)環(huán)境,。

我對(duì)開發(fā)便捷的要求是,。
  1. 可簡(jiǎn)可繁的路由配置,且非常容易生成REST接口,??蓷売每蚣茏詭У囊晥D層。
  2. 框架有一個(gè)良好的數(shù)據(jù)庫(kù)層,,可以是ORM也可以是AR,。這個(gè)數(shù)據(jù)庫(kù)層同時(shí)要支持開發(fā)者手動(dòng)優(yōu)化查詢。
  3. 框架依賴少,,容易安裝和部署,,社區(qū)支持強(qiáng)大。
對(duì)適用于生產(chǎn)環(huán)境的要求是:
  1. 框架本身輕巧,,速度快,。
  2. 支持大并發(fā),有成熟集群部署方案,。
  3. 能切換各種類型的數(shù)據(jù)庫(kù),,有memcached等緩存中間件的接口。
在這期間,,我試用了Django,、drupal、discuz,、codeigniter,、expressjs、sails,,以下記錄選擇過程中對(duì)前后端的考慮,,希望對(duì)有類似需求的朋友有幫助。我的定論留在文章最后,。
 
Django
比較慚愧,,出于個(gè)人對(duì)python不如php和nodejs熟,,放棄了Django。Django自帶功能非常強(qiáng)大的ORM,,有REST中間件,。也有成熟的部署方案。并且有非常好的學(xué)習(xí)指南(搜"Django book"),,推薦各位一定要自己用用,。
 
drupal
要完整地描述和概括drupal有一點(diǎn)難。它既不是某一種具體業(yè)務(wù)邏輯的框架(把它說成CMS太狹隘),,也不是純粹的只有功能層面(如ORM,、視圖渲染)的框架。只能這樣說:
首先,,它包含了強(qiáng)大的功能層,,如數(shù)據(jù)庫(kù)層、視圖層,。其次,,它通過“hook”機(jī)制以及一整套完善的附屬功能,讓開發(fā)者能非常自由地打造自己的業(yè)務(wù)邏輯,?;蛘哒f使得它可以幾乎可以包容任何業(yè)務(wù)邏輯。類似于AOP,,類似于裝飾類,。
這里為不懂的讀者再介紹一下它的核心“hook”。實(shí)現(xiàn)一個(gè)hook有兩步:一,、在業(yè)務(wù)流程中的某些點(diǎn)聲明可以被hook,。二、聲明一個(gè)操作,,和它要hook到哪個(gè)流程中的點(diǎn),。比如:一個(gè)用戶注冊(cè)模塊聲明,在獲取用戶的注冊(cè)數(shù)據(jù)后,,寫到數(shù)據(jù)庫(kù)之前,,這一點(diǎn)可以被hook。一個(gè)加密模塊聲明,,要對(duì)注冊(cè)數(shù)據(jù)中的密碼進(jìn)行加密,,并聲明這個(gè)操作hook到剛才提到的用戶模塊聲明的點(diǎn)上。這樣在寫到數(shù)據(jù)庫(kù)前,,密碼就被加密了,。
hook機(jī)制早已有之,drupal的精髓在于將其發(fā)展并運(yùn)用到幫助開發(fā)者實(shí)現(xiàn)業(yè)務(wù)邏輯上,。因?yàn)閹缀跞魏稳祟惖臉I(yè)務(wù)邏輯都是流程化的,,并且很可能變化,。hook滿足了在不直接改變?cè)羞壿嫷那闆r下進(jìn)行擴(kuò)展和修改的需求。也是這種機(jī)制激活了drupal的開發(fā)社區(qū),,讓它的每一個(gè)模塊都能很好地與其他模塊協(xié)作,。
 
一開始我其實(shí)是選用了drupal做后端的。第一,,它的后端功能十分完善,,從用戶注冊(cè)到內(nèi)容管理應(yīng)有盡有,。實(shí)在沒有還可以去它強(qiáng)大的社區(qū)找支援,。第二,drupal在部署,、性能優(yōu)化方面已經(jīng)非常成熟,。但最后仍然棄用了,這里先說說用的過程,。
首先裝上Service模塊自動(dòng)實(shí)現(xiàn)drupal的REST api,,這時(shí)候節(jié)點(diǎn)、用戶什么的增刪改查接口就已經(jīng)都有了,,只需要按照Services的說明去打開這些接口就行,。如果需要跨域調(diào)用,還要裝上CORS模塊來允許跨域請(qǐng)求,,相關(guān)知識(shí)請(qǐng)自行g(shù)oogle CORS,。如果定制更多的查詢接口,可以裝上Services Views模塊,,它能直接將views生成的列表變成數(shù)據(jù)輸出,,不過這個(gè)模塊和views本身一樣有個(gè)讓人很不爽的點(diǎn):對(duì)于多值的字段,不能按數(shù)組輸出,,只能輸出成一行字符串,,以",“或者其他指定符號(hào)分割,。
至此,,后端已基本可用。然而隨著繼續(xù)開發(fā),,有了更多的需求,,比如說投票。drupal有很多投票模塊,,但幾乎都是直接嵌入到頁面中的,,對(duì)api支持不好。于是想自己寫一個(gè),。這樣的功能多了以后發(fā)現(xiàn),,去找有沒有類似模塊,,并調(diào)研是否符合我需求和踩坑的時(shí)間都已經(jīng)超過了自己開發(fā)的時(shí)間。如此一來都已經(jīng)脫離我”快速開發(fā)“的本意了,。況且如果都要自己寫,,為什么不選個(gè)輕量級(jí)的框架呢?比如codeigniter,。于是開始便繼續(xù)寫,,邊尋覓其他框架。drupal整體而言其實(shí)應(yīng)該是非常適合團(tuán)隊(duì)開發(fā)的,,因?yàn)樗仁勾蠹叶甲裱瑯拥臋C(jī)制,,這樣就解決了團(tuán)隊(duì)開發(fā)容易質(zhì)量不可控這樣一個(gè)最大的風(fēng)險(xiǎn)。對(duì)個(gè)人開發(fā)者來說,,總是先搭個(gè)架子,,或者先看看別人的架子是怎么搭的,再開始寫代碼,,實(shí)在有點(diǎn)累,。
discuz
看完drupal再看discuz、phpwind什么的,,完全不能接受,,架構(gòu)太亂,控制器,、模型,、視圖耦合嚴(yán)重。沒有對(duì)REST api好的支持,。略過,。
codeigniter
codeigniter確實(shí)是非常輕,一個(gè)自動(dòng)映射到控制器的路由系統(tǒng),,一個(gè)以AR方式實(shí)現(xiàn)的數(shù)據(jù)庫(kù)層,,一個(gè)可用可棄的視圖層。就這么簡(jiǎn)單,。codeigniter同樣也有良好的社區(qū)支持,,然而更重要的是,正是因?yàn)樗浅:?jiǎn)單,,讓它可以幾乎無痛的與任何第三方類庫(kù)集成,。不過自己的業(yè)務(wù)邏輯,就得一點(diǎn)一點(diǎn)自己搭建了,。如果是這樣的話,,那還是用nodejs的框架更好。
 
expressjs
expressjs是我所知的目前最成熟的nodejs框架了(如有其它更好的,,只能說我孤陋寡聞了),。選nodejs框架最大優(yōu)點(diǎn):第一,,沒有切換語言編程的痛苦。第二,,nodejs在處理并發(fā),、大規(guī)模部署都已經(jīng)有成功經(jīng)驗(yàn)。第三,,能夠良好地支持各種數(shù)據(jù)庫(kù),。如果不是發(fā)現(xiàn)了sails的話,我應(yīng)該就選expressjs了,。
 
sails
對(duì)我個(gè)人來說,,對(duì)小框架其實(shí)是有戒心的。特別是對(duì)于要上線的程序,,萬一碰到問題問作者,,作者撒手不管,,也沒有大規(guī)模部署的例子等等情況,,上線后可能就會(huì)面臨推倒重來的結(jié)局。所以不能只看開發(fā)體驗(yàn),,框架的出身也是很重要的,。首先值得說明的是,sails是基于expressjs的,。 稍微讓人放心了點(diǎn),。其次,sails雖然自稱實(shí)時(shí)框架,,強(qiáng)調(diào)自己對(duì)于web socket的封裝,。但我目前只需要用到它的ORM和自動(dòng)生成REST api。畢竟這兩個(gè)基礎(chǔ)的東西看看源碼是可以自己掌握的,。下面來介紹以下實(shí)踐過程:
首先是路由系統(tǒng),。分為兩個(gè)部分,一個(gè)是sails對(duì)每一個(gè)model自動(dòng)生成的REST api,。sails支持標(biāo)準(zhǔn)的REST請(qǐng)求,,同時(shí)也能讓開發(fā)者通過配置文件將接口修改為常用的REST變種接口。另一部分是用戶自己定義的接口,,和codeigniter一樣,,sails也是自動(dòng)將接口映射到相應(yīng)controller的方法上,非常簡(jiǎn)單,。它同時(shí)還提供了稱之為polices的機(jī)制來保護(hù)接口,,即在調(diào)用指定接口之前先用定義好的police檢測(cè)一遍,不通過則直接拒絕請(qǐng)求,。這樣能讓controller更專注于具體業(yè)務(wù)邏輯,。
然后講講數(shù)據(jù)層,。sails的數(shù)據(jù)庫(kù)適配器非常多,幾乎所有的主流的數(shù)據(jù)庫(kù)都能支持,。它也是通過寫配置文件,,來實(shí)現(xiàn)對(duì)字段的定義。一個(gè)叫做'Event'的模型例子:
module.exports = {
  attributes: {
        uid: {
            type : 'string',
            defaultsTo : ''
        },
        title: {
            type:'string',
            required : true,
        },
        content : 'string',
        vote : {
            type : 'integer',
            defaultsTo : 0
        }
    },
    afterCreate:function( event,next ){
        Heat.create({
            entity_id : event.id,
            type : 'event'
        }).done(function(){
            next()
        })
    }
};
在這段代碼里可以看出,,sails的定義實(shí)現(xiàn)了主流數(shù)據(jù)庫(kù)中對(duì)字段的檢測(cè),、設(shè)置默認(rèn)值等功能。值得一提的是例子最后的'afterCreate'函數(shù),,這是sails提供的類似于drupal hook的東西,,它自己稱為"生命周期回調(diào)"。它可以讓開發(fā)者在模型的增刪改查前后自動(dòng)執(zhí)行相應(yīng)的管理操作,。在我們的例子里就是在一條屬于Event模型的記錄創(chuàng)建之后,,再創(chuàng)建一條相關(guān)的Heat模型的數(shù)據(jù)。
要注意的是sails ORM中是沒有自動(dòng)支持模型建的關(guān)聯(lián)的,。以我個(gè)人的觀點(diǎn)來說,,正好也不需要,因?yàn)槟P烷g的關(guān)聯(lián)常常是造成數(shù)據(jù)庫(kù)查詢負(fù)載的罪魁禍?zhǔn)?,我常常通過儲(chǔ)存冗余數(shù)據(jù)等方法來盡量減少關(guān)聯(lián)查詢,。所以不支持模型關(guān)聯(lián),正好讓我每一個(gè)需要關(guān)聯(lián)的地方都手寫,,保障性能,。
數(shù)據(jù)庫(kù)我用了mongodb,我的需求里面有些非結(jié)構(gòu)化的數(shù)據(jù)可以無需任何轉(zhuǎn)換地存到數(shù)據(jù)庫(kù)了,。sails同時(shí)還支持對(duì)不同的model使用不同的數(shù)據(jù)庫(kù),,這樣未來要對(duì)數(shù)據(jù)庫(kù)調(diào)優(yōu)的話空間就很大了。
最后看看下對(duì)CORS的支持,,直接在整站的配置文件中打開crsf選項(xiàng)即可,。對(duì)于跨站請(qǐng)求,先請(qǐng)求crsf token,,之后的請(qǐng)求帶上這個(gè)頭就可以跨站了,。
結(jié)論自然是選擇了sails。目前sails整體項(xiàng)目官方維護(hù)得非常積極,,功能完備,。實(shí)在有問題了看看源碼也能夠明白。相對(duì)于我的需求來說已經(jīng)非常好了,。
最后整體總結(jié)一下:
1.整個(gè)開發(fā)中前后端完全分離,。后端只提供數(shù)據(jù)接口,并且支持跨域請(qǐng)求,也便于之后進(jìn)行其他端的開發(fā),。
2.前端用avalon,、requirejs、page.js三件套開發(fā)體驗(yàn)非常好,。用harp來支持less和coffeescript等,,自動(dòng)編譯,無需任何中間操作,。
3.后端用sails來處理業(yè)務(wù)邏輯和提供REST api,。各種功能齊全,開發(fā)順暢,。
文中內(nèi)容若有偏頗,,望不吝賜教。預(yù)祝屏幕前的你新年快樂,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多