成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

基于 Backbone + node 的個(gè)人簡(jiǎn)歷生成器(個(gè)人學(xué)習(xí)總結(jié))

lansheng228 / 423人閱讀

摘要:應(yīng)用的功能這個(gè)應(yīng)用是一個(gè)個(gè)人簡(jiǎn)歷生成器。比較好的教程有這一個(gè)。這樣的命名污染問(wèn)題自然顯而易見(jiàn)。而且發(fā)出多次請(qǐng)求也會(huì)影響性能。明顯不利于維護(hù)。然而我希望能夠不發(fā)生變化,因?yàn)槭窃谖募那疤嵯碌臉?biāo)簽頁(yè),不能換一個(gè)標(biāo)簽就重建一個(gè)。

為什么學(xué)習(xí)backbone?這是個(gè)好問(wèn)題。在這個(gè)前端框架爆炸的年代,比起backbone,對(duì)開(kāi)發(fā)來(lái)說(shuō)有更多更好的選擇,reactvue,angular等等。但這些在使用這些框架的時(shí)候,心里卻總是有寫不踏實(shí)的感覺(jué)。MVVM雙向綁定是怎么實(shí)現(xiàn)的?Virtual DOM,diff算法在react里面是怎么實(shí)現(xiàn)的?大框架不好的地方就是,對(duì)于新手來(lái)說(shuō),真正認(rèn)識(shí)其中的原理很不容易。原理不會(huì)變,而API是會(huì)變的。

所以我決定靜下心先學(xué)習(xí)backbone,并認(rèn)真地研究其中的原理。(這里挖一個(gè)坑。這幾天在讀backboneunderscore的源碼,爭(zhēng)取寫一篇源碼解析的文章。)

學(xué)習(xí)框架最好的方式就是寫一個(gè)應(yīng)用出來(lái),于是乎我就寫了一個(gè)應(yīng)用來(lái)練手。中間浪費(fèi)了很多很多時(shí)間在完全沒(méi)有意義的糾結(jié)上面,所以最后是花了很長(zhǎng)時(shí)間才搞定的。

這一篇文章是一個(gè)總結(jié),比較個(gè)人化。主要是說(shuō)說(shuō)收獲和經(jīng)驗(yàn)。

應(yīng)用的功能

這個(gè)應(yīng)用是一個(gè)個(gè)人簡(jiǎn)歷生成器。前端用backbone + jquery + underscore + webpack + scss,后端用express??梢酝ㄟ^(guò)瀏覽器界面填寫個(gè)人相關(guān)信息,把數(shù)據(jù)發(fā)送到后端,用nodejs來(lái)負(fù)責(zé)存儲(chǔ)數(shù)據(jù),生成靜態(tài)文件。具體詳情可以見(jiàn)github的地址。

相關(guān)學(xué)習(xí)資料

backbone屬于典型的,學(xué)的時(shí)候覺(jué)得很簡(jiǎn)單,自己寫的時(shí)候一臉懵逼的框架。相比reactreact學(xué)的時(shí)候覺(jué)得難度不小,而且加上redux之后對(duì)一些函數(shù)式編程的東西偶爾會(huì)感到很費(fèi)解??墒歉?b>redux官網(wǎng)推薦的教程慢慢看之后還是能夠比較輕松地寫出一個(gè)過(guò)得去的應(yīng)用的。然而backbone確是相反,學(xué)的時(shí)候覺(jué)得不難,真正寫的時(shí)候卻感覺(jué)很多東西很難控制,而且要思考的地方比用大框架多不少。

比較好的教程有這一個(gè)。這個(gè)教程里面講了mvc的基礎(chǔ)知識(shí),backbone的基礎(chǔ)知識(shí),以及一個(gè)todo應(yīng)用,一個(gè)帶后端的應(yīng)用還有一個(gè)和用requirejs進(jìn)行模塊化處理的應(yīng)用。根據(jù)這個(gè)教程老老實(shí)實(shí)過(guò)一遍其實(shí)大致就差不多了(然而我只看了todo...)。但是要深入理解并用backbone寫大應(yīng)用還是有不小難度的。

模塊化

這里用了webpack。說(shuō)實(shí)話,webpack真的是神一般的存在。AMD也好,CMD也好,ES6模塊化標(biāo)準(zhǔn)也好都可以輕松打包壓縮,還有很多很方便的插件,不能再爽...backbone的年代(說(shuō)的好像很久遠(yuǎn)了一樣...)可能模塊化還不算特別普及,所以很多例子也是用script引入的。這樣的命名污染問(wèn)題自然顯而易見(jiàn)。而且發(fā)出多次請(qǐng)求也會(huì)影響性能。因此通過(guò)模塊化打包還是非常必要的。

model和collection

backbone中,modelcollection相對(duì)于view的代碼量是小很多很多的。在里面主要處理的是view所呈現(xiàn)的數(shù)據(jù)。而且比較重要的是這個(gè)model會(huì)與后端數(shù)據(jù)庫(kù)的數(shù)據(jù)類型有很密切的聯(lián)系。一般來(lái)說(shuō),后端的接口要求“比較RESTful”,前后端以json作為數(shù)據(jù)傳遞的方式。這樣,從后端獲取數(shù)據(jù)的時(shí)候fetch到處理也比較容易,本地的數(shù)據(jù)save到服務(wù)器的數(shù)據(jù)處理也會(huì)更加自然(都是json)。當(dāng)然這也不是硬性規(guī)定的,用傳統(tǒng)的jqueryajax也是可以的,但這可能就違背了backbone原本的初衷了(?)。在本人寫的這個(gè)應(yīng)用里面就沒(méi)有遵守這一點(diǎn)。后面會(huì)說(shuō)明原因。

model里面常常要覆蓋的是defaultinitialize方法,如果需要對(duì)save以及fetch的數(shù)據(jù)做特殊處理,則需要重寫toJSONparse方法。

在我的這個(gè)應(yīng)用里面,存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)比較特殊。簡(jiǎn)歷有幾個(gè)小的嵌套的collection,有幾個(gè)不是collectionattributes,算是比較復(fù)雜的結(jié)構(gòu)。因此重寫了toJSONparse方法,但是后來(lái)沒(méi)有用到重寫的parse方法,因?yàn)榘l(fā)現(xiàn)直接用jqueryajax更加方便直接。重寫的方法見(jiàn)這個(gè)鏈接,具體來(lái)說(shuō)就是當(dāng)需要保存并post數(shù)據(jù)到數(shù)據(jù)庫(kù)的時(shí)候,把model的屬性(這個(gè)屬性不是attributes里面的那個(gè),而是真正意義上的屬性,類似a.b)解析為json結(jié)構(gòu),然后再保存。而fetch到數(shù)據(jù)的時(shí)候就用得到的數(shù)據(jù)(一般是json)初始化幾個(gè)collection,然后直接加到model的屬性(a.b這種形式的屬性)中去。

。其實(shí)這種情況應(yīng)該是用backbone-relational之類的庫(kù)來(lái)解決的,但能解決問(wèn)題就好。
view中,collectionmodel會(huì)根據(jù)用戶操作view而發(fā)生變化,而變化之后又會(huì)影響view的數(shù)據(jù)呈現(xiàn)。而關(guān)于modelcollection的其他操作還有一些增刪查改之類的可以在具體情況下使用。這些操作也是常常寫在view中的。

view

view是一個(gè)大塊頭,這個(gè)應(yīng)用中view占了代碼中最大的部分。

view,顧名思義,就是視圖,數(shù)據(jù)的呈現(xiàn)。這里常常和模板配合。在寫后端express應(yīng)用的時(shí)候,因?yàn)?b>ejs有include的功能,因此模板就被切成了一小塊一小塊,這樣可以避免html主文件過(guò)大。但是backbone的很多例子都是直接一大塊一大塊地把模板塞到html主文件里面。明顯不利于維護(hù)。因此參考了別人的代碼,寫了下面的輔助函數(shù),把視圖的html文件讀取進(jìn)來(lái),并添加到相應(yīng)的view的模板里面,全部讀取完之后就調(diào)用回調(diào)函數(shù)。代碼如下:

var loadTemplate = function(views, callback) {
    var deferreds = [];
    $.each(views, function(index, view) {
        if(require("./views/" + view)) {
            // 把異步事件,即從文件中讀取html文件的函數(shù),壓入deferreds中
            deferreds.push($.get("../tpl/" + view + ".html", function(data) {
                // 修改相應(yīng)的view的template
                require("./views/" + view).prototype.template = _.template(data);
            }));
        } else {
            alert(view + " not found");
        }
    });

    // 把所有異步操作都完成之后才調(diào)用callback
    $.when.apply(null, deferreds).done(callback);
}

用這種方法來(lái)處理html過(guò)大問(wèn)題不算最好的方法,但是在這里能夠很好地解決問(wèn)題。

view中主要的是events,renderinitialize。在initialize里面可以通過(guò)listenTo來(lái)監(jiān)聽(tīng)一些model事件。

有時(shí)候在寫initialize的時(shí)候要自己render,但很多情況下不需要。render函數(shù)里面返回this之后,可以在其他地方,比如router中把model注入模板中然后把render返回的html直接插入頁(yè)面中。

var view = new formView({});
this.$container.html(view.render().el);
router

backbone的路由功能非常方便。在我的app應(yīng)用里面整個(gè)程序的入口就是router的函數(shù)??梢酝ㄟ^(guò)不同的url綁定不同的函數(shù),在函數(shù)中調(diào)用視圖的函數(shù)來(lái)實(shí)現(xiàn)不同路由的不同的html片段。
然而在實(shí)際操作的時(shí)候,可能是因?yàn)閭€(gè)人能力還不夠,有一個(gè)困難從頭到尾都無(wú)法解決。后來(lái)用了比較不好的辦法勉強(qiáng)替代了。問(wèn)題如下:假如要定義路由"/:tab/:filename",每次路由發(fā)生改變的時(shí)候都會(huì)調(diào)用路由函數(shù)。如果在這個(gè)路由函數(shù)里我新建了一個(gè)model實(shí)例,那當(dāng)我想改變tab的時(shí)候,就不得不重新觸發(fā)路由函數(shù),重新新建model。然而我希望model能夠不發(fā)生變化,因?yàn)?b>tab是在filename文件的前提下的標(biāo)簽頁(yè),不能換一個(gè)標(biāo)簽就重建一個(gè)model。這樣做要如何實(shí)現(xiàn)呢?想了三天到最后我還是放棄了...(也有可能自己想的需求是有點(diǎn)奇葩..)

其他小收獲

原來(lái)直接window.print()就可以調(diào)用瀏覽器打印功能了呀。有個(gè)小收獲就是有關(guān)瀏覽器打印的尺寸問(wèn)題,要根據(jù)A4的比例和邊距做調(diào)整,然后確定頁(yè)面中心的區(qū)域的比例。第二個(gè)收獲就是發(fā)現(xiàn)淘寶的那個(gè)icon庫(kù) iconfont 真的非常不錯(cuò),用起來(lái)也非常方便,以后可以去借一下素材hhh

遺憾

這個(gè)小應(yīng)用還是有很多不足的地方

UI不足,簡(jiǎn)歷頁(yè)面設(shè)計(jì)不足。(想爆了腦袋都不知怎么搞比較好看...)

功能還不夠強(qiáng)大,如果很多內(nèi)容填寫能夠更加細(xì)致就好了...

如果要部署github的話,還不夠方便。

node里面生成頁(yè)面那里用了一些拼接字符串的方法,更加不是很優(yōu)雅...

總結(jié)

通過(guò)這個(gè)backbone應(yīng)用的編寫,對(duì)于backbone算是有一個(gè)初步的了解了吧。對(duì)于MVC框架也有了一個(gè)大體的認(rèn)識(shí)。最近在看backboneunderscore的源碼,明后天會(huì)開(kāi)始寫一篇源碼解讀的文章,總結(jié)一下backbone里面值得學(xué)習(xí)的地方。(現(xiàn)在還在看,覺(jué)得history里面對(duì)于瀏覽器兼容的考慮處理挺有意思,Events要看點(diǎn)設(shè)計(jì)模式的東西)。這個(gè)暑假的最后就慢慢地看多幾遍backbone,好好學(xué)習(xí)一個(gè)!

backbone方面我還是個(gè)小白,文中有錯(cuò)誤請(qǐng)輕噴,相互學(xué)習(xí)!謝謝大家!

代碼在這里,希望能幫到你~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/80128.html

相關(guān)文章

  • Backbone源碼解讀(三)

    摘要:事件關(guān)于路由觸發(fā)事件是通過(guò)兩個(gè)函數(shù)來(lái)完成的,它們分別是和前者會(huì)檢測(cè)路由是否發(fā)生了改變,如果改變了就會(huì)觸發(fā)函數(shù)并調(diào)用函數(shù),而后者會(huì)通過(guò)路由片段來(lái)找到相關(guān)的事件函數(shù)來(lái)觸發(fā)。 注意:強(qiáng)烈建議一邊閱讀源碼一邊閱讀本文。 終于到了backbone源碼解讀的最后一篇,這一篇和前面幾篇時(shí)間上有一定的間隔(因?yàn)橐貙W(xué)校有一堆亂七八糟的事...)。在這一篇里面會(huì)講解Bakcbone的sync & rou...

    feng409 評(píng)論0 收藏0
  • Backbone 源碼解讀(一)

    1. 開(kāi)場(chǎng) 1.1 MVC? MVC是一種GUI軟件的一種架構(gòu)模式。它的目的是將軟件的數(shù)據(jù)層(Model)和視圖(view)分開(kāi)。Model連接數(shù)據(jù)庫(kù),實(shí)現(xiàn)數(shù)據(jù)的交互。用戶不能直接和數(shù)據(jù)打交道,而是需要通過(guò)操作視圖,然后通過(guò)controller對(duì)事件作出響應(yīng),最后才得以改變數(shù)據(jù)。最后數(shù)據(jù)改變,通過(guò)觀察者模式更新view。(所以在這里需要用到設(shè)計(jì)模式中的觀察者模式) 1.2 Smalltalk-80...

    Kosmos 評(píng)論0 收藏0
  • 使用 node+backbone搭建個(gè)人博客系統(tǒng)

    摘要:視圖主要是用模版引擎加上數(shù)據(jù)進(jìn)行渲染。服務(wù)端用框架提供數(shù)據(jù)接口,配合中和的交互操作,主要是獲取,更新,保存,刪除等。測(cè)試框架使用斷言庫(kù)使用。本次項(xiàng)目用的文件,略圖如下,好了,通過(guò)前面的編碼,系統(tǒng)已經(jīng)初步完成了?,F(xiàn)在需要部署發(fā)布到線上了。 myblog 博客站點(diǎn)地址:http://www.snayan.com。項(xiàng)目地址:https://github.com/snayan/myblog 本...

    lushan 評(píng)論0 收藏0
  • Backbone源碼解讀(二)

    摘要:以為例構(gòu)造函數(shù)的內(nèi)容構(gòu)造函數(shù)的內(nèi)部一般會(huì)做以下幾個(gè)操作各種給內(nèi)部對(duì)象設(shè)置屬性。為什么呢源碼做出了解釋。在里面會(huì)調(diào)用用戶傳入的回調(diào)函數(shù)并觸發(fā)事件表示已經(jīng)同步了。整個(gè)的源碼事實(shí)上就是這兩組東西。 1. 開(kāi)場(chǎng) 強(qiáng)烈建議一邊看著源碼一邊讀本文章,本文不貼大段代碼。源碼地址。在寫backbone應(yīng)用的時(shí)候,說(shuō)實(shí)話,大部分的時(shí)間都是在寫這三個(gè)模塊的內(nèi)容。關(guān)于這三個(gè)模塊的分析網(wǎng)上隨隨便便就能找到一堆...

    Sleepy 評(píng)論0 收藏0
  • Backbone精髓,觀察者模式和事件

    摘要:原文精髓,觀察者模式和事件交互邏輯更需要設(shè)計(jì)模式設(shè)計(jì)模式將人們?cè)谝酝拈_(kāi)發(fā)過(guò)程中的經(jīng)驗(yàn)加以總結(jié),以指導(dǎo)后人。的事件根據(jù)上面討論,要實(shí)現(xiàn)觀察者模式,事件是非常重要的機(jī)制??偨Y(jié)雖然是模式的框架,但是其核心卻是界面的觀察者模式和事件機(jī)制。 前言 本人并非專業(yè)的前端,只是由于需要被迫轉(zhuǎn)做一段時(shí)間的前端,一段時(shí)間以來(lái)開(kāi)始探索javascript上的MVC模式,最終打算從Backbone下手。在...

    Snailclimb 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<