自定义条件编译

缘由:

uni-app同一套代码 无法区分 微信小程序插件 和微信小程序

当前项目开发微信小程序、支付宝小程序、业务需求需要开发微信小程序插件
但是uni-app只能区分运行平台微信 支付宝 app等,无法区分插件和小程序,因此决定自己写一个条件预编译来区分。

方案思路:

参考当前条件编译模式,通过自定义脚本将不同平台的代码删除,保留当前符合条件的代码。

  • 将代码编译生成新的目录
  • 如何删除非当前条件的代码
  • 如何匹配条件标识开始和结束
    ----- 优化-----
  • html js css json文件类型的适配
  • 在当前平台需要支持其他平台
  • 差量编译
  • 资源文件处理
  • 环境适配
思考1 --- (将代码编译生成新的目录)
目前开发代码都是在一个src目录下,通过脚本将需要打包的目录,
遍历文件 将删除后的代码写入新的目录
/*
  参考系统工具,我们平时开发的内容代码,最终也是在另一个目录下运行;
  系统的也是通过将当前代码经过编译 生成对应的平台的文件的代码
*/
思考2 --- (如何删除非当前条件的代码)
 按行读取文件

我们可以发现,条件标识 #ifdef  #end结束等 都是单独一行;
所以我们可以通过按行读取文件的内容, 判断符合#ifdef条件, 并且不是当前平台的时候,
  下面的每一行开始不再写入,
直到碰到对应的结束标记,重新在开始写入.
思考3 --- (如何匹配条件标识开始和结束)
 正则表达式 判断
  我们可以通过正则表达式,将当前一行判断是不是符合 #ifdef 微信 || 支付宝|| 插件 等
截取出后面的部分,按照 || 分隔 判断是否包含当前条件 不包含则后面的代码需要删除

需要解决的问题就是这几步!

深度考虑

1. 当前平台条件编译有 html js css的代码

因此我们需要添加配置,将 #ifdef 、/* #ifdef */ 等 根据不同格式的统一处理,添加所有需要的平台的格式的条件标识

2. 在当前平台需要支持其他平台

因为我们的微信小程序插件 也是运行在微信小程序上的,而我们的小程序和插件是一套代码, 因此插件编译的时候 ,需要支持微信小程序的代码,

  • 因此我们需要对当前平台 设置一个可以匹配其他平台的配置, 在判断是不是当前平台同时也判断一下符不符合配置的其他条件

优化体验

1. 差量编译

上面的步骤完成后 我们实际已经完成了条件编译;
但是对于文件较多的时候,每次修改一个文件,重新在编译生成的,非常耗时间,也不方便我们调试.

因此我们做了差量编译,监听处理变更的文件.

2. 资源文件处理

由于资源文件都在一个目录下,并且还有一些不需要编译的目录可以直接copy过去的,
在配置文件中 添加不需要区分条件编译的相关目录,则直接copy.

3. 环境适配

开发中 都有开发环境,测试环境,线上环境;
我们的小程序有些功能只能在上线才能测试,因此我们会发布两个不同id的小程序 一个用于测试,一个用于线上.

对于区分开发 测试 线上环境,我们处理方式 也是将
这三种环境 当做 三个平台处理,因为我们的条件平台支持配置其他条件平台;
所以 当处理其他条件平台的时候,系统会自动添加当前运行环境 到 对应平台的适配条件中,

例如 运行命令 node build.js weixin dev 
则会在 weixin.coexist中 添加dev 条件 这个是在运行时添加的
weixin: {
   coexist:['dev']
}  

附言

下面是一些伪代码:

function 递归遍历文件夹 {
    
    function 读取单个文件 {
        
        
        for (遍历文件内容 按照行读取) {
            
            var line = 按行读取;
            
            if 条件编译已经开始 {
                
                if line == 是条件编译模式,并且不包含当前平台 {
                    开始下一行的判断;
                    continue;
                }
                
                if line == #end {
                    结束条件编译标记,重新开始读写;
                    continue;
                }
                
                直接进入下一行
                continue;
            }
            
            将line写入新的文件;
        }
    }
}

其中 在读取文件的时候 使用异步的方式,提高速度,可以缩短一半多的时间;

对于异步结束判断会延迟判断 延迟也会有一个标记,最后一个延迟到的时候,判断是否结束 ,
同时有一个文件写入的计数,最后只要判断文件是否在写入

附件源码:
直接在 precompile 下面 运行
链接: https://pan.baidu.com/s/1asmHTc2tZl3cfAmhv_kIMQ 密码: t35f

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352