自定義條件編譯

緣由:

uni-app同一套代碼 無法區(qū)分 微信小程序插件 和微信小程序

當(dāng)前項(xiàng)目開發(fā)微信小程序、支付寶小程序、業(yè)務(wù)需求需要開發(fā)微信小程序插件
但是uni-app只能區(qū)分運(yùn)行平臺(tái)微信 支付寶 app等,無法區(qū)分插件和小程序,因此決定自己寫一個(gè)條件預(yù)編譯來區(qū)分。

方案思路:

參考當(dāng)前條件編譯模式,通過自定義腳本將不同平臺(tái)的代碼刪除,保留當(dāng)前符合條件的代碼。

  • 將代碼編譯生成新的目錄
  • 如何刪除非當(dāng)前條件的代碼
  • 如何匹配條件標(biāo)識(shí)開始和結(jié)束
    ----- 優(yōu)化-----
  • html js css json文件類型的適配
  • 在當(dāng)前平臺(tái)需要支持其他平臺(tái)
  • 差量編譯
  • 資源文件處理
  • 環(huán)境適配
思考1 --- (將代碼編譯生成新的目錄)
目前開發(fā)代碼都是在一個(gè)src目錄下,通過腳本將需要打包的目錄,
遍歷文件 將刪除后的代碼寫入新的目錄
/*
  參考系統(tǒng)工具,我們平時(shí)開發(fā)的內(nèi)容代碼,最終也是在另一個(gè)目錄下運(yùn)行;
  系統(tǒng)的也是通過將當(dāng)前代碼經(jīng)過編譯 生成對(duì)應(yīng)的平臺(tái)的文件的代碼
*/
思考2 --- (如何刪除非當(dāng)前條件的代碼)
 按行讀取文件

我們可以發(fā)現(xiàn),條件標(biāo)識(shí) #ifdef  #end結(jié)束等 都是單獨(dú)一行;
所以我們可以通過按行讀取文件的內(nèi)容, 判斷符合#ifdef條件, 并且不是當(dāng)前平臺(tái)的時(shí)候,
  下面的每一行開始不再寫入,
直到碰到對(duì)應(yīng)的結(jié)束標(biāo)記,重新在開始寫入.
思考3 --- (如何匹配條件標(biāo)識(shí)開始和結(jié)束)
 正則表達(dá)式 判斷
  我們可以通過正則表達(dá)式,將當(dāng)前一行判斷是不是符合 #ifdef 微信 || 支付寶|| 插件 等
截取出后面的部分,按照 || 分隔 判斷是否包含當(dāng)前條件 不包含則后面的代碼需要?jiǎng)h除

需要解決的問題就是這幾步!

深度考慮

1. 當(dāng)前平臺(tái)條件編譯有 html js css的代碼

因此我們需要添加配置,將 #ifdef 、/* #ifdef */ 等 根據(jù)不同格式的統(tǒng)一處理,添加所有需要的平臺(tái)的格式的條件標(biāo)識(shí)

2. 在當(dāng)前平臺(tái)需要支持其他平臺(tái)

因?yàn)槲覀兊奈⑿判〕绦虿寮?也是運(yùn)行在微信小程序上的,而我們的小程序和插件是一套代碼, 因此插件編譯的時(shí)候 ,需要支持微信小程序的代碼,

  • 因此我們需要對(duì)當(dāng)前平臺(tái) 設(shè)置一個(gè)可以匹配其他平臺(tái)的配置, 在判斷是不是當(dāng)前平臺(tái)同時(shí)也判斷一下符不符合配置的其他條件

優(yōu)化體驗(yàn)

1. 差量編譯

上面的步驟完成后 我們實(shí)際已經(jīng)完成了條件編譯;
但是對(duì)于文件較多的時(shí)候,每次修改一個(gè)文件,重新在編譯生成的,非常耗時(shí)間,也不方便我們調(diào)試.

因此我們做了差量編譯,監(jiān)聽處理變更的文件.

2. 資源文件處理

由于資源文件都在一個(gè)目錄下,并且還有一些不需要編譯的目錄可以直接copy過去的,
在配置文件中 添加不需要區(qū)分條件編譯的相關(guān)目錄,則直接copy.

3. 環(huán)境適配

開發(fā)中 都有開發(fā)環(huán)境,測(cè)試環(huán)境,線上環(huán)境;
我們的小程序有些功能只能在上線才能測(cè)試,因此我們會(huì)發(fā)布兩個(gè)不同id的小程序 一個(gè)用于測(cè)試,一個(gè)用于線上.

對(duì)于區(qū)分開發(fā) 測(cè)試 線上環(huán)境,我們處理方式 也是將
這三種環(huán)境 當(dāng)做 三個(gè)平臺(tái)處理,因?yàn)槲覀兊臈l件平臺(tái)支持配置其他條件平臺(tái);
所以 當(dāng)處理其他條件平臺(tái)的時(shí)候,系統(tǒng)會(huì)自動(dòng)添加當(dāng)前運(yùn)行環(huán)境 到 對(duì)應(yīng)平臺(tái)的適配條件中,

例如 運(yùn)行命令 node build.js weixin dev 
則會(huì)在 weixin.coexist中 添加dev 條件 這個(gè)是在運(yùn)行時(shí)添加的
weixin: {
   coexist:['dev']
}  

附言

下面是一些偽代碼:

function 遞歸遍歷文件夾 {
    
    function 讀取單個(gè)文件 {
        
        
        for (遍歷文件內(nèi)容 按照行讀取) {
            
            var line = 按行讀取;
            
            if 條件編譯已經(jīng)開始 {
                
                if line == 是條件編譯模式,并且不包含當(dāng)前平臺(tái) {
                    開始下一行的判斷;
                    continue;
                }
                
                if line == #end {
                    結(jié)束條件編譯標(biāo)記,重新開始讀寫;
                    continue;
                }
                
                直接進(jìn)入下一行
                continue;
            }
            
            將line寫入新的文件;
        }
    }
}

其中 在讀取文件的時(shí)候 使用異步的方式,提高速度,可以縮短一半多的時(shí)間;

對(duì)于異步結(jié)束判斷會(huì)延遲判斷 延遲也會(huì)有一個(gè)標(biāo)記,最后一個(gè)延遲到的時(shí)候,判斷是否結(jié)束 ,
同時(shí)有一個(gè)文件寫入的計(jì)數(shù),最后只要判斷文件是否在寫入

附件源碼:
直接在 precompile 下面 運(yùn)行
鏈接: https://pan.baidu.com/s/1asmHTc2tZl3cfAmhv_kIMQ 密碼: t35f

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容