Rails 從入門(mén)到完全放棄 擁抱 Elixir + Phoenix + React + Redux

Rails 從入門(mén)到完全放棄

轉(zhuǎn)載地址: Rails 從入門(mén)到完全放棄

前言

這是一篇關(guān)于Rails的開(kāi)發(fā)經(jīng)歷的文章,旨在將Rails中遇到的各種問(wèn)題分享給還未接觸Rails或是已經(jīng)上路的朋友趾痘。雖說(shuō)做Rails的開(kāi)發(fā)時(shí)間不長(zhǎng),剛好一年多贝室。但是哮幢,在這一年的時(shí)間中贬丛,該使用的技術(shù)架構(gòu),Ruby-China 推薦的Gem包鹃共,都嘗試過(guò)使用過(guò)了鬼佣,也為業(yè)務(wù)開(kāi)發(fā)了一些Gem包。談不上精通Rails及汉,如果把Rails作者定為最高等級(jí)沮趣,他是F1賽車(chē)手屯烦,我該是個(gè)跑出租的老司機(jī)。

背景

早前有做過(guò)Java,PHP掺出,.Net的開(kāi)發(fā)毅桃,相信玩Rails的朋友多多少少也都有寫(xiě)過(guò),不過(guò)主要還是以前端為主翁狐。早在IE7/IE8 時(shí)代做前端開(kāi)發(fā)类溢,那時(shí)NodeJS還沒(méi)火起來(lái),前端成了低技術(shù)含量又耗體力又沒(méi)地位的活露懒。不過(guò)闯冷,還好有NodeJS,讓我趕上了這個(gè)時(shí)代懈词。

怎么接觸到Rails

當(dāng)公司的一個(gè)PHP的多人即時(shí)聊天項(xiàng)目接近尾聲時(shí)蛇耀,我們?cè)谒伎寄懿荒軐⒊绦騿T生產(chǎn)力解放出來(lái)?是不是可以嘗試一些其他的技術(shù)架構(gòu)坎弯。很快纺涤,經(jīng)過(guò)多方研究,發(fā)現(xiàn)Rails是單兵作戰(zhàn)的神器抠忘。相比PHP撩炊,可以達(dá)到Rails : PHP = 1 : 4 的效率。但對(duì)于一個(gè)技術(shù)架構(gòu)成熟的技術(shù)團(tuán)隊(duì)來(lái)說(shuō)崎脉,放棄原有的技術(shù)架構(gòu)去使用一個(gè)從未接觸過(guò)新技術(shù)拧咳,時(shí)間成本和決心是很重要的。但挑戰(zhàn)往往會(huì)帶來(lái)意想不到的收獲囚灼。

在深大圖書(shū)館的 Rails之道

學(xué)習(xí)新技術(shù)的第一件事就是去找學(xué)習(xí)資料骆膝。在google上找了很久,發(fā)現(xiàn)深大圖書(shū)館有各種各樣的技術(shù)書(shū)籍啦撮,果不其然谭网,在這里找到了Ruby元編程Rails之道赃春,敏捷開(kāi)發(fā)之道這些書(shū)籍愉择,但是版本比較老。為了能夠掌握最新版本的知識(shí),下載了相應(yīng)的英文版PDF锥涕,一起結(jié)合衷戈。修煉Rails的過(guò)程是痛并快樂(lè)著的,因?yàn)橐D(zhuǎn)變思維模式层坠,去接受新的思想殖妇,去了解諸多的語(yǔ)法糖因何而生。學(xué)累了就躺會(huì)破花,餓了就上個(gè)外賣(mài)谦趣,腦袋成漿糊了就洗把臉。其實(shí)接觸一門(mén)新語(yǔ)言并不是多難座每,這是一個(gè)循序漸進(jìn)的過(guò)程前鹅。好在前端底子厚,學(xué)習(xí)ERB峭梳,UJS舰绘,RJS的過(guò)程比較輕松,但是Turbolinks對(duì)于前端工程師來(lái)說(shuō)就是噩夢(mèng)葱椭,一直到現(xiàn)在我都用的Pjax捂寿。不喜歡Turbolinks的做法,Pjax顯得很機(jī)智孵运。關(guān)于TurbolinksPjax我并不是挑起戰(zhàn)爭(zhēng)秦陋,仁者見(jiàn)仁,智者見(jiàn)智掐松。

用Rails對(duì)電商的探索

在構(gòu)建電商系統(tǒng)的時(shí)候踱侣,很自然就 pull 了ECShop的源碼來(lái)學(xué)習(xí)。
業(yè)務(wù)上的問(wèn)題并不大大磺,有現(xiàn)成案例抡句,結(jié)合需求來(lái)訂制開(kāi)發(fā)很快。
同時(shí)在開(kāi)發(fā)過(guò)程中Ruby-China社區(qū)也提供了許多幫助杠愧。類(lèi)似查詢 N + 1問(wèn)題待榔,CanCanCan權(quán)限問(wèn)題.....

文件上傳

上傳圖片

對(duì)于圖片等資源的處理,最開(kāi)始沒(méi)有選用Carrierwave的方案流济,而是使用七牛云存儲(chǔ)JS SDK锐锣,開(kāi)始接觸的時(shí)候,發(fā)現(xiàn)并沒(méi)有多少參考文檔绳瘟,于是想是不是這個(gè)東西比較簡(jiǎn)單也比較少人用雕憔,還是Ruby-China 社區(qū)的朋友太懶。后面深入研究后發(fā)現(xiàn)糖声,這類(lèi)云存儲(chǔ)的方法還是用得比較多斤彼,也比較便捷分瘦,但對(duì)于新手還是有一定門(mén)檻,所以做完之后順帶寫(xiě)了相應(yīng)的教程造福社會(huì)琉苇。

富文本編輯器上傳圖片

在富文本編輯器中Froala可以說(shuō)是佼佼者嘲玫,我們選用了Froala。但是遇到一個(gè)問(wèn)題并扇,F(xiàn)roala中的圖片上傳僅支持Amazon云去团,因此不得不改造Froala的源碼。幸運(yùn)的是這個(gè)過(guò)程并不困難穷蛹,我將改造后的Froala用策略模式做成了一個(gè)Gem: wysiwyg-rails-qiniu土陪,又一次造福社會(huì)。

猴子補(bǔ)丁

在使用will_paginate的時(shí)候俩莽,分頁(yè)的結(jié)構(gòu)與樣式與Materia UI的風(fēng)格并不相符旺坠,并且沒(méi)有找到合適的Gem乔遮,所以大膽的用起了打開(kāi)類(lèi)的法術(shù)扮超,并且紀(jì)錄了這一過(guò)程《 為什么重寫(xiě)will_paginate

Pjax

使用Pjax的過(guò)程相對(duì)比較順利,在聽(tīng)完Rei大神對(duì)Turbolinks的講解之后蹋肮,還是堅(jiān)定不移的使用Pjax出刷,值得注意的是在使用WiceGrid的時(shí)候,會(huì)存在初始化組件問(wèn)題坯辩,當(dāng)時(shí)是使用data-skip-pjax解決馁龟。不過(guò)現(xiàn)在前后端分離,前端使用React + Redux操作DOM比以往輕松多了漆魔。事實(shí)上WiceGrid的篩選方式對(duì)于用戶并不友好坷檩。

Devise 和 OmniAuth

這兩個(gè)Gem的使用不多,在嘗試過(guò)Devise之后改抡,還是得自己手寫(xiě)一遍登錄等功能矢炼,第三方登錄開(kāi)始有考慮用,后面發(fā)現(xiàn)還用不上就沒(méi)有研究了阿纤。

china_city

在使用china_city的時(shí)候發(fā)現(xiàn)一個(gè)小問(wèn)題句灌。

(($) ->
  $.fn.china_city = () ->
    @each ->
      // 下面這一行選擇.city-select的時(shí)候沒(méi)有限制為select
      // 如果class有沖突會(huì)出現(xiàn)bug.
      // 所以更正為 $(@).find('select.city-select')
      selects = $(@).find('.city-select')
      selects.change ->
        .
        .
        .
)(jQuery)

前端css框架

在開(kāi)發(fā)中多次切換了前端技術(shù)棧。只想告訴大家欠拾,Materia UI并不適合后臺(tái)使用胰锌,而且與諸多的Gem包存在兼容問(wèn)題,Rails中大部分跟前端有關(guān)的Gem都是基于Bootstrap藐窄。所以覺(jué)得Bootstrap審美疲勞的朋友资昧,還是繼續(xù)用著吧。

前端JS處理

隨著JS的增多荆忍,維護(hù)起來(lái)會(huì)越來(lái)越難格带,在Rails的項(xiàng)目中并沒(méi)有做JS模塊化诺凡,而是將JS用工廠模式匯集到了一起,新的功能代碼會(huì)放到工廠車(chē)間去践惑,在使用的時(shí)候 new 一個(gè)工廠腹泌,調(diào)用需要的功能即可,同時(shí)保證了可復(fù)用性尔觉。

部署

其實(shí)Rails的應(yīng)用部署相對(duì)比較容易凉袱,沒(méi)有太多的內(nèi)容。只要注意配置文件加后綴防止被新的commit覆蓋就好了侦铜,一般來(lái)說(shuō)专甩,寫(xiě)好shell腳本實(shí)現(xiàn)一鍵部署也并非難事。

微信支付

現(xiàn)今主流的是微信支付和支付寶支付钉稍,銀聯(lián)的太蛋疼了涤躲。相比與微信支付,支付寶的文檔真心不友好贡未,看到吐种樱,而且申請(qǐng)流程繁瑣。如果你有打算在項(xiàng)目中使用支付寶支付俊卤,最好提前兩個(gè)月做申請(qǐng)嫩挤。雖然我不太喜歡馬化騰,但是微信支付的文檔我給32個(gè)贊消恍,使用起來(lái)也方便岂昭。微信支付的申請(qǐng)流程更加透明一些,每個(gè)節(jié)點(diǎn)都很快狠怨。使用下面的Gem

gem 'wechat'
gem 'wx_pay'

但是也有一個(gè)問(wèn)題待解決约啊,就是在支付時(shí)取消訂單,數(shù)據(jù)庫(kù)狀態(tài)更新佣赖,而微信支付的數(shù)據(jù)狀態(tài)未更新恰矩,再進(jìn)行支付的時(shí)候就會(huì)出現(xiàn)訂單號(hào)已存在的error

微信支付虛擬鍵盤(pán)

在便利店用過(guò)微信支付的朋友應(yīng)該知道茵汰, 好近這樣的第三方支付商的虛擬鍵盤(pán)枢里。開(kāi)始做虛擬鍵盤(pán)的時(shí)候想扒一下好近的源碼,奈何用微信開(kāi)發(fā)調(diào)試工具根本拿不到蹂午。所以只能自己寫(xiě)栏豺,遇到的第一個(gè)問(wèn)題就是點(diǎn)擊事件延遲300ms,雖說(shuō)可用Tap事件豆胸,被搞得不要不要的奥洼。先后嘗試了JqueryMobile.TapFastClick等解決方法晚胡,仍然是在Android上延遲超高灵奖,IOS流暢嚼沿。后面靈感閃現(xiàn),我為什么要給用戶一個(gè)完整的點(diǎn)擊事件呢瓷患?一碰到就觸發(fā)鍵盤(pán)不是可以讓用戶得到的反饋跟好么骡尽。索性偷懶了一把。

$(element).on('touchstart', function(e){/* do something */}

Rails 的問(wèn)題

Rails從誕生到現(xiàn)在擅编,已有經(jīng)年攀细。開(kāi)發(fā)過(guò)程中最拖慢開(kāi)發(fā)進(jìn)度的不是需求變動(dòng),也不是技術(shù)點(diǎn)爱态,使用了assets pipeline的話谭贪,在調(diào)試頁(yè)面的時(shí)候資源加載總是很慢。實(shí)在受不了的時(shí)候嘗試了結(jié)合NodeJS锦担,用Gulp browser sync俭识,來(lái)代理資源,雖說(shuō)速度快超多洞渔,但不是官方集成的方案套媚,多多少少讓強(qiáng)迫癥的人很難受。對(duì)于業(yè)務(wù)復(fù)雜的電商系統(tǒng)來(lái)說(shuō)痘煤,Rails標(biāo)準(zhǔn)的Action肯定不夠用凑阶,而自定義的寫(xiě)出來(lái)感覺(jué)不倫不類(lèi),可能是功夫不到家衷快,但是沒(méi)有找到更好的編程參考。其他的就是性能問(wèn)題了姨俩,了解Elixir的朋友應(yīng)該就知道了蘸拔。

跟著Peter學(xué)Meteor

響應(yīng)Peter的號(hào)召,我也全情的投入到了MeteorReactRedux 的大軍中去了环葵。雖說(shuō)沒(méi)用Meteor做過(guò)大型項(xiàng)目调窍,但是小應(yīng)用做起來(lái)是得新應(yīng)手了。好像也沒(méi)有看到有多少大型項(xiàng)目用Meteor + React + Redux 技術(shù)棧的张遭。用上React前端代碼思路和結(jié)構(gòu)變得清晰多了邓萨。也可以使用諸多的React組件了。類(lèi)似于Amazeui菊卷,Ant Design缔恳,這些優(yōu)秀的設(shè)計(jì),連UI的費(fèi)用都省了洁闰。

我與Elixir 和 Phoenix 不能說(shuō)的秘密

Elixir不用我說(shuō)歉甚,相信大家都有耳聞了,函數(shù)式編程是未來(lái)扑眉。一個(gè)專(zhuān)業(yè)前端的Rails工程師切換到Elixir的過(guò)程沒(méi)有第一次經(jīng)歷的痛苦纸泄,當(dāng)你接受了函數(shù)式的思想之后相當(dāng)順暢赖钞。社區(qū)里面有的人說(shuō)PhoenixRails的,我并不認(rèn)同聘裁,Phoenix傳承了敏捷開(kāi)發(fā)的思想雪营,也為開(kāi)發(fā)者提供了諸多的便利,像Hot load的技術(shù)也被集成進(jìn)來(lái)衡便,對(duì)于Socket的支持也是相當(dāng)?shù)暮米跨帧H诤?code>Elixir的特性,讓多線程成為利器砰诵,利好多多征唬,如果可以,你應(yīng)該像我一樣去深入研究下Phoenix茁彭,還有你們常用的Devise也是Phoenix的作者寫(xiě)的总寒。當(dāng)Rails老了,你還有Phoenix

結(jié)束語(yǔ)

AD:你錯(cuò)過(guò)了房地產(chǎn)理肺,錯(cuò)過(guò)了網(wǎng)購(gòu)摄闸,錯(cuò)過(guò)了炒股,別再錯(cuò)過(guò)Elixir Phoenix React Redux妹萨。
作者:本猿不才年枕,文采平平,且讀切珍惜乎完。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末熏兄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子树姨,更是在濱河造成了極大的恐慌摩桶,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帽揪,死亡現(xiàn)場(chǎng)離奇詭異硝清,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)转晰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)芦拿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人查邢,你說(shuō)我怎么就攤上這事蔗崎。” “怎么了侠坎?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵蚁趁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我实胸,道長(zhǎng)他嫡,這世上最難降的妖魔是什么番官? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮钢属,結(jié)果婚禮上徘熔,老公的妹妹穿的比我還像新娘。我一直安慰自己淆党,他們只是感情好酷师,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著染乌,像睡著了一般山孔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荷憋,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天台颠,我揣著相機(jī)與錄音,去河邊找鬼勒庄。 笑死串前,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的实蔽。 我是一名探鬼主播荡碾,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼局装!你這毒婦竟也來(lái)了坛吁?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贼邓,失蹤者是張志新(化名)和其女友劉穎阶冈,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體塑径,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年填具,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了统舀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡劳景,死狀恐怖誉简,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盟广,我是刑警寧澤闷串,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站筋量,受9級(jí)特大地震影響烹吵,放射性物質(zhì)發(fā)生泄漏碉熄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一肋拔、第九天 我趴在偏房一處隱蔽的房頂上張望锈津。 院中可真熱鬧,春花似錦凉蜂、人聲如沸琼梆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)茎杂。三九已至,卻和暖如春纫雁,著一層夾襖步出監(jiān)牢的瞬間煌往,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工先较, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留携冤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓闲勺,卻偏偏與公主長(zhǎng)得像曾棕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子菜循,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容