本发明涉及js技术领域,尤其是涉及一种应用程序依赖的js代码与原生库兼容的方法及终端。
背景技术:
随着移动市场的迅速崛起,强调团队的快速响应与迭代,纯原生的开发方式已经难以满足需求,h5与react-native的开发方式凭借热更新渐渐成为主流应用的重要开发方式。
然而,h5与react-native的js代码功能往往依赖于原生的代码支持,需要通过js代码调用原生的注入方法来实现特定的功能,这时就需要考虑js代码与原生代码的兼容性,否则,会因为原生代码更新而js代码未同步导致功能异常,或者是js代码更新后调用原生代码的接口不存在,从而导致应用崩溃等问题。
目前h5没有通用的兼容方法,而react-native官方提供的react-nativelink方式,仅支持相对的文件路径,且不适合热更新的兼容检查,也难以满足大型应用依赖复杂的场景(如ios使用cocoapods引入依赖的方式)。
总之,当前还没有一种完善的方法解决js代码与原生代码的兼容问题,需要依赖开发人员对业务进行判断和预防。
技术实现要素:
本发明所要解决的技术问题是:提供一种应用程序依赖的js代码与原生库兼容的方法及终端,可以保证应用程序依赖的js代码与原生库的兼容性。
为了解决上述技术问题,本发明采用的一种技术方案为:
一种应用程序依赖的js代码与原生库兼容的方法,包括步骤:
s1、在原生库和js代码中分别添加对应jssdk版本号的声明;
s2、获取原生库对应的jssdk版本号,获取js代码对应的jssdk版本号;
s3、根据所述原生库对应的jssdk版本号和所述js代码对应的jssdk版本号判断应用程序依赖的js代码和原生库是否兼容。
为了解决上述技术问题,本发明采用的另一种技术方案为:
一种应用程序依赖的js代码与原生库兼容的终端,包括存储器、处理器及存储在存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
s1、在原生库和js代码中分别添加对应jssdk版本号的声明;
s2、获取原生库对应的jssdk版本号,获取js代码对应的jssdk版本号;
s3、根据所述原生库对应的jssdk版本号和所述js代码对应的jssdk版本号判断应用程序依赖的js代码和原生库是否兼容。
本发明的有益效果在于:通过在原生库和js代码中分别添加对应jssdk版本号的声明,在具体实现时分别获取原生库对应的jssdk版本号和js代码对应的jssdk版本号,根据所述原生库对应的jssdk版本号和所述js代码对应的jssdk版本号判断应用程序依赖的js代码和原生库是否兼容,可以保证应用程序依赖的js代码与原生库的兼容性,避免不兼容带来的问题,防止出现js代码构建的应用程序由于不兼容问题不可使用的情况,并且可以适用于各种js代码与原生库的兼容检测,适用性广。
附图说明
图1为本发明实施例的一种应用程序依赖的js代码与原生库兼容的方法的步骤流程图;
图2为本发明实施例的一种应用程序依赖的js代码与原生库兼容的终端的结构示意图;
图3为本发明实施例的jssdk示意图;
图4为本发明实施例的原生库声明对应jssdk版本号的步骤流程图;
图5为本发明实施例的一种应用程序依赖的js代码声明对应jssdk版本号的步骤流程图;
图6为本发明实施例的一种构建应用程序的方法的步骤流程图;
图7为本发明实施例的一种热更新的方法的步骤流程图;
标号说明:
1、一种应用程序依赖的js代码与原生库兼容的终端;2、存储器;
3、处理器。
具体实施方式
为详细说明本发明的技术内容、所实现目的及效果,以下结合实施方式并配合附图予以说明。
名词解释:
jssdk:jssdk是对原生库提供的能力的抽象,原生库是提供的能力的具体实现,可以理解为是提供原生库具体实现方法的接口的集合。
本发明最关键的构思在于:根据预先声明的原生库对应的jssdk版本号和js代码对应的jssdk版本号判断应用程序依赖的js代码和原生库是否兼容。
请参照图1,一种应用程序依赖的js代码与原生库兼容的方法,包括步骤:
s1、在原生库和js代码中分别添加对应jssdk版本号的声明;
s2、获取原生库对应的jssdk版本号,获取js代码对应的jssdk版本号;
s3、根据所述原生库对应的jssdk版本号和所述js代码对应的jssdk版本号判断应用程序依赖的js代码和原生库是否兼容。
从上述描述可知,本发明的有益效果在于:通过在原生库和js代码中分别添加对应jssdk版本号的声明,在具体实现时分别获取原生库对应的jssdk版本号和js代码对应的jssdk版本号,根据所述原生库对应的jssdk版本号和所述js代码对应的jssdk版本号判断应用程序依赖的js代码和原生库是否兼容,可以保证应用程序依赖的js代码与原生库的兼容性,避免不兼容带来的问题,防止出现js代码构建的应用程序由于不兼容问题不可使用的情况,并且可以适用于各种js代码与原生库的兼容检测,适用性广。
进一步的,所述jssdk版本号包括高位数和低位数;
所述步骤s3具体为:
判断所述原生库对应的jssdk版本号的高位数是否与所述js代码对应的jssdk版本号的高位数一致,且所述js代码对应的jssdk版本号的低位数是否小于或等于所述原生库对应的jssdk版本号的低位数,若是,则判定为兼容,若否,则为不兼容。
由上述描述可知,通过比较版本号高低位判断js代码与原生库的jssdk是否兼容,从而确定js代码与原生库是否兼容,可以简单快捷地进行兼容检测,提高便利性。
进一步的,所述步骤s2中获取原生库对应的jssdk版本号具体为:
通过脚本获取所述原生库的版本信息;
根据所述原生库的版本信息从服务端查询对应的jssdk版本号;
校验查询到的jssdk版本号,判断校验是否通过,若是,则将该jssdk版本号作为所述原生库对应的jssdk版本号,若否,则报错。
由上述描述可知,获取所述原生库对应的jssdk版本号时,通过脚本读取jssdk的版本信息,从服务端获取对应的jssdk版本号,再进行检验从而得出所述原生库对应的jssdk版本号,确保所述原生库对应的jssdk版本号无误,提高了兼容检验的可靠性。
进一步的,所述js代码中包括预设域名;
所述步骤s1包括:
通过在js代码的第一文件中预设字段声明js代码对应的jssdk版本号;
所述步骤s2中获取js代码对应的jssdk版本号具体为:
遍历所述预设域名下的所有第一文件,获取所有预设字段的值;
解析所有预设字段的值,获得所述预设域名下的所有jssdk版本号;
判断所述预设域名下的所有jssdk版本号是否互相兼容,若否,则报错,若是,则获取所述所有jssdk版本号中最高版本的jssdk版本号,并将所述最高版本的jssdk版本号作为所述js代码对应的jssdk版本号。
由上述描述可知,通过获取所述预设域名下的所有jssdk版本号,判断所有jssdk版本号是否互相兼容,可以确保js代码中的代码是互相兼容的,避免应用程序在后续使用中出错,提高可靠性,再将其中最高版本的jssdk版本号作为所述js代码对应的jssdk版本号用于与原生库的兼容判断,最高版本的jssdk版本号可以兼容剩余所有的jssdk版本号,能够将比较jssdk版本号的次数降到最低,快捷地实现兼容性判断,提高便利性。
进一步的,所述步骤s3还包括:
若所述应用程序依赖的js代码和原生库兼容,则根据当前原生库对应的jssdk版本号和js代码对应的jssdk版本号构建应用程序,否则,报错;
或者,根据判断结果反馈与所述判断结果对应的js代码构建的服务的地址。
由上述描述可知,判断js代码和原生库是否兼容可以用于构建应用程序,可以及时检测构建的应用程序所依赖的js代码是否与原生库兼容,在不兼容时及时报错,输出不兼容信息,避免构建的应用程序后续因不兼容导致的问题;也可以将判断结果用于已经构建好的应用程序的热更新,根据判断结果反馈与所述判断结果对应的js代码构建的服务的地址,帮助判断下发给应用程序的代码版本,保证更新后的应用程序的可用性。
请参照图2,一种应用程序依赖的js代码与原生库兼容的终端,包括存储器、处理器及存储在存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
s1、在原生库和js代码中分别添加对应jssdk版本号的声明;
s2、获取原生库对应的jssdk版本号,获取js代码对应的jssdk版本号;
s3、根据所述原生库对应的jssdk版本号和所述js代码对应的jssdk版本号判断应用程序依赖的js代码和原生库是否兼容。
从上述描述可知,本发明的有益效果在于:通过在原生库和js代码中分别添加对应jssdk版本号的声明,在具体实现时分别获取原生库对应的jssdk版本号和js代码对应的jssdk版本号,根据所述原生库对应的jssdk版本号和所述js代码对应的jssdk版本号判断应用程序依赖的js代码和原生库是否兼容,可以保证应用程序依赖的js代码与原生库的兼容性,避免不兼容带来的问题,防止出现js代码构建的应用程序由于不兼容问题不可使用的情况,并且可以适用于各种js代码与原生库的兼容检测,适用性广。
进一步的,所述jssdk版本号包括高位数和低位数;
所述步骤s3具体为:
判断所述原生库对应的jssdk版本号的高位数是否与所述js代码对应的jssdk版本号的高位数一致,且所述js代码对应的jssdk版本号的低位数是否小于或等于所述原生库对应的jssdk版本号的低位数,若是,则判定为兼容,若否,则为不兼容。
由上述描述可知,通过比较版本号高低位判断js代码与原生库的jssdk是否兼容,从而确定js代码与原生库是否兼容,可以简单快捷地进行兼容检测,提高便利性。
进一步的,所述步骤s2中获取原生库对应的jssdk版本号具体为:
通过脚本获取所述原生库的版本信息;
根据所述原生库的版本信息从服务端查询对应的jssdk版本号;
校验查询到的jssdk版本号,判断校验是否通过,若是,则将该jssdk版本号作为所述原生库对应的jssdk版本号,若否,则报错。
由上述描述可知,获取所述原生库对应的jssdk版本号时,通过脚本读取jssdk的版本信息,从服务端获取对应的jssdk版本号,再进行检验从而得出所述原生库对应的jssdk版本号,确保所述原生库对应的jssdk版本号无误,提高了兼容检验的可靠性。
进一步的,所述js代码中包括预设域名;
所述步骤s1包括:
通过在js代码的第一文件中预设字段声明js代码对应的jssdk版本号;
所述步骤s2中获取js代码对应的jssdk版本号具体为:
遍历所述预设域名下的所有第一文件,获取所有预设字段的值;
解析所有预设字段的值,获得所述预设域名下的所有jssdk版本号;
判断所述预设域名下的所有jssdk版本号是否互相兼容,若否,则报错,若是,则获取所述所有jssdk版本号中最高版本的jssdk版本号,并将所述最高版本的jssdk版本号作为所述js代码对应的jssdk版本号。
由上述描述可知,通过获取所述预设域名下的所有jssdk版本号,判断所有jssdk版本号是否互相兼容,可以确保js代码中的代码是互相兼容的,避免应用程序在后续使用中出错,提高可靠性,再将其中最高版本的jssdk版本号作为所述js代码对应的jssdk版本号用于与原生库的兼容判断,最高版本的jssdk版本号可以兼容剩余所有的jssdk版本号,能够将比较jssdk版本号的次数降到最低,快捷地实现兼容性判断,提高便利性。
进一步的,所述步骤s3还包括:
若所述应用程序依赖的js代码和原生库兼容,则根据当前原生库对应的jssdk版本号和js代码对应的jssdk版本号构建应用程序,否则,报错;
或者,根据判断结果反馈与所述判断结果对应的js代码构建的服务的地址。
由上述描述可知,判断js代码和原生库是否兼容可以用于构建应用程序,可以及时检测构建的应用程序所依赖的js代码是否与原生库兼容,在不兼容时及时报错,输出不兼容信息,避免构建的应用程序后续因不兼容导致的问题;也可以将判断结果用于已经构建好的应用程序的热更新,根据判断结果反馈与所述判断结果对应的js代码构建的服务的地址,帮助判断下发给应用程序的代码版本,保证更新后的应用程序的可用性。
实施例一
请参照图1和图3-6,一种应用程序依赖的js代码与原生库兼容的方法,包括步骤:
s1、在原生库和js代码中分别添加对应jssdk版本号的声明;
其中,由于ios端和android端的原生库名称及版本号可能不一致,因此采用jssdk表示原生库实现的功能,如图3所示,一个jssdk分别对应各端的一个原生库,jssdk是对原生库提供的能力的抽象,原生库是提供能力的具体实现。
例如jssdk名称为rn_image,用于提供图片的下载及展示功能,对应的功能由ios的原生库image_ios和android的原生库image_android来实现,不同的系统有对应的原生库。
jssdk的一个版本对应一个或者多个的原生库版本,每个jssdk的版本提供的能力与接口都是一致的,与同一个jssdk版本对应的原生库的多个版本,是对提供能力的具体实现,高版本的原生库是对bug的进行了修复或者功能完善;
所述jssdk版本号包括高位数和低位数,例如jssdk的版本号定义为x.y,x表示不兼容修改(如代码重构,接口变更),y表示兼容修改(如新增功能,已有功能不变)。
所述js代码中包括预设域名;
具体地,如图4所示,通过在原生库的特定文件中声明所述原生库对应的jssdk版本号,例如:
所述"rn_image":"1.0"为声明的原生库对应的jssdk版本号;
发布所述原生库的原生版本,通过脚本读取jssdk版本号,生成映射关系,通过接口将发布的原生库版本和对应的jssdk版本号的映射关系保存到服务端;
如图5所示,通过在js代码的第一文件中预设字段声明js代码对应的jssdk版本号;
所述js代码的第一文件为package.json文件,所述预设字段为jssdkdependencies字段;
例如:
所述“@sdp.nd”为所述预设域名,即js代码默认的私有的域名;
所述"jssdkdependencies"中包括各个功能各自对应的jssdk版本号;
发布npm版本的js代码;
s2、获取原生库对应的jssdk版本号,获取js代码对应的jssdk版本号;
具体地,如图6所示,构建应用程序时,安装依赖的原生库,通过脚本获取所述原生库的版本信息;
根据所述原生库的版本信息从服务端查询对应的jssdk版本号;
校验查询到的jssdk版本号,判断校验是否通过,若是,则将该jssdk版本号作为所述原生库对应的jssdk版本号,若否,则报错;
其中,判断一个原生库是否提供唯一的一个jssdk版本号,即每个原生库提供的jssdk版本号是否都不相同,若是,则校验通过,若否,则出现多个原生库声明了相同的jssdk版本号等情况,这时则校验不通过。
安装依赖的js代码,通过脚本遍历所述预设域名下的所有第一文件,获取所有预设字段的值,即通过脚本遍历预设域名目录下各个包的package.json文件,获取所有jssdkdependencies字段的值;
解析所有预设字段的值,获得所述预设域名下的所有jssdk版本号;
校验所有jssdk版本号,判断所述预设域名下的所有jssdk版本号是否互相兼容,若否,则报错,若是,则获取所述所有jssdk版本号中最高版本的jssdk版本号,并将所述最高版本的jssdk版本号作为所述js代码对应的jssdk版本号,令每个功能对应的jssdk仅存在一个版本号用于兼容判断;
其中,所述jssdk版本号的高位数不同则表示不兼容,高位数相同,并且低位数不同或相同时则表示兼容,例如,1.1和2.0是不兼容的,1.0和1.1是兼容的,在兼容时取最高版本的jssdk版本号即1.1作为js代码对应的jssdk版本号。
s3、根据所述原生库对应的jssdk版本号和所述js代码对应的jssdk版本号判断应用程序依赖的js代码和原生库是否兼容。
具体地,对比所述原生库对应的jssdk版本号和所述js代码对应的jssdk版本号,判断同一功能的所述原生库对应的jssdk版本号的高位数是否与所述js代码对应的jssdk版本号的高位数一致,且所述js代码对应的jssdk版本号的低位数是否小于或等于所述原生库对应的jssdk版本号的低位数,若是,则判定为兼容,若否,则为不兼容;
例如,js代码声明的jssdk版本号(a.b),原生库声明的jssdk的版本号(c.d),在两个版本号的高位一致,并且js代码的jssdk版本号低位小于等于原生库的jssdk版本号时,即a==c&&b<=d时,所述js代码与原生库兼容;
若所述应用程序依赖的js代码和原生库兼容,则根据当前原生库对应的jssdk版本号和js代码对应的jssdk版本号构建应用程序,具体地,上传当前的js代码版本和原生库对应的jssdk版本号列表完成构建,否则,输出不兼容信息,进行报错,提示哪些功能的jssdk版本号不兼容,方便后续排查;
或者,在已有的应用程序热更新时,根据判断结果反馈与所述判断结果对应的js代码构建的服务的地址,帮助判断下发的代码版本,保证更新后的js代码的可用性;
具体地,若判断结果为兼容,则向请求更新的应用程序下发已构建的与所述应用程序原生库兼容的服务的地址;
若判断结果为不兼容,则返回无新的构建的服务信息,或是返回旧的构建的服务及地址。
实施例二
请参照图6,将实施例一应用于构建应用程序的具体场景,构建的应用程序依赖的js代码与原生库不匹配,在构建阶段就阻断构建,防止应用程序上线后出现问题,避免后续的耗时处理:
s1、在原生库和js代码中分别添加对应jssdk版本号的声明;
开发人员修改js代码,修改后的js代码需要依赖原生库的修改;
发布新的js代码版本,同时修改jssdkdependencies字段中依赖的jssdk的版本号高位数;
但此时原生库的开发并未完成,依旧使用原有的原生库,未对原生库进行修改;
s2、获取原生库对应的jssdk版本号,获取js代码对应的jssdk版本号;
构建服务,安装原生库依赖,根据原生库的版本信息从服务器获取对应的jssdk版本号;
安装新的js代码版本,得到对应的jssdk版本号;
s3、根据所述原生库对应的jssdk版本号和所述js代码对应的jssdk版本号判断应用程序依赖的js代码和原生库是否兼容。
对比原生库对应的jssdk版本号和新的js代码对应的jssdk版本号,判断是否兼容,由于原生库未修改,因此原生库对应的jssdk版本号和新的js代码对应的jssdk版本号不兼容,进行报错,从而避免js代码与原生库不兼容在后续带来的问题,避免后续的耗时处理;
重新构建服务,指定旧版本的js代码进行应用程序的重新构建,打包旧版本的、与原生库兼容的js代码,上传打包好的旧版本js代码,正常发布服务。
实施例三
请参照图7,将实施例一应用于应用程序热更新的具体场景,在修复移动应用的线上bug时:
s1、在原生库和js代码中分别添加对应jssdk版本号的声明;
例如在页面样式异常时,开发人员修复导致样式异常的js代码,但不修改原生库的代码,因此不修改原生库对应的jssdk版本号,所述jssdk版本号即为图中的jssdk依赖;
发布新的js代码版本,但不修改jssdkdependencies字段的值,即也未修改js代码对应的jssdk版本号;
s2、获取原生库对应的jssdk版本号,获取js代码对应的jssdk版本号;
构建服务,安装新的js代码版本,收集所述新的js代码中的jssdk版本号,完成服务的构建,得到构建结果及所述新的js代码依赖的jssdk版本号,并将构建结果及所述新的js代码依赖的jssdk版本号保存到服务端;
移动应用提供自身依赖的js代码对应的jssdk版本号等信息向服务端请求更新包;
服务端获取移动应用提供的jssdk版本号;
s3、根据所述原生库对应的jssdk版本号和所述js代码对应的jssdk版本号判断应用程序依赖的js代码和原生库是否兼容。
具体地,服务端通过比对jssdk版本号判定移动应用的js代码和原生库兼容,返回最新的、兼容的构建结果地址,即返回服务端保存的所述新的js代码的构建结果地址;
移动应用比对本地js代码的jssdk版本号与下发的构建结果地址中的js代码对应的jssdk版本号,决定是否更新,若本地的jssdk版本号比下发的jssdk版本号更高级,即本地的js代码版本更新,则移动应用不需要进行更新,反之,则移动应用进行更新,具体的,通过下载最新的构建结果,展示最新页面,修复bug。
实施例四
请参照图7,将实施例一应用于应用程序热更新的具体的场景,在发布新功能时:
新功能依赖原生库的修改,需要在不影响线上应用的情况下实现新功能;
例如增加新的定位功能,开发人员开发了定位的功能,所述定位功能需要依赖原生库的修改;
s1、在原生库和js代码中分别添加对应jssdk版本号的声明;
修改原生库后更新对应jssdk版本号的高位数,jssdk版本号高位数不一致表示不兼容,发布新的原生库版本;
发布新的js代码版本,同时修改jssdkdependencies字段中的jssdk版本号的高位数;
s2、获取原生库对应的jssdk版本号,获取js代码对应的jssdk版本号;
构建服务,安装新的js代码版本,收集所述新的js代码中的jssdk版本号,完成服务的构建,得到构建结果及新的js代码对应的jssdk版本号,并将构建结果及新的js代码对应的jssdk版本号保存到服务端;
移动应用提供自身依赖的js代码对应的jssdk版本号等信息向服务端请求更新包;
服务端获取移动应用提供的jssdk版本号;
s3、根据所述原生库对应的jssdk版本号和所述js代码对应的jssdk版本号判断应用程序依赖的js代码和原生库是否兼容。
具体地,服务端通过比对得出移动应用提供的jssdk版本号与最新构建结果依赖的jssdk不兼容,返回无新的构建结果,或返回旧的构建结果及地址;
移动应用不进行更新,从而避免了更新到新的js代码而原生库不支持导致的功能异常问题。
实施例五
请参照图2,一种应用程序依赖的js代码与原生库兼容的终端1,包括存储器2、处理器3及存储在存储器2上并可在所述处理器3上运行的计算机程序,所述处理器3执行所述计算机程序时实现实施例一中的各个步骤。
综上所述,本发明提供的一种应用程序依赖的js代码与原生库兼容的方法及终端,通过在原生库和js代码中分别添加对应jssdk版本号的声明,在具体实现时分别通过脚本获取原生库对应的jssdk版本号和js代码对应的jssdk版本号,分别校验原生库对应的jssdk版本号和js代码对应的jssdk版本号,若校验不通过,则报错,校验通过后才根据所述原生库对应的jssdk版本号和所述js代码对应的jssdk版本号判断应用程序依赖的js代码和原生库是否兼容,提高了兼容检验的可靠性,可以保证应用程序依赖的js代码与原生库的兼容性,避免不兼容带来的问题,防止出现js代码构建的应用程序由于不兼容问题不可使用的情况,并且可以适用于各种js代码与原生库的兼容检测,适用性广。
以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等同变换,或直接或间接运用在相关的技术领域,均同理包括在本发明的专利保护范围内。