weex基于js service的文件瘦身方案

weex中頁面其實(shí)就是一個(gè)js文件,這個(gè)js文件由頁面業(yè)務(wù)代碼庫代碼組成。我們可以把庫代碼抽出來放到遠(yuǎn)端,供所有頁面使用。

weex提供的JS Service技術(shù),它允許我們?cè)陧撁婕虞d前注入一段js代碼,在頁面加載后使用。

我們需要把庫代碼統(tǒng)一放在一個(gè)js文件中,再將這個(gè)文件放到服務(wù)器上。

一般我們的項(xiàng)目有很多的工具類,這些工具類又依賴大量的npm第三方庫。要想把這些源碼都一起放進(jìn)service文件里,需要拿到npm第三方庫的源碼,我們可以使用webpack打包這些npm的第三方庫

新建一個(gè)js文件,只引用npm的第三方庫

// npm_libs.js
const md5 = require('md5');
const qs = require('qs');
...

module.exports = {
  md5,
  qs
}

用webpack打包該js文件,打包后的js需要用全局變量引用里面的module.export

var BasicLib; 
...
module.exports = {
    md5: md5
}
...
BasicLib = module.exports

service文件的代碼是這樣的,因?yàn)楣ぞ邘炜赡苄枰玫絯eex對(duì)象和其它變量,所以在這些變量傳進(jìn)去之后再去構(gòu)造它們

var npm_libs = ...;

var weex;
var NODE_ENV;

var someutil;
var init_someutil = function () {
    someutil = {
        md5: npm_libs.md5('123')
    }
}

var _init = function () {
    init_someutil();
}

service.register('KSService', {
  create: function(id, env, config) {
    return {
      instance: {
      },
      NormalService: function(_weex, _NODE_ENV) {
        weex = _weex;
        NODE_ENV = _NODE_ENV;
        _init();

        return {
            someutil
        }
      }
    }
  },
  refresh: function(id, env, config){
  },
  destroy: function(id, env) {
  }
})

這樣service文件就創(chuàng)建好了,下面看如何使用

var libs = new service.NormalService(weex, 'debug')
console.log(libs.someutil.md5)

但是實(shí)際上,我們肯定有很多的工具庫,這么多工具庫代碼全部放在一個(gè)js文件里是不合適的,所以我們先按之前的方式將工具庫代碼放進(jìn)service文件中,再將它們拆分成多個(gè)js文件,以后只對(duì)這些js文件進(jìn)行維護(hù)即可

使用腳本合并這些拆分出來的js文件

import os
import sys

root = os.path.abspath('.')

files = ['a', 'b', 'c']

servieFile = root + '/dist/' + 'service.js'

saveto = open(servieFile, 'w')

content = ''

for file in files:
    path = root + '/src/libs/' + file + '.js'

    exist = os.path.exists(path)
    if exist is False:
        print('error: file not exist ' + path)
        sys.exit()
    
    with open(path) as f:
        content = content + '\n' + f.read()
        

saveto.write(content)

print('libs saves to ' + servieFile)

現(xiàn)在我們需要在每次代碼修改后自動(dòng)執(zhí)行這個(gè)合并腳本,可以用webpack的插件實(shí)現(xiàn)

// hook這個(gè)再執(zhí)行我們上面寫的合并腳本
compiler.plugin('emit', function(compilation, callback) {
     // run py script
});

這樣,合并腳本就會(huì)在每次打包的時(shí)候自動(dòng)執(zhí)行了,但是這些拆分的js也會(huì)被打進(jìn)dist目錄,我們需要這些無用的文件,這里可以用chokidar監(jiān)控那個(gè)目錄,有改動(dòng)就進(jìn)行目錄刪除

const unuseDistFiles = './dist/src';

chokidar.watch(unuseDistFiles).on('all', (event, path) => {
    deleteDir(unuseDistFiles)
});

這樣就完成了,也可以在生產(chǎn)環(huán)境下使用uglify-es進(jìn)行js壓縮

if (env == 'production') {
    console.log('uglify js ' + path + ' started')

    var code = {
        "file.js": fs.readFileSync(path, "utf8"),
    };
    var options = {
         mangle: false,
        toplevel: true,
        output: {
            beautify: false
        }
    };
    var result = UglifyJS.minify(code, options);

    if (result.error == undefined) {
        fs.writeFileSync(path, result.code, 'utf8')
        console.log('uglify js ' + path + ' successed')
    }
}

由于頁面js會(huì)依賴這個(gè)service文件,所以一定要確保service加載完了再去加載頁面js,否則頁面會(huì)報(bào)錯(cuò)。并且這個(gè)service文件需要和頁面文件一起進(jìn)行版本管理,保證頁面和service版本一致。

在原來的庫文件中,去引用新的service即可實(shí)現(xiàn)無縫切換。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評(píng)論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,615評(píng)論 3 419
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,606評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,826評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,227評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,447評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,992評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,807評(píng)論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,001評(píng)論 1 370
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評(píng)論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,243評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評(píng)論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,709評(píng)論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,996評(píng)論 2 374

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

  • 做房地產(chǎn)銷售做的好的月收入可以達(dá)到3-10萬,但是也只有20%的房地產(chǎn)銷售精英才可以達(dá)到這個(gè)高度,銷售高手吃肉,普...
    楊星河閱讀 1,145評(píng)論 0 0
  • A BLE scan response is the packet that is sent by the adv...
    dzhou3閱讀 629評(píng)論 0 0
  • 福山站門前的地上看到了玫瑰大街的標(biāo)注,才反應(yīng)過來,我以為是梔子花,月季的這些都是玫瑰。 在等待去往大三島的巴士時(shí),...
    xltian_07閱讀 1,578評(píng)論 2 7
  • 窗外,有我看的到綠色 大片大片的綠 可我們之間隔著一層玻璃 我聞不到它的香味 我聽不到它唱的歌 我觸不到它的綠色的...
    山木錯(cuò)閱讀 329評(píng)論 0 1