CN116243923A - 一种小程序处理方法、装置及电子设备 - Google Patents

一种小程序处理方法、装置及电子设备 Download PDF

Info

Publication number
CN116243923A
CN116243923A CN202310123330.9A CN202310123330A CN116243923A CN 116243923 A CN116243923 A CN 116243923A CN 202310123330 A CN202310123330 A CN 202310123330A CN 116243923 A CN116243923 A CN 116243923A
Authority
CN
China
Prior art keywords
code
applet
difference
target
source
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202310123330.9A
Other languages
English (en)
Inventor
刘宇
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Lazas Network Technology Shanghai Co Ltd
Original Assignee
Lazas Network Technology Shanghai Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Lazas Network Technology Shanghai Co Ltd filed Critical Lazas Network Technology Shanghai Co Ltd
Priority to CN202310123330.9A priority Critical patent/CN116243923A/zh
Publication of CN116243923A publication Critical patent/CN116243923A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本申请公开了一种小程序处理方法、装置及电子设备。所述方法包括:获取待生成目标产物的源代码;其中,所述目标产物用于实现目标小程序功能;将所述源代码对应的小程序形态作为源形态,将所述目标产物对应的小程序形态作为目标形态,确定所述源形态与所述目标形态之间的形态差异;基于所述形态差异对所述源代码进行适配性编译,生成所述目标产物。采用所述方法,解决了不同小程序形态的小程序迭代及维护难度大的问题。

Description

一种小程序处理方法、装置及电子设备
技术领域
本申请涉及计算机技术领域,具体涉及小程序处理方法、装置、电子设备及存储介质。
背景技术
小程序为免安装的即获得即使用的应用,由于其便捷性逐渐得到了广泛应用。目前,越来越多的企业开发投放于不同平台的小程序,以充分吸引流量。提供同一功能的小程序可能以不同小程序形态挂载于不同平台,这对同一功能的小程序的迭代及维护提出了更高要求。
现有技术中,针对不同平台按照对应各平台的小程序形态各自维护一套源代码,针对各平台对应的源代码生成对应形态的产物,该产物用于提供给对应平台生成小程序,存在如下缺陷:需要维护同一功能的多套代码,不仅功能同步迭代周期很长,而且bug较多,迭代维护难度大,使得研发过程困难且研发成本较高。
因此,如何基于同一套源代码生成用于不同形态小程序的产物是需要解决的问题。
在所述背景技术部分公开的上述信息仅用于加强对本申请的背景的理解,因此它可以包括不构成对本领域普通技术人员已知的现有技术的信息。
发明内容
本申请实施例提供的小程序处理方法,解决了不同小程序形态的小程序迭代及维护难度大的问题。
本申请实施例提供一种小程序处理方法,包括:获取待生成目标产物的源代码;其中,所述目标产物用于实现目标小程序功能;将所述源代码对应的小程序形态作为源形态,将所述目标产物对应的小程序形态作为目标形态,确定所述源形态与所述目标形态之间的形态差异;基于所述形态差异对所述源代码进行适配性编译,生成所述目标产物。
可选的,所述源形态包括以下小程序形态之一:独立小程序、小程序插件、小程序分包;所述目标形态为不同于所述源形态的小程序形态。
可选的,所述基于所述形态差异对所述源代码进行适配性编译,生成所述目标产物,包括:响应于所述形态差异包括第一差异,根据所述第一差异针对所述源代码注入用于适配所述目标形态的代码数据,基于所述注入生成所述目标产物;其中,所述第一差异包括所述源形态与所述目标形态之间与小程序全局的应用实例相关的差异。
可选的,所述源形态为独立小程序;所述目标形态为小程序插件或小程序分包;所述源代码形态转换前包括第一全局逻辑代码、第一页面代码和/或第一组件代码;所述根据所述第一差异针对所述源代码注入用于适配所述目标形态的代码数据,基于所述注入生成所述目标产物,包括:针对所述源代码注入用于模拟应用实例生命周期以及模拟应用实例调用的应用实例差异抹平代码;基于所述应用实例差异抹平代码修改所述第一全局逻辑代码得到形态转换后第二全局逻辑代码;基于所述应用实例差异抹平代码修改所述第一页面代码和/或第一组件代码得到形态转换后第二页面代码和/或第二组件代码;根据所述应用实例差异抹平代码、所述第二全局逻辑代码、所述第二页面代码和/或第二组件代码得到对应所述源代码的修改后代码;编译所述修改后代码得到所述目标产物。
可选的,所述基于所述应用实例差异抹平代码修改所述第一全局逻辑代码得到形态转换后第二全局逻辑代码,包括:在所述第一全局逻辑代码中增加代码以获取所述应用实例差异抹平代码的导出数据;将所述第一全局逻辑代码中的监听小程序初始化修改为调用所述应用实例差异抹平代码所包括的模拟监听小程序初始化方法;其中,所述模拟监听小程序初始化方法为模拟应用实例生命周期中初始化生命周期所执行的方法;基于上述修改得到所述第二全局逻辑代码。
可选的,所述基于所述应用实例差异抹平代码修改所述第一页面代码和/或第一组件代码得到形态转换后第二页面代码和/或第二组件代码,包括:在所述第一页面代码和/或第一组件代码中增加引用所述第二全局逻辑代码以及增加用于获取所述应用实例差异抹平代码的导出数据的代码;在所述第一页面代码和/或第一组件代码中注入所述应用实例差异抹平代码包括的模拟应用实例调用方法,得到形态转换后的第二页面代码和/或第二组件代码。
可选的,所述应用实例差异抹平代码,包括:用于导出模拟应用实例调用方法的代码;用于实现所述模拟应用实例调用方法的代码;其中,所述模拟应用实例调用方法基于闭包和原型链实现数据隔离及共享;用于导出模拟监听小程序初始化方法;用于实现所述模拟监听小程序初始化方法的代码。
可选的,所述基于所述形态差异对所述源代码进行适配性编译,生成所述目标产物,包括:所述源代码形态转换前包括第一页面代码和/或第一组件代码;响应于所述形态差异包括第二差异,将所述源代码中的全局样式文件注入到所述第一页面代码和/或第一组件代码中得到形态转换后第二页面代码和/或第二组件代码,根据所述第二页面代码和/或第二组件代码得到对应所述源代码的修改后代码,编译所述修改后代码得到所述目标产物;其中,所述第二差异包括:当所述源形态为独立小程序、所述目标形态为小程序插件或小程序分包,所述源形态与所述目标形态之间与小程序全局样式相关的差异。
可选的,所述将所述源代码中的全局样式文件注入到所述第一页面代码和/或第一组件代码中,包括:在第一页面代码和/或第一组件代码的代码文件起始处,增加import语句注入所述全局样式文件。
可选的,所述基于所述形态差异对所述源代码进行适配性编译,生成所述目标产物,包括:响应于所述形态差异包括第三差异,,基于预先设定的生成所述目标产物需遵从的规范,在生成所述目标产物的编译过程中将独立小程序、小程序插件、小程序分包各形态产物的JS依赖统一打包,将所述目标产物依赖的组件库提取到特定组件依赖文件夹;其中,所述第三差异,包括所述源形态与所述目标形态之间与NPM组件库相关的差异。
可选的,所述在生成所述目标产物的编译过程中将独立小程序、小程序插件、小程序分包各形态产物的JS依赖统一打包,将所述目标产物依赖的组件库提取到特定组件依赖文件夹,包括:基于入口配置进行依赖分析,根据依赖分析的结果进行组件编译以及JS编译,编译后进行组件分组,根据组件分组结果进行组件提取,根据目标形态对小程序分包或独立小程序分别合并打包,将引用的组件替换为所述目标形态下对应的组件,输出所述目标产物。
可选的,所述预先设定的生成所述目标产物需遵从的规范,包括目录结构规范、多端组件库规范以及JS依赖库规范至少之一。
可选的,所述基于所述形态差异对所述源代码进行适配性编译,生成所述目标产物,包括:响应于开发者触发执行指定编译类型的编译命令,从所述源代码中加载对应所述目标形态的入口配置文件;其中,所述编译类型基于所述目标形态指定,所述入口配置文件包括指定的编译类型。
可选的,所述源形态为独立小程序,所述目标形态为小程序分包;所述方法,还包括:响应于开发者输入的分包配置文件创建命令,在所述源代码对应的小程序项目的根目录下生成分包配置文件,所述分包配置文件为目标形态为小程序分包所对应的入口配置文件;将开发者输入的待编译为目标分包的特定页面标识,添加至所述分包配置文件所包括的页面配置信息,所述特定页面标识对应于所述源代码包括的特定页面代码,所述特定页面标识对应的特定页面的页面路径由目标分包的分包标识及其路径构成;获取所述目标分包的分包编译配置,将所述分包编译配置增加至应用所述小程序处理方法的开发框架或编译器的配置文件;所述基于所述注入生成所述目标产物,包括:根据所述入口配置文件以及所述开发框架或编译器的配置文件包括的分包编译配置,将所述特定页面代码编译为所述目标分包;其中,所述目标分包为所述目标产物,所述目标产物对应的文件夹存放至对应的宿主后可提供目标小程序功能。
可选的,还包括:基于所述目标产物实现的目标小程序运行时执行应用实例调用方法所获得的应用实例为对应的宿主和所述目标分包的混合产物;其中,所述宿主的属性和方法可以通过应用实例的宿主变量获取。
可选的,所述源形态为独立小程序,所述目标形态为小程序插件;所述方法,还包括:响应于开发者输入的插件配置文件创建命令,在所述源代码对应的小程序项目的根目录下生成插件配置文件,所述插件配置文件为目标形态为小程序插件所对应的入口配置文件;若所述源代码的全局配置文件中包括分包配置,则将所述全局配置文件中的分包配置的页面信息添加至所述插件配置文件的页面信息,添加的页面信息的页面路径由对应分包标识及该分包的路径构成;若确定所述源代码编译得到的目标插件包括开放页面,则将所述开放页面的信息添加至所述插件配置文件中的开放页面变量;获取所述目标插件的插件编译配置,将所述插件编译配置增加至应用所述小程序处理方法的开发框架或编译器的配置文件;所述插件编译配置至少包括:指定编译类型为插件;响应于所述编译命令,根据所述源形态与所述目标形态之间的第一差异对所述源代码执行注入得到对应的修改后代码,根据所述插件配置文件以及所述插件编译配置,将所述修改后代码编译为所述目标插件;其中,所述目标插件为所述目标产物。
可选的,还包括:在所述小程序项目的页面逻辑文件中通过调用应用实例调用方法的父类实现所述目标插件对外输出属性和方法。
可选的,所述源形态为小程序插件;所述目标形态为小程序分包;所述方法,还包括:响应于开发者输入的分包配置文件创建命令,在所述源代码对应的小程序项目的根目录下生成分包配置文件,所述分包配置文件为目标形态为小程序分包所对应的入口配置文件;将所述源代码包括的插件配置文件的信息转换为分包配置,添加至所述分包配置文件;获取分包编译配置,将所述分包编译配置添加至应用所述小程序处理方法的开发框架或编译器的配置文件;响应于所述编译命令,根据所述分包配置文件以及所述分包编译配置,将所述源代码编译为所述目标产物。
可选的,还包括:所述源形态为小程序插件或小程序分包;所述目标形态为独立小程序;所述基于所述形态差异对所述源代码进行适配性编译,生成所述目标产物,包括:获取开发者编写的小程序全局配置文件;接收开发者针对开发框架的特定配置文件修改,使得所述特定配置文件包含用于编译生成独立小程序的编译配置信息,其中,所述编译配置信息包含的编译类型为独立小程序;根据所述编写的小程序全局配置文件以及所述特定配置文件对所述源代码进行编译得到所述目标产物。
本申请还提供一种小程序处理装置,包括:源码获取单元,用于获取待生成目标产物的源代码;其中,所述目标产物用于实现目标小程序功能;形态差异单元,用于将所述源代码对应的小程序形态作为源形态,将所述目标产物对应的小程序形态作为目标形态,确定所述源形态与所述目标形态之间的形态差异;编译单元,用于基于所述形态差异对所述源代码进行适配性编译,生成所述目标产物。
本申请实施例还提供一种电子设备,包括:存储器,以及处理器;所述存储器用于存储计算机程序,所述计算机程序被所述处理器运行后,执行本申请实施例提供的所述方法。
本申请实施例还提供一种计算机存储介质,存储有计算机执行指令,所述计算机执行指令被处理器执行时用于实现本申请实施例提供的所述方法。
与现有技术相比,本申请具有以下优点:
本申请实施例提供的一种小程序处理方法、装置、电子设备及存储介质,通过获取待生成目标产物的源代码;其中,所述目标产物用于实现目标小程序功能;将所述源代码对应的小程序形态作为源形态,将所述目标产物对应的小程序形态作为目标形态,确定所述源形态与所述目标形态之间的形态差异;基于所述形态差异对所述源代码进行适配性编译,生成所述目标产物。通过基于形态差异对源代码进行适配性编译提供至少部分的不同形态之间的差异抹平能力,将所述源代码编译为不同形态(即不同小程序形态)的目标产物,各形态的目标产物可投放至对应渠道,从而支持不同形态转换,提供小程序形态一体化能力,降低迭代维护难度及成本。
附图说明
图1是本申请提供的一种小程序的处理过程的示意图;
图2是本申请第一实施例提供的一种小程序处理方法的处理流程图;
图3是本申请第一实施例提供的一种小程序编译流程的示意图;
图4是本申请第二实施例提供的一种小程序处理装置的示意图;
图5是本申请提供的电子设备示意图。
具体实施方式
在下面的描述中阐述了很多具体细节以便于充分理解本申请。但是本申请能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本申请内涵的情况下做类似推广,因此本申请不受下面公开的具体实施的限制。
本申请实施例提供一种小程序处理方法、装置、电子设备及存储介质。在下面的实施例中进行详细说明。
为便于理解,首先给出相关概念以及一种小程序处理方法的应用场景。该应用场景仅仅是应用小程序处理方法的一个实施例,提供此场景实施例的目的是便于理解本申请中提供的小程序处理方法,而并非用于限定所述小程序处理方法的应用。
小程序,是一种免安装的即获得即使用的应用。小程序开发者应用部署的小程序开发框架开发小程序,小程序的开发包括创建小程序项目、编写小程序代码、编译等环节。所谓编译,是指将开发者编写的小程序的源代码,构建打包成小程序运行时所支持的产物,可以是指基于不同语法的代码转换、打包等处理,当然也可以是指编译为可执行代码。
小程序形态,是指小程序项目及对应产物的形态。例如,该产物形态为独立小程序或小程序分包或小程序插件。
独立小程序,是具有appID(小程序标识)的小程序主体,拥有小程序完整的权限,可使用插件和分包,并可为不同的插件和分包提供共享的数据和方法。
小程序分包,是指同一个小程序按照需求拆分为不同的子包开发,各子包构建时打包成不同的分包,用户终端使用时可以按需加载。小程序分包可以申请小程序权限,使用体感接近于独立小程序。本申请中小程序分包包括常规意义上的分包和主包,所谓主包是小程序分包的一种,每个小程序只有一个主包,用于放置默认启动页面/标签栏(TabBar)页面,以及一些所有分包需要用到的公共资源和脚本。小程序分包根据其配置项可分为普通分包和独立分包,如通过配置文件app.json中的indepent字段配置是否为独立分包。独立分包是一种特殊类型的分包,可以独立于主包和其他分包运行。从独立分包中页面进入小程序不需要下载主包,而进入普通分包或主包内页面需要下载主包。
小程序插件,独立发布,可嵌套在独立小程序中使用的功能组件,可被订阅使用。
开发框架,是指小程序开发框架,开发者可以根据需求应用开发框架提供的抽象构件及实例交互方法开发小程序项目以实现对应业务功能。
编译器,是指小程序编译装置,用于将源代码转换为目标产物,目标产物可提供给对应平台以实现目标小程序功能。编译器也可集成于开发框架。
开发框架和/或编译器可部署于开发者使用的电子设备如计算机,也可部署于网络上的服务器。当部署于服务器,开发者通过网络使用服务器提供的编译服务,服务器通过网络获取开发者提供的源代码,执行编译,生成目标产物。
随着提供小程序运行环境的平台越来越多,同一功能的小程序可能以不同形态投放于不同平台。例如,小程序1在平台A以独立小程序投放,其对应功能可能需要作为分包接入平台B的独立小程序;再如,平台A的小程序插件1可能需要作为分包接入平台B的独立小程序;再如,平台A的小程序插件1可能需要作为平台C的小程序插件;再如,平台A的小程序插件1可能需要作为平台D或E的独立小程序。同一功能若维护同一套源代码,则投放于不同平台能够保持一致的使用体验,同时降低迭代及维护的难度,降低开发成本。从而产生了如下需求:将同一项目(即同一小程序项目)生成投放于不同平台的产物,同一项目为针对同一功能创建的小程序项目。请参考图1,图中示意性地示出了一种小程序的处理过程,以控制针对同一项目生成不同形态的产物,从而可投放于对应平台,包括:源代码101、编译器或包含编译器的开放框架102、形态为独立小程序的目标产物103、形态为小程序分别的目标产物104、形态为小程序插件的目标产物105。所述源代码,是指开发者针对同一项目开发的用于实现目标小程序功能的源代码文件包,包括一个或多个源代码文件。所述编译器或包含编译器的开放框架,根据开发者指定的编译类型以及对应的编译配置编译所述源代码生成对应的目标产物。当编译类型为独立小程序,则得到形态为独立小程序的目标产物;当编译类型为小程序分别,则得到形态为小程序分别的目标产物,即目标分包;当编译类型为小程序插件,则得到形态为小程序插件的目标产物,即目标插件。
需要说明的是,以上所公开的信息仅用于帮助对本申请进行理解,并不意味着构成对本领域普通技术人员已知的现有技术。
应该理解,本申请实施例提供的方法可以适用于处理任一使用程序设计语言编写的小程序代码,为了便于描述,下述实施例以JavaScript语言编写的小程序为例对本申请提供的方法进行示例性说明。
作为一种可能的实现方式,本申请实施例提供的方法可以应用于编译器,也可以应用于集成有编译器的开发框架;该方法的执行主体可以为配置为所述编译器或所述开发框架的装置,该装置可以为存储有或执行相关执行代码的介质,或者,也可以为集成或安装有所述编译器或所述开放框架的相关执行代码的实体装置,如电脑、计算机等。
以下结合图2和图3对本申请第一实施例提供的小程序处理方法进行说明。图2所示的小程序处理方法,包括:
步骤S201,获取待生成目标产物的源代码;其中,所述目标产物用于实现目标小程序功能;
步骤S202,将所述源代码对应的小程序形态作为源形态,将所述目标产物对应的小程序形态作为目标形态,确定所述源形态与所述目标形态之间的形态差异;
步骤S203,基于所述形态差异对所述源代码进行适配性编译,生成所述目标产物。
实际应用中,小程序形态为独立小程序、小程序分包、小程序插件中的一种形态。开发者往往根据预先确定的小程序形态生成一个小程序项目,编写源代码(也称源程序);其中,将所述预先确定的小程序形态作为源代码对应的小程序形态。如步骤S201中,所述源代码为开发者按照一定的高级程序设计语言编写的小程序的代码文件,一般为文本格式,尤其是实现目标小程序的业务逻辑功能的文件。所述目标产物为针对源代码编译得到的产物,该目标产物可提供给对应平台的宿主中从而实现目标小程序功能。其中,所述获取待生成目标产物的源代码,包括:获取开发者对应的代码仓库访问权限,确定待编译为目标产物以提供目标小程序功能的特定小程序项目,获取所述特定小程序项目的代码,作为所述源代码。
本实施例中,开发者可以通过命令行触发编译器或开发框架针对所述源代码的编译,本实施例以开发框架为例进行示例性说明。开发框架提供编译命令,开发者输入的编译命令可以指定编译类型,开发框架通过编译类型获取不同小程序形态对应的入口配置文件进行编译。具体的,所述所述基于所述形态差异对所述源代码进行适配性编译,生成所述目标产物,包括:响应于开发者触发执行指定编译类型的编译命令,从所述源代码中加载对应所述目标形态的入口配置文件;其中,所述编译类型基于所述目标形态指定,所述入口配置文件包括指定的编译类型。
举例一,编译命令的参数compileType,该参数取值可以为:miniprogram、plugin或subpackage;miniprogram表示以独立小程序的方式编译,入口配置文件为app.json;plugin表示以插件的方式编译,入口配置文件为plugin.json;subpackage表示以分包的方式编译,入口配置文件为subpackage.json。再如,小程序分包subpackage.json配置示例:
Figure BDA0004081106250000091
该配置示例中,type字段为用于标识该分包为"subpackage"或"main",当为subpackage分包时,编译得到的目标分包(即目标产物)被自动很到app.json文件的subpackages字段中;而"main"类型的分包被自动合并到app.json文件的pages字段中,即合并至主包。root字段用于确定将目标产物合并至宿主小程序时的根目录。Pages字段中的信息解析为编译分包的实际路径。独立小程序的app.json中的分包字段可以为subpackages或subPackages。本实施例的所述开发框架中提供独立小程序app.json配置规范与小程序插件plugin.json的配置规范并且,不同编译类型对应的入口配置文件可以从srcPath和srcPaths所指定的源代码目录中载入,也可以根据定制的路径配置获取。
如步骤S202所述,所述源代码对应的小程序形态为源形态,所述目标产物对应的小程序形态为目标形态。本实施例提供的小程序处理方法尤其适用于源形态与目标形态存在形态差异的场景。优选的,所述源形态包括以下小程序形态之一:独立小程序、小程序插件、小程序分包;所述目标形态为不同于所述源形态的小程序形态。所谓形态差异,是指独立小程序、小程序分包、小程序插件三种不同形态的小程序运行方式差异以及将一种小程序形态的源代码转换为其他小程序形态之后产生的差异。针对不同形态差异通过执行所述小程序处理方法的编译器或开发框架抹平,可以将源代码编译为与源形态不同的其他形态的目标产物,实现不同小程序形态之间的形态转换,源形态可以理解为形态转换前的小程序形态,目标形态可以理解为形态转换后的小程序形态。并且,由于能够在尽量少的业务代码修改的前提下将同一套源代码编译为不同形态的目标产物,从而提供小程序形态一体化的能力。所谓小程序形态一体化能力,是指以同构的方式支持同一个项目以不同的小程序形态(如独立小程序、小程序插件和小程序分包)投放于不同平台,也就是迭代维护同一套源代码,根据投放需要将其编译成不同形态的目标产物。
本实施例中,小程序不同形态之间的差异包括但不限于:与小程序全局的应用实例相关的差异、与小程序全局样式相关的差异、与NPM(JavaScript的包管理)组件库相关的差异。
所述与小程序全局的应用实例相关的差异,包括:与应用实例调用相关的差异,该差异包括不同形态针对调用小程序应用实例方面的差异,即不同形态下的getApp差异;以及,与应用实例生命周期相关的差异,该差异包括不同形态针对小程序的应用实例生命周期方面的差异,即不同形态下的App生命周期差异。小程序的应用实例生命周期,包括小程序初始化后(onLaunch)、唤起(onShow)、切到后台(onHide)等过程。其中,不同小程序形态的getApp差异为:独立小程序可调用getApp()获取全局App实例及实例上挂载的属性或方法;小程序插件无法调用getApp();小程序分包可调用getApp()获取全局App实例及实例上挂载的属性或方法,但是当源形态为独立小程序转换的目标产物为小程序分包后,分包原本调用的getApp()将失效,被替换为目标产物对应宿主小程序的getApp()。不同小程序形态的App生命周期差异为:独立小程序的App应用执行onLaunch、onShow、onHide等生命周期;相比之下,小程序插件及小程序分包均无应用生命周期。
所述与小程序全局样式相关的差异为:独立小程序可在公共样式文件(如:app.wxss或app.acss)声明全局样式;而小程序插件及小程序分包均无全局样式。可以在编译时通过自动将全局样式文件(app.acss或app.wxss等)注入到每个页面和组件的样式文件中作为引用从而实现不同形态下全局样式的兼容。
所述与NPM组件库相关的差异是指各小程序平台对于不同形态的NPM组件使用限制可能不同。可以根据开发框架的bundle模式、多端组件库规范和JS依赖库规范,在编译过程中自动将独立小程序、小程序插件、小程序分包的JS依赖统一打包并将使用到的组件库自动提取到npm_components文件夹来规避不同形态下的依赖问题以及不同小程序平台的NPM支持差异问题。
针对上述差异,本实施例提供的处理方法中提供相应的抹平方式,如注入差异抹平代码模拟应用实例生命周期以及模拟getApp;在各页面注入全局样式;针对依赖库统一打包规避使用限制等。当然,也可以在源代码中自行兼容差异,或者,基于开发框架提供的文件纬度条件编译或代码纬度条件编译实现不同平台不同形态兼容。当然可以将源代码中兼容差异以及开发框架自动抹平至少部分差异相结合,实现小程序多形态一体化能力。
优选的,所述确定所述源形态与所述目标形态之间的形态差异,包括:扫描源代码目录,确定源代码对应的源形态;获取开发者通过编译选项指定的编译类型,确定目标产物对应的目标形态,得出源形态与目标形态之间的差异。
如步骤S203所述,基于所述形态差异对所述源代码进行适配性编译,生成所述目标产物。本步骤中具体在基于上文中针对形态差异的分析在针对源代码进行编译的过程中进行对应的适配性处理,从而基于同一个项目的源代码构建得到不同形态的目标产物,以投放于对应小程序平台,实现以同构的方式支持同一个项目以不同的形态投放于不同渠道,提供小程序形态一体化的能力。
本步骤中,针对形态差异包括的第一差异通过编译过程中自动代码注入的方式实现适配性编译。具体的,所述基于所述形态差异对所述源代码进行适配性编译,生成所述目标产物,包括:响应于所述形态差异包括第一差异,根据所述第一差异针对所述源代码注入用于适配所述目标形态的代码数据,基于所述注入生成所述目标产物;其中,所述第一差异包括所述源形态与所述目标形态之间与小程序全局的应用实例相关的差异。即所述第一差异包括上文给出的与小程序全局的应用实例相关的差异,例如,具体包括getApp差异以及App生命周期差异。实施时,当源形态为插件或分包,而目标形态为独立小程序,则开发者可增加独立小程序相关的代码,通过修改独立小程序的配置文件中声明插件或增加分包相关的配置可以实现。当所述源形态为独立小程序、所述目标形态为小程序插件或小程序分包而产生的第一差异,其抹平思路为:通过在编译过程中注入代码的方式抹平不同形态下的getApp调用和App生命周期的差异。具体的,所述源代码形态转换前包括第一全局逻辑代码、第一页面代码和/或第一组件代码;相应的,所述根据所述第一差异针对所述源代码注入用于适配所述目标形态的代码数据,基于所述注入生成所述目标产物,包括:针对所述源代码注入用于模拟应用实例生命周期以及模拟应用实例调用的应用实例差异抹平代码;基于所述应用实例差异抹平代码修改所述第一全局逻辑代码得到形态转换后第二全局逻辑代码;基于所述应用实例差异抹平代码修改所述第一页面代码和/或第一组件代码得到形态转换后第二页面代码和/或第二组件代码;根据所述应用实例差异抹平代码、所述第二全局逻辑代码、所述第二页面代码和/或第二组件代码得到对应所述源代码的修改后代码;编译所述修改后代码得到所述目标产物。
其中,所述基于所述应用实例差异抹平代码修改所述第一全局逻辑代码得到形态转换后第二全局逻辑代码,包括:在所述第一全局逻辑代码中增加代码以获取所述应用实例差异抹平代码的导出数据;将所述第一全局逻辑代码中的监听小程序初始化修改为调用所述应用实例差异抹平代码所包括的模拟监听小程序初始化方法;其中,所述模拟监听小程序初始化方法为模拟应用实例生命周期中初始化生命周期所执行的方法;基于上述修改得到所述第二全局逻辑代码。所述基于所述应用实例差异抹平代码修改所述第一页面代码和/或第一组件代码得到形态转换后第二页面代码和/或第二组件代码,包括:在所述第一页面代码和/或第一组件代码中增加引用所述第二全局逻辑代码以及增加用于获取所述应用实例差异抹平代码的导出数据的代码;在所述第一页面代码和/或第一组件代码中注入所述应用实例差异抹平代码包括的模拟应用实例调用方法,得到形态转换后的第二页面代码和/或第二组件代码。其中,所述应用实例差异抹平代码的导出数据,是指针对应用实例差异抹平代码所导出的、可被其他模块使用的数据,如使用export导出应用实例差异抹平代码中变量的方法及该变量包含的内部变量的值,导出后可在其他引用(例如通过require或import方式引用)该应用实例差异抹平代码的文件和/或模块中使用。所述用于获取所述应用实例差异抹平代码的导出数据的代码,可以是通过require或import方式引用所述应用实例差异抹平代码的代码。优选的,所述应用实例差异抹平代码,包括:用于导出模拟应用实例调用方法的代码;用于实现所述模拟应用实例调用方法的代码;其中,所述模拟应用实例调用方法基于闭包和原型链实现数据隔离及共享;用于导出模拟监听小程序初始化方法;用于实现所述模拟监听小程序初始化方法的代码。上述处理可以理解为:通过在小程序插件和小程序分包形态下增加app.js入口文件的支持,并模拟App生命周期调用和为各页面和组件注入getApp方法来实现第一差异抹平。
举例二如下,独立小程序形态的源代码编译为小程序分包或小程序插件形态的目标产物,发生形态转换,通过表1以及表2分别示出了转换前后app.js对比、分包和插件的页面对比,通过表3示出了注入的subpackage.global.js文件中模拟App的onLaunch生命周期调用以及getApp调用。
表1独立小程序转换为小程序分包或插件转换前后的app.js文件对比
Figure BDA0004081106250000121
/>
Figure BDA0004081106250000131
表2独立小程序转换为小程序分包或插件转换前后的page.js文件对比
Figure BDA0004081106250000132
表3独立小程序转换为小程序分包或插件注入subpackage.global.js文件
Figure BDA0004081106250000133
应理解,该举例仅为示例性,表中代码为示例性代码差异,并非全部注入代码及差异,也并非限定所述小程序处理方法。表1及表2中通过require()函数获取其他文件导出方法和数据,传给require()的路径为相对路径;表3中通过module.exports导出方法和数据,module.exports.init导出subpackage.global.js中模拟实现的onLaunch生命周期方法,其他生命周期方法如onLoad、onShow、onError等可以根据需要实现。当然,也可以用其他编码语言/其他函数/其他编码规范实等现类似差异抹平功能。所谓闭包,是能够读取其他函数内部变量的函数,如函数fun1的内部函数fun2,被函数fun1外部的一个变量引用时,则创建了一个闭包。所谓原型链,是利用原型内置属性使得一引用类型继承另一引用类型的属性和方法。所谓原型,是指原型对象,其由内置属性__proto__(为指针)指向它的构造函数的prototype(原型)所指向的对象。
本实施例中,如步骤S203中还可以根据第二差异对所述源代码进行适配性编译。其中,所述基于所述形态差异对所述源代码进行适配性编译,生成所述目标产物,包括:响应于所述形态差异包括第二差异,将所述源代码中的全局样式文件注入到所述第一页面代码和/或第一组件代码中得到形态转换后第二页面代码和/或第二组件代码,根据所述第二页面代码和/或第二组件代码得到对应所述源代码的修改后代码,编译所述修改后代码得到所述目标产物;其中,所述第二差异包括:当所述源形态为独立小程序、所述目标形态为小程序插件或小程序分包,所述源形态与所述目标形态之间与小程序全局样式相关的差异。优选的,所述将所述源代码中的全局样式文件注入到所述第一页面代码和/或第一组件代码中,包括:在第一页面代码和/或第一组件代码的代码文件起始处,增加import语句注入所述全局样式文件。
举例三如下,表4独立小程序转换为小程序分包或插件转换注入全局样式的页面和组件的样式文件对比。
表4独立小程序转换为小程序分包或插件转换前后样式文件对比
Figure BDA0004081106250000141
应理解,本实施例提供的举例的各表仅为了更好理解本方案给出的示例性代码数据,并非限定文件名、变量名、函数名、方法调用等。
本实施例中,所述开发框架自动将全局样式注入各页面和组件样式文件顶部,从而实现不同形态下对全局样式的兼容。
本实施例中,在步骤S203中还可以根据第三差异对所述源代码进行适配性编译。其中,所述基于所述形态差异对所述源代码进行适配性编译,生成所述目标产物,包括:响应于所述形态差异包括第三差异,基于预先设定的生成所述目标产物需遵从的规范,在生成所述目标产物的编译过程中将独立小程序、小程序插件、小程序分包各形态产物的JS依赖统一打包,将所述目标产物依赖的组件库提取到特定组件依赖文件夹;其中,所述第三差异,包括所述源形态与所述目标形态之间与NPM组件库相关的差异。其中,所述预先设定的生成所述目标产物需遵从的规范,包括目录结构规范、多端组件库规范以及JS依赖库规范至少之一。所述目录结构规范,规定了目标产物的目录结构,包括但不限于目录划分、目录命名原则等信息。所述多端组件库规范,规定了针对不同小程序平台编译目标产物,需要包含的组件库适配不同平台的组件规范。所述JS依赖库规范,规定了JS模块化依赖处理模式兼容不同平台。其中,所述在生成所述目标产物的编译过程中将独立小程序、小程序插件、小程序分包各形态产物的JS依赖统一打包,将所述目标产物依赖的组件库提取到特定组件依赖文件夹,包括:基于入口配置进行依赖分析,根据依赖分析的结果进行组件编译以及JS(即JavaScript)编译,编译后进行组件分组,根据组件分组结果进行组件提取,根据目标形态对小程序分包或独立小程序分别合并打包,将引用的组件替换为所述目标形态下对应的组件,输出所述目标产物。从而规避不同形态下的依赖问题以及不同小程序平台对于NPM支持存在差异的问题。请参考图3,图中示出了一种小程序编译流程的示意图,包括:入口配置、依赖分析、组件编译以及JS编译、动态分组、组件提取、合并打包、引用替换以及产物输出;其中,按照图示箭头指向逐步进行。入口配置可以通过配置入口配置文件实现,如生成或编辑入口配置文件;依赖分析包括确定JavaScript文件的引用关系,仅需要将用到的文件打包入目标产物,可以进行单个文件依赖分析、嵌套依赖分析、循环依赖分析等;根据依赖分析的结果进行组件编译以及JS(即JavaScript)编译,编译后进行组件分组,根据组件分组结果进行提取用到的组件,合并打包后将引用的组件替换为所述目标形态下对应的组件,输出所述目标产物。
优选的,所述形态差异可以包括上述第一差异、第二差异以及第三差异中的一种或几种差异,所述基于所述形态差异对所述源代码进行适配性编译,包括:针对所述形态差异中包括的每种差异,分别进行相应的适配性编译。
本实施例中,还包括针对形态转换进行相关配置。一个实施方式中,所述源形态为独立小程序,所述目标形态为小程序分包;即独立小程序转换为小程序分包,所述小程序处理方法还包括如下处理:响应于开发者输入的分包配置文件创建命令,在所述源代码对应的小程序项目的根目录下生成分包配置文件,所述分包配置文件为目标形态为小程序分包所对应的入口配置文件;将开发者输入的待编译为目标分包的特定页面标识,添加至所述分包配置文件所包括的页面配置信息,所述特定页面标识对应于所述源代码包括的特定页面代码,所述特定页面标识对应的特定页面的页面路径由目标分包的分包标识及其路径构成;获取所述目标分包的分包编译配置,将所述分包编译配置增加至应用所述小程序处理方法的开发框架或编译器的配置文件;相应的,所述基于所述注入生成所述目标产物,包括:根据所述入口配置文件以及所述开发框架或编译器的配置文件包括的分包编译配置,将所述特定页面代码编译为所述目标分包;其中,所述目标分包为所述目标产物,所述目标产物对应的文件夹存放至对应的宿主后可提供目标小程序功能。其中,基于所述目标产物实现的目标小程序运行时执行应用实例调用方法所获得的应用实例为对应的宿主和所述目标分包的混合产物;其中,所述宿主的属性和方法可以通过应用实例的宿主变量获取。
举例四如下,为独立小程序转换为小程序分包的配置相关,需要开发框架提供配置能力,可以是命令行也可以是交互界面。在上文其他举例已通过compileType(编译类型参数)指定为分包,则入口配置文件名称默认为subpackage.json。本举例中,在小程序项目根目录创建subpackage.json文件,在该文件中添加需要编译转换为分包的页面如下,
Figure BDA0004081106250000161
进一步,在开发框架的特定配置文件中如config.js文件中增加分包编译配置的信息如下,
Figure BDA0004081106250000162
完成以上配置后可执行对应的分包编译,编译完成后得到目标分包,将对应目标分包的文件夹放到对应的宿主中用于提供目标小程序功能。小程序分包形态下通过getApp调用获得的App为宿主和分包的混合产物,宿主的属性和方法可以通过app.$host属性获取。若分包至少部分业务依赖全局样式,则将app.acss注入到各个页面和组件的样式中作为引用。若分包的业务需要使用宿主提供的npm package,可以将对应的包名添加到上述配置示例的externals中,在项目中可正常引用。当然,也可以抽象出单独的js文件,通过文件或源代码纬度的条件编译支持不同平台。开发框架编译时还可以在每个页面和组件的JS文件顶部引入初始化的文件,以确保分包的初始化。
一个实施方式中,所述源形态为独立小程序,所述目标形态为小程序插件;即独立小程序转换为小程序插件,所述小程序处理方法,还包括:响应于开发者输入的插件配置文件创建命令,在所述源代码对应的小程序项目的根目录下生成插件配置文件,所述插件配置文件为目标形态为小程序插件所对应的入口配置文件;若所述源代码的全局配置文件中包括分包配置,则将所述全局配置文件中的分包配置的页面信息添加至所述插件配置文件的页面信息,添加的页面信息的页面路径由对应分包标识及该分包的路径构成;若确定所述源代码编译得到的目标插件包括开放页面,则将所述开放页面的信息添加至所述插件配置文件中的开放页面变量;获取所述目标插件的插件编译配置,将所述插件编译配置增加至应用所述小程序处理方法的开发框架或编译器的配置文件;所述插件编译配置至少包括:指定编译类型为插件;响应于所述编译命令,根据所述源形态与所述目标形态之间的第一差异对所述源代码执行注入得到对应的修改后代码,根据所述插件配置文件以及所述插件编译配置,将所述修改后代码编译为所述目标插件;其中,所述目标插件为所述目标产物。进一步,在所述小程序项目的页面逻辑文件中通过调用应用实例调用方法的父类实现所述目标插件对外输出属性和方法。
举例五如下,为独立小程序转换为小程序插件的配置相关,需要开发框架提供配置能力,可以是命令行也可以是交互界面。在上文其他举例已通过compileType(编译类型参数)指定为插件,则入口配置文件名称默认为plugin.json。本举例中,在小程序项目根目录创建plugin.json文件,在该文件中添加需要编译转换为插件的页面如下,
Figure BDA0004081106250000171
其中,将分包中的页面也添加至plugin.json的pages中,页面路径为分包名称与路径组成,该插件需要对外开放的页面添加到对应的publicPages;还包括在开发框架的配置文件中增加插件编译配置如下,
Figure BDA0004081106250000181
完成以上配置后可执行对应的插件编译,编译完成后可在对应的小程序开发者工具中进行调试。该插件可以在index.js文件中输出能力,宿主使用插件运行时通过getApp().$plugin.instances.[插件名称]访问插件输出的能力。index.js配置如下,
Figure BDA0004081106250000182
该举例中还可以配置app.js或其他逻辑文件调用插件。宿主接入插件SDK之后可以将宿主方法注入到插件。一个实施方式中,所述源形态为小程序插件;所述目标形态为小程序分包;即小程序插件转换为小程序分包,所述小程序处理方法,还包括:响应于开发者输入的分包配置文件创建命令,在所述源代码对应的小程序项目的根目录下生成分包配置文件,所述分包配置文件为目标形态为小程序分包所对应的入口配置文件;将所述源代码包括的插件配置文件的信息转换为分包配置,添加至所述分包配置文件;获取分包编译配置,将所述分包编译配置添加至应用所述小程序处理方法的开发框架或编译器的配置文件;响应于所述编译命令,根据所述分包配置文件以及所述分包编译配置,将所述源代码编译为所述目标产物。
举例六如下,为小程序插件转换为小程序分包,需要开发框架提供配置能力,可以是命令行也可以是交互界面。在项目根目录创建subpackage.json文件,将插件的plugin.json转换为分包的配置,并在开发框架配置文件中增加分包编译配置。其配置内容与格式与举例四中的配置类似。配置完成后可执行对应的分包编译,编译完成后,将对应目标产物的文件夹放到对应的宿主中。小程序分包转换为小程序插件的配置思路与小程序插件转换为小程序分包类似。
本实施例中涉及的配置方式可以为命令行,也可以为界面交互式配置,不做限定。在进行配置前,需要确定所述开发框架的版本信息及工具依赖。
本实施例提供的方法可应用于独立小程序、小程序插件以及小程序分包之间的相互编译转换,包括:独立小程序转换为小程序分包或小程序插件;小程序插件转换为独立小程序或小程序分包;小程序分包转换为独立小程序或小程序插件。上文的配置举例四至六中给出了独立小程序转换为小程序分包或插件以及,小程序插件与小程序分包相互转换等四种转换情形的配置思路。进一步,本实施例还包括针对小程序插件或小程序分包转换为独立小程序的的处理,具体的,所述方法还包括:所述源形态为小程序插件或小程序分包;所述目标形态为独立小程序;所述基于所述形态差异对所述源代码进行适配性编译,生成所述目标产物,包括:获取开发者编写的小程序全局配置文件;接收开发者针对开发框架的特定配置文件修改,使得所述特定配置文件包含用于编译生成独立小程序的编译配置信息,其中,所述编译配置信息包含的编译类型为独立小程序;根据所述编写的小程序全局配置文件以及所述特定配置文件对所述源代码进行编译得到所述目标产物。例如,在将小程序插件或小程序分包转换为独立小程序的场景中,开发框架获取开发者编写的app.json配置文件(即小程序全局配置文件),接收开发者修改或新增相关配置信息(对config.js文件进行修改,新增或修改得到编译独立小程序的编译配置信息)并将编译配置信息中的compileType指定为miniprogram,从而将源代码编译为对应的目标产物。由于开发框架提供至少部分的不同形态之间的差异抹平能力,能够将同一项目的源代码编译为不同形态(即不同小程序形态)的目标产物,或者,结合少量的源代码适配将同一项目的源代码编译为不同形态的目标产物,各形态的目标产物可投放于对应渠道,从而以同构的方式支持不同形态转换,提供小程序形态一体化能力,降低迭代维护难度及成本。
需要说明的是,在不冲突的情况下,在本实施例和本申请的其他实施例中给出的特征可以相互组合,并且以上所述的各种形式的流程,可以重新排序、增加或删除步骤,例如步骤S201和S202或类似用语不限定步骤必须先后执行。只要能够实现本申请公开的技术方案所期望的结果,本文在此不进行限制。
至此,对本实施例提供的方法进行了说明,所述方法提供至少部分的不同形态之间的差异抹平能力,将同一项目的源代码编译为不同形态(即不同小程序形态)的目标产物,各形态的目标产物可投放于对应渠道,从而以同构的方式支持不同形态转换,提供小程序形态一体化能力,降低迭代维护难度及成本。
与第一实施例对应,本申请第二实施例提供一种小程序处理装置,相关的部分请参见对应方法实施例的说明即可。请参考图四,图中所示的小程序处理装置,包括:
源码获取单元401,用于获取待生成目标产物的源代码;其中,所述目标产物用于实现目标小程序功能;
形态差异单元402,用于将所述源代码对应的小程序形态作为源形态,将所述目标产物对应的小程序形态作为目标形态,确定所述源形态与所述目标形态之间的形态差异;
编译单元403,用于基于所述形态差异对所述源代码进行适配性编译,生成所述目标产物。
可选的,所述源形态包括以下小程序形态之一:独立小程序、小程序插件、小程序分包;所述目标形态为不同于所述源形态的小程序形态。
可选的,所述编译单元403,具体用于:响应于所述形态差异包括第一差异,根据所述第一差异针对所述源代码注入用于适配所述目标形态的代码数据,基于所述注入生成所述目标产物;其中,所述第一差异包括所述源形态与所述目标形态之间与小程序全局的应用实例相关的差异。
可选的,所述源形态为独立小程序;所述目标形态为小程序插件或小程序分包;所述源代码形态转换前包括第一全局逻辑代码、第一页面代码和/或第一组件代码;所述编译单元403,具体用于:针对所述源代码注入用于模拟应用实例生命周期以及模拟应用实例调用的应用实例差异抹平代码;基于所述应用实例差异抹平代码修改所述第一全局逻辑代码得到形态转换后第二全局逻辑代码;基于所述应用实例差异抹平代码修改所述第一页面代码和/或第一组件代码得到形态转换后第二页面代码和/或第二组件代码;根据所述应用实例差异抹平代码、所述第二全局逻辑代码、所述第二页面代码和/或第二组件代码得到对应所述源代码的修改后代码;编译所述修改后代码得到所述目标产物。
可选的,所述编译单元403具体用于:在所述第一全局逻辑代码中增加代码以获取所述应用实例差异抹平代码的导出数据;将所述第一全局逻辑代码中的监听小程序初始化修改为调用所述应用实例差异抹平代码所包括的模拟监听小程序初始化方法;其中,所述模拟监听小程序初始化方法为模拟应用实例生命周期中初始化生命周期所执行的方法;基于上述修改得到所述第二全局逻辑代码。
可选的,所述编译单元403具体用于:在所述第一页面代码和/或第一组件代码中增加引用所述第二全局逻辑代码以及增加用于获取所述应用实例差异抹平代码的导出数据的代码;在所述第一页面代码和/或第一组件代码中注入所述应用实例差异抹平代码包括的模拟应用实例调用方法,得到形态转换后的第二页面代码和/或第二组件代码。
可选的,所述应用实例差异抹平代码,包括:用于导出模拟应用实例调用方法的代码;用于实现所述模拟应用实例调用方法的代码;其中,所述模拟应用实例调用方法基于闭包和原型链实现数据隔离及共享;用于导出模拟监听小程序初始化方法;用于实现所述模拟监听小程序初始化方法的代码。
可选的,所述编译单元403具体用于:所述源代码形态转换前包括第一页面代码和/或第一组件代码;响应于所述形态差异包括第二差异,将所述源代码中的全局样式文件注入到所述第一页面代码和/或第一组件代码中得到形态转换后第二页面代码和/或第二组件代码,根据所述第二页面代码和/或第二组件代码得到对应所述源代码的修改后代码,编译所述修改后代码得到所述目标产物;其中,所述第二差异包括:当所述源形态为独立小程序、所述目标形态为小程序插件或小程序分包,所述源形态与所述目标形态之间与小程序全局样式相关的差异。
可选的,所述编译单元403具体用于:在第一页面代码和/或第一组件代码的代码文件起始处,增加import语句注入所述全局样式文件。
可选的,所述编译单元403具体用于:判断所述形态差异是否包括第三差异,若是,基于预先设定的生成所述目标产物需遵从的规范,在生成所述目标产物的编译过程中将独立小程序、小程序插件、小程序分包各形态产物的JS依赖统一打包,将所述目标产物依赖的组件库提取到特定组件依赖文件夹;其中,所述第三差异,包括所述源形态与所述目标形态之间与NPM组件库相关的差异。
可选的,所述编译单元403具体用于:基于入口配置进行依赖分析,根据依赖分析的结果进行组件编译以及JS编译,编译后进行组件分组,根据组件分组结果进行组件提取,根据目标形态对小程序分包或独立小程序分别合并打包,将引用的组件替换为所述目标形态下对应的组件,输出所述目标产物。
可选的,所述预先设定的生成所述目标产物需遵从的规范,包括目录结构规范、多端组件库规范以及JS依赖库规范至少之一。
可选的,所述编译单元403具体用于:响应于开发者触发执行指定编译类型的编译命令,从所述源代码中加载对应所述目标形态的入口配置文件;其中,所述编译类型基于所述目标形态指定,所述入口配置文件包括指定的编译类型。
可选的,所述源形态为独立小程序,所述目标形态为小程序分包;所述编译单元403,具体用于:响应于开发者输入的分包配置文件创建命令,在所述源代码对应的小程序项目的根目录下生成分包配置文件,所述分包配置文件为目标形态为小程序分包所对应的入口配置文件;将开发者输入的待编译为目标分包的特定页面标识,添加至所述分包配置文件所包括的页面配置信息,所述特定页面标识对应于所述源代码包括的特定页面代码,所述特定页面标识对应的特定页面的页面路径由目标分包的分包标识及其路径构成;获取所述目标分包的分包编译配置,将所述分包编译配置增加至应用所述小程序处理方法的开发框架或编译器的配置文件;根据所述入口配置文件以及所述开发框架或编译器的配置文件包括的分包编译配置,将所述特定页面代码编译为所述目标分包;其中,所述目标分包为所述目标产物,所述目标产物对应的文件夹存放至对应的宿主后可提供目标小程序功能。
可选的,所述装置还包括运行单元,所述运行单元,用于:基于所述目标产物实现的目标小程序运行时执行应用实例调用方法所获得的应用实例为对应的宿主和所述目标分包的混合产物;其中,所述宿主的属性和方法可以通过应用实例的宿主变量获取。
可选的,所述源形态为独立小程序,所述目标形态为小程序插件;所述编译单元还用于:响应于开发者输入的插件配置文件创建命令,在所述源代码对应的小程序项目的根目录下生成插件配置文件,所述插件配置文件为目标形态为小程序插件所对应的入口配置文件;若所述源代码的全局配置文件中包括分包配置,则将所述全局配置文件中的分包配置的页面信息添加至所述插件配置文件的页面信息,添加的页面信息的页面路径由对应分包标识及该分包的路径构成;若确定所述源代码编译得到的目标插件包括开放页面,则将所述开放页面的信息添加至所述插件配置文件中的开放页面变量;获取所述目标插件的插件编译配置,将所述插件编译配置增加至应用所述小程序处理方法的开发框架或编译器的配置文件;所述插件编译配置至少包括:指定编译类型为插件;响应于所述编译命令,根据所述源形态与所述目标形态之间的第一差异对所述源代码执行注入得到对应的修改后代码,根据所述插件配置文件以及所述插件编译配置,将所述修改后代码编译为所述目标插件;其中,所述目标插件为所述目标产物。
可选的,所述运行单元,还用于:在所述小程序项目的页面逻辑文件中通过调用应用实例调用方法的父类实现所述目标插件对外输出属性和方法。
可选的,所述源形态为小程序插件;所述目标形态为小程序分包;所述编译单元403,还用于:响应于开发者输入的分包配置文件创建命令,在所述源代码对应的小程序项目的根目录下生成分包配置文件,所述分包配置文件为目标形态为小程序分包所对应的入口配置文件;将所述源代码包括的插件配置文件的信息转换为分包配置,添加至所述分包配置文件;获取分包编译配置,将所述分包编译配置添加至应用所述小程序处理方法的开发框架或编译器的配置文件;响应于所述编译命令,根据所述分包配置文件以及所述分包编译配置,将所述源代码编译为所述目标产物。
可选的,所述源形态为小程序插件或小程序分包;所述目标形态为独立小程序;所述编译单元403,还用于:获取开发者编写的小程序全局配置文件;接收开发者针对开发框架的特定配置文件修改,使得所述特定配置文件包含用于编译生成独立小程序的编译配置信息,其中,所述编译配置信息包含的编译类型为独立小程序;根据所述编写的小程序全局配置文件以及所述特定配置文件对所述源代码进行编译得到所述目标产物。
以上述实施例为基础,本申请第三实施例提供一种电子设备,相关的部分请参见上述实施例的对应说明即可。请参考图5,图中所示的电子设备包括:存储器501,以及处理器502;所述存储器用于存储计算机程序,所述计算机程序被处理器运行后,执行本申请实施例提供的所述方法。
以上述实施例为基础,本申请第四实施例提供一种计算机存储介质,相关的部分请参见上述实施例的对应说明即可。所述计算机存储介质的示意图类似图5,图中的存储器可以理解为所述存储介质。所述计算机存储介质存储有计算机执行指令,所述计算机执行指令被处理器执行时用于实现本申请实施例提供的所述方法。
在一个典型的配置中,电子设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
本领域技术人员应明白,本申请的实施例可提供为方法、***或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请虽然以较佳实施例公开如上,但其并不是用来限定本申请,任何本领域技术人员在不脱离本申请的精神和范围内,都可以做出可能的变动和修改,因此本申请的保护范围应当以本申请权利要求所界定的范围为准。

Claims (10)

1.一种小程序处理方法,其特征在于,包括:
获取待生成目标产物的源代码;其中,所述目标产物用于实现目标小程序功能;
将所述源代码对应的小程序形态作为源形态,将所述目标产物对应的小程序形态作为目标形态,确定所述源形态与所述目标形态之间的形态差异;
基于所述形态差异对所述源代码进行适配性编译,生成所述目标产物。
2.根据权利要求1所述的方法,其特征在于,所述源形态包括以下小程序形态之一:独立小程序、小程序插件、小程序分包;所述目标形态为不同于所述源形态的小程序形态。
3.根据权利要求1所述的方法,其特征在于,所述基于所述形态差异对所述源代码进行适配性编译,生成所述目标产物,包括:
响应于所述形态差异包括第一差异,根据所述第一差异针对所述源代码注入用于适配所述目标形态的代码数据,基于所述注入生成所述目标产物;其中,所述第一差异包括所述源形态与所述目标形态之间与小程序全局的应用实例相关的差异。
4.根据权利要求3所述的方法,其特征在于,所述源形态为独立小程序;所述目标形态为小程序插件或小程序分包;
所述源代码形态转换前包括第一全局逻辑代码、第一页面代码和/或第一组件代码;
所述根据所述第一差异针对所述源代码注入用于适配所述目标形态的代码数据,基于所述注入生成所述目标产物,包括:
针对所述源代码注入用于模拟应用实例生命周期以及模拟应用实例调用的应用实例差异抹平代码;
基于所述应用实例差异抹平代码修改所述第一全局逻辑代码得到形态转换后第二全局逻辑代码;
基于所述应用实例差异抹平代码修改所述第一页面代码和/或第一组件代码得到形态转换后第二页面代码和/或第二组件代码;
根据所述应用实例差异抹平代码、所述第二全局逻辑代码、所述第二页面代码和/或第二组件代码得到对应所述源代码的修改后代码;
编译所述修改后代码得到所述目标产物。
5.根据权利要求4所述的方法,其特征在于,所述基于所述应用实例差异抹平代码修改所述第一全局逻辑代码得到形态转换后第二全局逻辑代码,包括:
在所述第一全局逻辑代码中增加代码以获取所述应用实例差异抹平代码的导出数据;
将所述第一全局逻辑代码中的监听小程序初始化修改为调用所述应用实例差异抹平代码所包括的模拟监听小程序初始化方法;其中,所述模拟监听小程序初始化方法为模拟应用实例生命周期中初始化生命周期所执行的方法;
基于上述修改得到所述第二全局逻辑代码。
6.根据权利要求5所述的方法,其特征在于,所述基于所述应用实例差异抹平代码修改所述第一页面代码和/或第一组件代码得到形态转换后第二页面代码和/或第二组件代码,包括:
在所述第一页面代码和/或第一组件代码中增加引用所述第二全局逻辑代码以及增加用于获取所述应用实例差异抹平代码的导出数据的代码;
在所述第一页面代码和/或第一组件代码中注入所述应用实例差异抹平代码包括的模拟应用实例调用方法,得到形态转换后的第二页面代码和/或第二组件代码。
7.根据权利要求6所述的方法,其特征在于,所述应用实例差异抹平代码,包括:
用于导出模拟应用实例调用方法的代码;
用于实现所述模拟应用实例调用方法的代码;其中,所述模拟应用实例调用方法基于闭包和原型链实现数据隔离及共享;
用于导出模拟监听小程序初始化方法;
用于实现所述模拟监听小程序初始化方法的代码。
8.根据权利要求1所述的方法,其特征在于,所述基于所述形态差异对所述源代码进行适配性编译,生成所述目标产物,包括:
所述源代码形态转换前包括第一页面代码和/或第一组件代码;
响应于所述形态差异包括第二差异,将所述源代码中的全局样式文件注入到所述第一页面代码和/或第一组件代码中得到形态转换后第二页面代码和/或第二组件代码,根据所述第二页面代码和/或第二组件代码得到对应所述源代码的修改后代码,编译所述修改后代码得到所述目标产物;
其中,所述第二差异包括:当所述源形态为独立小程序、所述目标形态为小程序插件或小程序分包,所述源形态与所述目标形态之间与小程序全局样式相关的差异。
9.根据权利要求8所述的方法,其特征在于,所述将所述源代码中的全局样式文件注入到所述第一页面代码和/或第一组件代码中,包括:
在第一页面代码和/或第一组件代码的代码文件起始处,增加import语句注入所述全局样式文件。
10.根据权利要求1所述的方法,其特征在于,所述基于所述形态差异对所述源代码进行适配性编译,生成所述目标产物,包括:
响应于所述形态差异包括第三差异,基于预先设定的生成所述目标产物需遵从的规范,在生成所述目标产物的编译过程中将独立小程序、小程序插件、小程序分包各形态产物的JS依赖统一打包,将所述目标产物依赖的组件库提取到特定组件依赖文件夹;
其中,所述第三差异,包括所述源形态与所述目标形态之间与NPM组件库相关的差异。
CN202310123330.9A 2023-02-15 2023-02-15 一种小程序处理方法、装置及电子设备 Pending CN116243923A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310123330.9A CN116243923A (zh) 2023-02-15 2023-02-15 一种小程序处理方法、装置及电子设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310123330.9A CN116243923A (zh) 2023-02-15 2023-02-15 一种小程序处理方法、装置及电子设备

Publications (1)

Publication Number Publication Date
CN116243923A true CN116243923A (zh) 2023-06-09

Family

ID=86630782

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310123330.9A Pending CN116243923A (zh) 2023-02-15 2023-02-15 一种小程序处理方法、装置及电子设备

Country Status (1)

Country Link
CN (1) CN116243923A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116954571A (zh) * 2023-09-21 2023-10-27 深圳凡泰极客科技有限责任公司 小程序插件的开发处理方法及装置、计算机可读存储介质

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116954571A (zh) * 2023-09-21 2023-10-27 深圳凡泰极客科技有限责任公司 小程序插件的开发处理方法及装置、计算机可读存储介质
CN116954571B (zh) * 2023-09-21 2023-12-22 深圳凡泰极客科技有限责任公司 小程序插件的开发处理方法及装置、计算机可读存储介质

Similar Documents

Publication Publication Date Title
Gamblin et al. The Spack package manager: bringing order to HPC software chaos
US10146515B1 (en) Live code updates
US8707263B2 (en) Using a DSL for calling APIS to test software
US9965259B2 (en) System for translating diverse programming languages
US10452369B2 (en) Code profiling of executable library for pipeline parallelization
CN112835584B (zh) 基于ReactNative实现组件扩展和管理的方法
CN111078229A (zh) 一种应用程序处理方法、装置、存储介质及电子设备
CN113407362A (zh) 基于车载Android***SOA架构SOMEIP通信中间层实现方法及***
CN112667242A (zh) 一种将c代码封装成fmu的方法及装置
CN111290740B (zh) 应用程序的开发方法、装置、计算机设备和存储介质
CN116243923A (zh) 一种小程序处理方法、装置及电子设备
CN114588638A (zh) 基于Lua语言进行游戏开发的方法及程序开发装置
Chakravarthy et al. Edicts: implementing features with flexible binding times
CN110659022B (zh) 一种基于Java自动调用Python脚本的方法
CN110110299B (zh) 文本变换方法、装置以及服务器
Hähnle et al. HATS abstract behavioral specification: The architectural view
CN115390846A (zh) 编译构建方法、装置、电子设备和存储介质
CN112306539B (zh) 一种单片机应用层开发方法、***、终端及介质
CN109542447A (zh) 一种otx程序文件执行方法及装置
Golemon Extending and Embedding PHP
CN111708543A (zh) 一种减少Android项目代码重复度的方法
US7861233B2 (en) Transparent context switching for software code
CN113535566B (zh) 一种安卓应用校验方法、装置、设备及存储介质
Morelli Automated generation of robotics applications from simulink and sysml models
US8141037B2 (en) Transparent context switching for software code

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination