H5 小型項(xiàng)目技術(shù)棧

1赋访、前言

本文主要記錄做小項(xiàng)目時(shí)所需要用到的技術(shù)棧。小項(xiàng)目的場(chǎng)景如:特定的活動(dòng)頁(yè)啄枕,某app的運(yùn)營(yíng)推廣頁(yè)婚陪,Hybrid App里的H5頁(yè)面等。

2频祝、技術(shù)棧構(gòu)成

既然是小項(xiàng)目泌参,自然不會(huì)考慮時(shí)下較火的一些框架,如Vue常空,React沽一,Angular等。先來(lái)考慮一個(gè)小項(xiàng)目中前端需要用到的技術(shù)點(diǎn):

  • 路由管理
  • 模板引擎(非靜態(tài)頁(yè)面需要用到)
  • DOM操作
    以上三點(diǎn)其實(shí)在Vue框架中都有體現(xiàn)漓糙,分別對(duì)應(yīng)vue-router铣缠,vue內(nèi)置的模板引擎,vue的虛擬DOM算法等昆禽,只是Vue對(duì)此進(jìn)行了封裝攘残,使用起來(lái)更便捷。借著這個(gè)思想为狸,我們可以自己組裝需要的類(lèi)庫(kù)歼郭。

2.1、路由管理模塊

路由模塊目前比較出名(成熟)的是page.js辐棒,26.3KBdirector.js病曾,19.9KB,這兩個(gè)框架完全可以滿(mǎn)足小項(xiàng)目的需求漾根,但還是有點(diǎn)重泰涂,前端路由本來(lái)不是很復(fù)雜,可以自己寫(xiě)一個(gè):

var Router = {
    routes: {},
    mode: null,
    config: function(options) {
        this.mode = options && options.mode && options.mode == 'history' 
                    && !!(history.pushState) ? 'history' : 'hash';
        this.routes=options && options.routes;
        return this;
    },
    add: function(re, handler) {
        this.routes[re]=handler;
        return this;
    },
    navigate: function(path) {
        path = path ? path : '';
        if(this.mode === 'history') {
            history.pushState(null, null, path);
        } else {
            window.location.href = window.location.href.replace(/#(.*)$/, '') + '#' + path;
        }
        Router.routes[path]();
        return this;
    },
    start:function(){
         var path=location.hash||‘#home’;
         if(this.mode === 'history') {
            window.on('popstate',function(){
                  this.navigate(path);
            })
        } else {
            window.on('hashchange',function(){
                this.navigate(path);
            })    
        }
    }
}
// 1辐怕、配置
Router.config({ 
    mode: 'history',
    routes:{
        '/home':function(){},
        ...
    }
});
// 2逼蒙、添加路由處理函數(shù)
Router
.add(/home, function() {
    console.log('home');
})
// 3、開(kāi)始監(jiān)聽(tīng)
Router.start();

2.2寄疏、模板引擎

前端圈模板引擎就多了去了是牢,目前我們部門(mén)使用的doT.js這里有一個(gè)JS模板引擎性能對(duì)比分析陕截,關(guān)于doT的使用方式可參見(jiàn)這篇文章驳棱,關(guān)于doT模板只想說(shuō)一句,它是可以和服務(wù)端做同構(gòu)的农曲,也就是說(shuō)前后端可以用同一套模板社搅。

2.3、DOM操作

移動(dòng)端當(dāng)然選擇Zepto.js了,DOM操作大家都知道形葬,這部分介紹使用zepto的最佳實(shí)踐:

  • 使用ID選擇器$('#id')選擇元素合呐,避免使用組合選擇器
  • 對(duì)需要復(fù)用的元素做緩存,用find查找子元素
  • 盡量使用zepto靜態(tài)方法
  • 使用事件代理笙以,而不是直接綁定元素
  • 盡量使用鏈?zhǔn)綄?xiě)法提高編程效率和代碼運(yùn)行效率

3淌实、代碼組織方式

vue實(shí)際上是一種MVVM模式,即Model源织,View翩伪,ViewModel微猖。通常一個(gè)頁(yè)面都是由Model(ajax數(shù)據(jù))和View(模板html)兩部分的谈息,但還缺一個(gè)組合這兩部分的模塊。前端MVC中的C就是這么一個(gè)模塊凛剥,稱(chēng)之為控制器Controller侠仇。對(duì)于小型項(xiàng)目MVC已經(jīng)可以應(yīng)對(duì)了,與之相似的還有MVP模式犁珠,其實(shí)前端就是這么一個(gè)發(fā)展過(guò)程:原生JS直接DOM=>jQuery操作DOM=>MVC模式=>MVP模式=>MVVM模式=>MVNV*模式÷叽叮現(xiàn)在以一個(gè)實(shí)例演示如何在小型項(xiàng)目中用上MVC模式:

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>MVC</title>
</head>

<body>
    <main>
        <div id="home"></div>
        <a href="#about"></a>
    </main>
    <template id='home-tmpl'>
        {{~it.content :value:key}}
        <div>{{value}}</div>
        {{~}}
    </template>
    <script src='./zepto.min.js'></script>
    <script src='./router.js'></script>
    <script src='./doT.js'></script>
    <script src='./index.js'></script>
</body>

</html>
// 路由初始化
Router.config({
    default: 'home',
    routes: {
        'home': function() {},
        'about': function() {}
    }
});
Router.add('home', Home.controller)
    .add('about', About.controllter)
    .start();

var Home = {
    $home: $('#home'),
    tmpl: $('#content-tmpl').html(),
    render: function(tmpl, data) {
        var tmpl_after = doT.template(tmpl, data);
        $home.html(tmpl_after);
    },
    modelAdapter: function(data) {
        var fixData = null;
        //對(duì)原始數(shù)據(jù)做處理...
        return fixData;
    },
    eventInit: function() {
        // 事件代理(不必等到頁(yè)面渲染完才開(kāi)始綁定)
        $home.on('click', '.selector', function(event) {
            event.preventDefault();
        });
    },
    controller: function() {
        $.ajax({
            url: '/path/to/file',
            type: 'GET',
            dataType: 'json',
            data: {
                'key': 'value'
            },
            success: function(result) {
                var data = this.modelAdapter(result);
                this.render(this.tmpl, data);
            },
            error: function(err) {
                console.log(err);
            }
        })
    }
}
var About = {
    // 與Home類(lèi)似
}

大致是這么個(gè)流程,再配合gulp等項(xiàng)目構(gòu)建犁享、打包工具(具體gulpfile.js配置項(xiàng)可參看這里)余素,項(xiàng)目基本就完成了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末炊昆,一起剝皮案震驚了整個(gè)濱河市桨吊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凤巨,老刑警劉巖视乐,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異敢茁,居然都是意外死亡佑淀,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)彰檬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)伸刃,“玉大人,你說(shuō)我怎么就攤上這事逢倍∞戎Γ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵瓶堕,是天一觀的道長(zhǎng)隘道。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么谭梗? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任忘晤,我火速辦了婚禮,結(jié)果婚禮上激捏,老公的妹妹穿的比我還像新娘设塔。我一直安慰自己,他們只是感情好远舅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布闰蛔。 她就那樣靜靜地躺著,像睡著了一般图柏。 火紅的嫁衣襯著肌膚如雪序六。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天蚤吹,我揣著相機(jī)與錄音例诀,去河邊找鬼。 笑死裁着,一個(gè)胖子當(dāng)著我的面吹牛繁涂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播二驰,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼扔罪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了桶雀?” 一聲冷哼從身側(cè)響起矿酵,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎背犯,沒(méi)想到半個(gè)月后坏瘩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漠魏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年倔矾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柱锹。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哪自,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出禁熏,到底是詐尸還是另有隱情壤巷,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布瞧毙,位于F島的核電站胧华,受9級(jí)特大地震影響寄症,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矩动,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一有巧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悲没,春花似錦篮迎、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至栈戳,卻和暖如春岂傲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荧琼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工譬胎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留差牛,地道東北人命锄。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像偏化,于是被迫代替她去往敵國(guó)和親脐恩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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