糯米PC端重構(gòu)之實踐

上一篇文章談到了重構(gòu)的原因和基本思路绅项,在這片文章里我們將具體地闡述我們是如何做的紊册。

技術(shù)選型

基本采用了原有的技術(shù)實現(xiàn),以js快耿、lesshtml為基礎(chǔ)囊陡,這沒什么好說的。在服務(wù)端模板的選擇中掀亥,我們選擇了smarty模板关斜,在糯米的wap端,我們采用了crox這個模板铺浇,兩者我們都解決了同一份模板在前后端通用的小難題痢畜,大大地提高了開發(fā)效率。

目錄結(jié)構(gòu)

我們的目錄結(jié)構(gòu)參考了我們的團隊規(guī)范鳍侣,拋棄了原有的FIS的結(jié)構(gòu)形式丁稀,變?yōu)橐韵滦问剑?/p>

.
├── bower.json
├── build
├── build.sh
├── dep // 第三方依賴
├── fis-conf.js
├── gulpfile.js
├── mock
├── node_modules
├── package.json
├── preview
├── src
├── static // 靜態(tài)資源
├── template // 后端模板
├── test
├── tool
└── webpack.config.js

模塊管理

我們的模塊構(gòu)建方式采用commonjs,因此我們可以利用npm上大量的優(yōu)質(zhì)模塊倚聚,通過webpack可以跟我們前端開發(fā)常用的AMDCMD無縫的結(jié)合线衫。

第三方依賴

開發(fā)過程中,必不可少將會用到社區(qū)里現(xiàn)有的優(yōu)質(zhì)模塊惑折,通過bower進行所有模塊的管理授账,我們將統(tǒng)一放在dep文件夾下進行管理,并通過webpack的配置惨驶,可以在本地模塊的應用白热。 如在webpackreslove配置項中配置相應的alias,就可以在實際開發(fā)中調(diào)用它粗卜,如requirejspath配置屋确。

// webpack.config.js
alias = {
    'moye': depPath + '/moye/src/ui',
    'avalon': depPath + '/avalon/dist/avalon',
    'etpl': depPath + '/etpl/src/main'
};

// main.js
var moye = require('moye');
var avalon = require('avalon');

管理其他資源

開發(fā)過程中,一個組件通常包含多種資源(圖片、less攻臀、swf焕数、tpl等),如何才能方便的調(diào)用和管理呢刨啸?

對于以上問題堡赔,通過webpack的loader機制,我們將所有的資源都統(tǒng)一在JS中進行管理设联,而且我們可以通過編寫自己的loader善已,來實現(xiàn)自己的所需的資源加載機制。舉個栗子仑荐,

require('./main.less'); // 組件所需的less
var etpl = require('etpl');// 前端模板引擎
var search = require('./search/main'); // js
var suggestion = require('raw!./suggestion.html'); // html文本雕拼,前端模板引擎用
var smartyTpl = require('smarty4js!./smarty.tpl'); // smarty模板纵东,轉(zhuǎn)成js模板函數(shù)
var $ = require('jquery');

var exports = {
    init: function (options) {
        // do something
    },
    render: function () {
        // data是數(shù)據(jù)對象
        etpl.compile(suggestion).render(data);
        smartyTpl.render(data);
    }
};
module.exports = exports;

通過上面的代碼實例粘招,我們發(fā)現(xiàn)所有的資源都在一個main.js獲得清晰的展現(xiàn),而不是分散在整個項目中偎球,因此便于更好地維護一個組件洒扎,組件在一定程度上變得內(nèi)聚。通過webpack的loader衰絮,我們將一些需要通過手動或者命令行方式的工作袍冷,直接通過代碼就能實現(xiàn)。

前端測試

測試采用了karma + jasmine 結(jié)合完成猫牡,因為我們的運行代碼是通過webpack打包器生成的胡诗,所以測試過程中需要karmawebpack相結(jié)合。

上線部署

在上線部署中淌友,我們保留原有的FIS的部署功能煌恢,利用FIS強大的工程化的功能,我們的將資源路徑替換震庭、發(fā)布到測試機器瑰抵、壓縮打包strong text器联、資源統(tǒng)計追蹤等繁瑣的工作全部以工程化的形式完成二汛,大大的節(jié)約了人力成本,有興趣可以參考FIS官網(wǎng)的示例拨拓。

構(gòu)建工具

將一系列工作我們通過gulp全部串聯(lián)起來肴颊,整個過程所需要的命令為數(shù)不多。我們所用的gulp文件如下:

var gulp = require('gulp');
var config = require('./webpack.config');
var webpack = require('gulp-webpack-build');
var shelljs = require('shelljs');
var path = require('path');
var fs = require('fs');
var cwd = process.cwd();
var etpl = require('etpl');
var karma = require('karma').server;

// clean all files
gulp.task('clean', function () {
    shelljs.rm('-rf', path.join(cwd, 'static','common'));
    shelljs.rm('-rf', path.join(cwd, 'static','car'));
});



function printResult(stats) {
    stats = stats.toJson();
    (stats.errors || []).forEach(function (err) {
        console.error('error', err);
    });

    stats.assets.forEach(function (item) {
        var size = (item.size / 1024.0).toFixed(2) + 'kB';
        console.log('generated', item.name, size);
    });
}

var src = './src',
    webpackOptions = {
        debug: false,
        // devtool: '#source-map',
        watchDelay: 200
    },
    webpackConfig = {
        useMemoryFs: true,
        progress: true
    };
var CONFIG_FILENAME = './webpack.config.js';
var dest = './static';

gulp.task('webpack', [], function() {
    return gulp.src('./webpack.config.js', { base: path.resolve(src) })
        .pipe(webpack.init(webpackConfig))
        .pipe(webpack.props(webpackOptions))
        .pipe(webpack.run())
        .pipe(webpack.format({
            version: false,
            timings: true
        }))
        .pipe(webpack.failAfter({
            errors: true,
            warnings: true
        }))
        .pipe(gulp.dest(dest));
});


gulp.task('build', function () {
    gulp.src('./src/**/*.tpl')
        .pipe(gulp.dest('template/newpc'));
});

gulp.task('watch', function () {
    gulp.watch(['./src/**/*.js', './src/**/*.less']).on('change', function(event) {
        if (event.type === 'changed') {
            gulp.src(event.path, { base: path.resolve(src) })
                .pipe(webpack.closest(CONFIG_FILENAME))
                .pipe(webpack.init(config))
                .pipe(webpack.props(webpackOptions))
                .pipe(webpack.watch(function(err, stats) {
                    gulp.src(this.path, { base: this.base })
                        .pipe(webpack.proxy(err, stats))
                        .pipe(webpack.format({
                            verbose: true,
                            version: false
                        }))
                        .pipe(gulp.dest(dest));
                }));
        }
    });
});

gulp.task('test', function (done) {
    karma.start({
        configFile: __dirname + '/test/config.js'
    }, done);
});


gulp.task('debug', ['webpack'],  function(){
    var process = require('child_process');
    process.exec('fis release -d local');
});

后續(xù)規(guī)劃

現(xiàn)如今糯米PC的技術(shù)框架還是采用以jquery為基礎(chǔ)的模塊化前端框架渣磷,這次通過commonjs的組織方式苫昌,也是為了后面代碼能夠在Node等后端進行處理,更好地達到前后端分層開發(fā),完完全全去除后端模板的依賴祟身。

在思考的過程中奥务,實際是借鑒React,希望后續(xù)在瀏覽器兼容放開的基礎(chǔ)和React更加成熟的基礎(chǔ)上袜硫,糯米部分復雜的業(yè)務(wù)能采用React Component的方式進行開發(fā)氯葬,來實現(xiàn)同構(gòu)開發(fā)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末婉陷,一起剝皮案震驚了整個濱河市帚称,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌秽澳,老刑警劉巖闯睹,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異担神,居然都是意外死亡楼吃,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門妄讯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來孩锡,“玉大人,你說我怎么就攤上這事亥贸」埽” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵炕置,是天一觀的道長荣挨。 經(jīng)常有香客問我,道長朴摊,這世上最難降的妖魔是什么默垄? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮仍劈,結(jié)果婚禮上厕倍,老公的妹妹穿的比我還像新娘。我一直安慰自己贩疙,他們只是感情好讹弯,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著这溅,像睡著了一般组民。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悲靴,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天臭胜,我揣著相機與錄音,去河邊找鬼。 笑死耸三,一個胖子當著我的面吹牛乱陡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仪壮,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼憨颠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了积锅?” 一聲冷哼從身側(cè)響起爽彤,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缚陷,沒想到半個月后适篙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡箫爷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年嚷节,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝶缀。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡丹喻,死狀恐怖薄货,靈堂內(nèi)的尸體忽然破棺而出翁都,到底是詐尸還是另有隱情,我是刑警寧澤谅猾,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布柄慰,位于F島的核電站,受9級特大地震影響税娜,放射性物質(zhì)發(fā)生泄漏坐搔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一敬矩、第九天 我趴在偏房一處隱蔽的房頂上張望概行。 院中可真熱鬧,春花似錦弧岳、人聲如沸凳忙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涧卵。三九已至,卻和暖如春腹尖,著一層夾襖步出監(jiān)牢的瞬間柳恐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乐设,地道東北人讼庇。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像近尚,于是被迫代替她去往敵國和親巫俺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

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

  • GitChat技術(shù)雜談 前言 本文較長肿男,為了節(jié)省你的閱讀時間介汹,在文前列寫作思路如下: 什么是 webpack,它要...
    蕭玄辭閱讀 12,674評論 7 110
  • 前端集成解決方案要求: 模塊化開發(fā)舶沛。最好能像寫nodejs一樣寫js嘹承,很舒服。css最好也能來個模塊化管理如庭! 性能...
    Www劉閱讀 3,000評論 1 20
  • 糯米PC是一個典型的PC站點頁面叹卷,包含一個團購網(wǎng)站所需要的全部功能,從網(wǎng)站開發(fā)角度來講坪它,是一個典型的website...
    沈禮閱讀 1,395評論 1 3
  • 在現(xiàn)在的前端開發(fā)中骤竹,前后端分離、模塊化開發(fā)往毡、版本控制蒙揣、文件合并與壓縮、mock數(shù)據(jù)等等一些原本后端的思想開始...
    Charlot閱讀 5,431評論 1 32
  • 我愛好攝影开瞭,但我覺得自己永遠成不了攝影師懒震,不過荷蘭攝影師Haje Jan Kamps在他的博客上寫的一篇文章給與了...
    無業(yè)遊民閱讀 578評論 0 1