CN114003234A - 小程序局部编译方法、装置、设备及计算机可读存储介质 - Google Patents
小程序局部编译方法、装置、设备及计算机可读存储介质 Download PDFInfo
- Publication number
- CN114003234A CN114003234A CN202111280796.7A CN202111280796A CN114003234A CN 114003234 A CN114003234 A CN 114003234A CN 202111280796 A CN202111280796 A CN 202111280796A CN 114003234 A CN114003234 A CN 114003234A
- Authority
- CN
- China
- Prior art keywords
- file
- dependent
- determining
- syntax tree
- dependency
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 50
- 230000001419 dependent effect Effects 0.000 claims abstract description 246
- 238000004458 analytical method Methods 0.000 claims abstract description 107
- 230000006870 function Effects 0.000 claims description 31
- 238000006243 chemical reaction Methods 0.000 claims description 12
- 230000011218 segmentation Effects 0.000 claims description 6
- 238000011161 development Methods 0.000 abstract description 14
- 238000005516 engineering process Methods 0.000 abstract description 8
- 238000012545 processing Methods 0.000 abstract description 7
- 230000018109 developmental process Effects 0.000 description 13
- 125000004122 cyclic group Chemical group 0.000 description 7
- 238000010586 diagram Methods 0.000 description 7
- 238000012360 testing method Methods 0.000 description 6
- 230000008569 process Effects 0.000 description 5
- 238000004891 communication Methods 0.000 description 3
- 230000007547 defect Effects 0.000 description 2
- 230000014509 gene expression Effects 0.000 description 2
- 238000013473 artificial intelligence Methods 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 230000008676 import Effects 0.000 description 1
- 230000000717 retained effect Effects 0.000 description 1
- 230000009466 transformation Effects 0.000 description 1
- 230000001131 transforming effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明涉及金融科技领域,并公开了一种小程序局部编译方法、装置、设备及计算机可读存储介质,该方法包括以下步骤:确定项目文件中的指定入口文件,根据所述指定入口文件确定对应的第一语法树;对所述第一语法树进行依赖分析,确定所述指定入口文件的依赖文件;对所述指定入口文件和所述依赖文件进行局部编译。实现了只对需要的文件做局部编译处理,对于不需要的文件不做编译处理,如此能够减小待编译的代码包体积,进而缩短编译耗时,提高开发人员的开发效率。
Description
技术领域
本发明涉及金融科技(Fintech)领域,尤其涉及一种小程序局部编译方法、装置、设备及计算机可读存储介质。
背景技术
随着计算机技术的发展,越来越多的技术(大数据、分布式、区块链Blockchain、人工智能等)应用在金融领域,传统金融业正在逐步向金融科技(Fintech)转变,但由于金融行业的安全性、实时性要求,也对小程序局部编译技术提出了更高的要求。
现有的编译方式在开发阶段会将小程序项目的所有文件都编译成结果文件,这种编译方式在项目初期还可接受,因为初期时目录文件相对较少。但是随着项目的迭代和代码文件的增加,如果每次构建都需要对项目全部文件构建那将会是一个耗时极长的过程。而且随着文件的增加,所需要的编译耗时会成倍增加,这对于大型的复杂前端项目的开发体验和开发效率将会有很大的损耗。
发明内容
本发明的主要目的在于提供一种小程序局部编译方法、装置、设备及计算机可读存储介质,旨在解决现有技术中小程序全局编译效率较低的技术问题。
为实现上述目的,本发明提供一种小程序局部编译方法,所述小程序局部编译方法包括以下步骤:
确定项目文件中的指定入口文件,根据所述指定入口文件确定对应的第一语法树;
对所述第一语法树进行依赖分析,确定所述指定入口文件的依赖文件;
对所述指定入口文件和所述依赖文件进行局部编译。
可选地,所述根据所述指定入口文件确定对应的第一语法树的步骤包括:
对所述指定入口文件进行页面切分,确定所述指定入口文件中的预设标签内容;
根据所述预设标签内容确定对应的第一语法树。
可选地,所述根据所述预设标签内容确定对应的第一语法树的步骤包括:
对所述预设标签内容进行语法树转换,得到第二语法树;
确定所述第二语法树中存在预设引用声明的第一数据块,删除所述第二语法树中除所述第一数据块以外的数据块,得到第一语法树。
可选地,所述对所述第一语法树进行依赖分析,确定所述指定入口文件的依赖文件的步骤包括:
确定所述第一语法树中的预设引用声明中的第一依赖文件路径;
根据所述第一依赖文件路径确定所述指定入口文件的依赖文件。
可选地,所述根据所述第一依赖文件路径确定所述指定入口文件的依赖文件的步骤包括:
根据所述第一依赖文件路径获取对应的第一依赖文件,根据所述第一依赖文件确定对应的第三语法树;
对所述第三语法树进行依赖分析,确定所述第一依赖文件的依赖文件,作为第二依赖文件;
根据所述第二依赖文件确定所述指定入口文件的依赖文件。
可选地,所述根据所述第二依赖文件确定所述指定入口文件的依赖文件的步骤包括:
若所述第二依赖文件不存在依赖文件,则将所述第一依赖文件和所述第二依赖文件确定为所述指定入口文件的依赖文件;
若所述第二依赖文件存在依赖文件,则根据所述第二依赖文件对应的语法树中的预设引用声明确定对应的第三依赖文件;
若所述第三依赖文件不存在依赖文件,则将所述第一依赖文件、第二依赖文件和所述第三依赖文件确定为所述指定入口文件的依赖文件;
若所述第三依赖文件存在依赖文件,则继续对所述第三依赖文件的依赖文件进行依赖分析,直至所述第三依赖文件的依赖文件不存在依赖文件,并将分析出的所有依赖文件确定为所述指定入口文件的依赖文件。
可选地,所述小程序局部编译方法,还包括:
在完成对当前文件的依赖分析时,计算所述当前文件的文件路径的哈希函数值,将所述当前文件的文件路径和所述当前文件的依赖分析状态,存储至与所述当前文件的文件路径的哈希函数值对应的存储位置;
在接收到对目标文件的依赖分析指令时,计算所述目标文件的文件路径的目标哈希函数值,确定与所述目标哈希函数值对应的存储位置是否存在存储内容;
若是,且存储内容中的依赖分析状态为已分析状态,则结束对所述目标文件的依赖分析;
若否,或者,存储内容中的依赖分析状态为未分析状态,则对所述目标文件进行依赖分析,并在完成对所述目标文件的依赖分析时,将所述目标文件的文件路径和所述目标文件的依赖分析状态更新存储至与所述目标文件的文件路径的目标哈希函数值对应的存储位置。
进一步地,为实现上述目的,本发明还提供一种小程序局部编译装置,所述小程序局部编译装置包括:
语法树确定模块,用于确定项目文件中的指定入口文件,根据所述指定入口文件确定对应的第一语法树;
依赖分析模块,用于对所述第一语法树进行依赖分析,确定所述指定入口文件的依赖文件;
局部编译模块,用于对所述指定入口文件和所述依赖文件进行局部编译。
进一步地,为实现上述目的,本发明还提供一种小程序局部编译设备,所述小程序局部编译设备包括存储器、处理器以及存储在所述存储器上并可在所述处理器上运行的小程序局部编译程序,所述小程序局部编译程序被所述处理器执行时实现如上述所述的小程序局部编译方法的步骤。
进一步地,为实现上述目的,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有小程序局部编译程序,所述小程序局部编译程序被处理器执行时实现如上所述的小程序局部编译方法的步骤。
本发明通过确定项目文件中的指定入口文件,根据所述指定入口文件确定对应的第一语法树;对所述第一语法树进行依赖分析,确定所述指定入口文件的依赖文件;对所述指定入口文件和所述依赖文件进行局部编译。实现了只对需要的文件做局部编译处理,对于不需要的文件不做编译处理,如此能够减小待编译的代码包体积,进而缩短编译耗时,提高开发人员的开发效率。
附图说明
图1为本发明小程序局部编译设备实施例方案涉及的设备硬件运行环境的结构示意图;
图2为本发明小程序局部编译方法第一实施例的流程示意图;
图3为本发明小程序局部编译方法中依赖存储方式的示意图;
图4为本发明小程序局部编译方法中扁平化存储的示意图;
图5为本发明小程序局部编译装置较佳实施例的功能模块示意图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
需要说明的是,现有的编译方式在开发阶段会将小程序项目的所有文件都编译成结果文件,这种编译方式在项目初期还可接受,因为初期时目录文件相对较少。但是随着项目的迭代和代码文件的增加,如果每次构建都需要对项目全部文件构建那将会是一个耗时极长的过程。而且随着文件的增加,所需要的编译耗时会成倍增加,这对于大型的复杂前端项目的开发体验和开发效率将会有很大的损耗。
基于上述缺陷,本发明提供一种小程序局部编译设备,参照图1,图1为本发明小程序局部编译设备实施例方案涉及的设备硬件运行环境的结构示意图。
如图1所示,该小程序局部编译设备可以包括:处理器1001,例如CPU,通信总线1002、用户接口1003,网络接口1004,存储器1005。其中,通信总线1002用于实现这些组件之间的连接通信。用户接口1003可以包括显示屏(Display)、输入单元比如键盘(Keyboard),可选用户接口1003还可以包括标准的有线接口、无线接口。网络接口1004可选的可以包括标准的有线接口、无线接口(如WI-FI接口)。存储器1005可以是高速RAM存储器,也可以是稳定的存储器(non-volatile memory),例如磁盘存储器。存储器1005可选的还可以是独立于前述处理器1001的存储设备。
本领域技术人员可以理解,图1中示出的小程序局部编译设备的硬件结构并不构成对小程序局部编译设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
本发明还提供一种小程序局部编译方法。
在对本发明实施例进行进一步详细说明之前,对本发明实施例中涉及的名词和术语进行说明,本发明实施例中涉及的名词和术语适用于如下的解释。
语法树(又叫抽象语法树,abstract syntax tree,缩写为AST),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上每一个节点都表示编程语言的一种结构。之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每一个细节。
SFC:单文件组件(single file component),是一种文件组织形式。SFC将页面的结构层(html)、页面的逻辑层(JavaScript)、页面的样式(CSS)和页面的配置(json)四部分都集合成一个文件表示。
参照图2,图2为本发明小程序局部编译方法第一实施例的流程示意图。
本发明实施例提供了小程序局部编译方法的实施例,需要说明的是,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
在小程序局部编译方法的各个实施例中,以小程序局部编译设备为执行主体阐述各个实施例。小程序局部编译方法包括:
步骤S10,确定项目文件中的指定入口文件,根据所述指定入口文件确定对应的第一语法树;
现有的编译方式在开发阶段会将小程序项目的所有文件都编译成结果文件,这种编译方式在项目初期还可接受,因为初期时目录文件相对较少。但是随着项目的迭代和代码文件的增加,如果每次构建都需要对项目全部文件构建那将会是一个耗时极长的过程。而且随着文件的增加,所需要的编译耗时会成倍增加,这对于大型的复杂前端项目的开发体验和开发效率将会有很大的损耗。
随着互联网技术的发展,金融机构(银行、保险、证券机构)对小程序编译技术的要求越来越高,而现有技术中的这种小程序编译方式,严重影响了银行等金融机构的工作效率,且增加了时间成本。
小程序是由多个页面组成的,每个页面都有对应的代码文件,页面数量越多,小程序的代码文件体积越大,代码文件体积越大,编译耗时越久,因此在开发越大型的小程序时,越常会碰到模拟器打开页面速度较慢、预览和真机调试等待时间较长的问题,这是因为在模拟器中,需要加载至少一个分包下的所有代码才能开始运行,预览和真机调试时,同样也需要加载一个分包下的完整代码。然而,当开发单个或者某几个页面时,其他页面的代码多数与当前页面并不相关,因此,为解决现有技术中小程序全局编译的效率较低的技术问题,本实施例提供了一种小程序局部编译方案。
在本实施例中,用户可以根据需要在小程序的项目文件中直接指定需要编译的入口文件,即指定入口文件。其中,指定入口文件的数量可以是一个也可以是多个,本实施对此不作具体限制,需要说明的是,若指定入口文件是多个,则需要针对每个指定入口文件收集其对应的依赖文件。
可选地,用户还可以直接指定小程序的待编译页面,在确定待编译页面后,小程序局部编译设备可根据该待编译页面自动确定与该待编译页面对应的入口文件,即指定入口文件。其中,待编译页面的数量可以是一个也可以是多个,本实施对此不作具体限制,
需要理解的是,由于代码文件之间常常存在依赖关系,指定入口文件要正常运行需要依赖于相关的依赖文件,若仅对指定入口文件进行编译而不对其依赖文件进行编译,指定入口文件对应的页面将无法正常运行。因此,在确定指定入口文件之后,还需要确定该指定入口文件的依赖文件。所谓依赖,指的是当文件A的运行依赖于另一个文件B时,则将B视为A的直接依赖文件,若文件B的运行依赖于文件C时,则将C视为B的直接依赖文件,另外,由于依赖具有传递性的,则将C视为A的间接依赖文件。对一个文件提取出其对应的所有依赖文件(包括直接依赖文件和间接依赖文件)的过程则称为依赖分析。
可选地,确定依赖文件可以直接通过对指定入口文件的源代码进行分析,确定其依赖文件,但是由于源代码的数据量较大,涉及内容较多,直接对源代码进行分析确定依赖文件的方式,运算量较大,依赖分析耗时较久,且极易发生依赖文件的遗漏,导致页面无法正常运行。
因此,本实施例中,在确定指定入口文件之后,首先需要根据指定入口文件的源代码确定对应的语法树。
可选地,可以将指定入口文件的所有源代码转换为语法树。
进一步地,考虑到小程序的每个页面都由结构层(html)、逻辑层(JavaScript)、样式层(CSS)和页面配置(json)四部分内容组成,这四部分共同组成一个单页面文件,而每个单页面文件中都存在template、script、style和config四个标签,正对应这四部分。由于依赖分析主要针对的是script部分的内容,因此,在本实施例中,提供了一种仅将script部分的内容转换为语法树的方案。上述步骤S10中,所述根据所述指定入口文件确定对应的第一语法树的步骤包括:
步骤a1,对所述指定入口文件进行页面切分,确定所述指定入口文件中的预设标签内容;
步骤a2,根据所述预设标签内容确定对应的第一语法树。
在本实施例中,对指定入口文件进行页面切分,指的是按照预设标签获取对应的标签内容部分,即预设标签内容,本实施例中的预设标签内容指的是script标签部分的内容。
可选地,页面切分可以通过自定义的parseStart函数匹配预设标签的起始位置,通过parseEnd函数匹配到同一预设标签的结束位置,起始位置和结束位置之间的文本则为该标签的内容。由于我们只想要找到第一层的script标签对应的内容,即,指定入口文件最外层的script标签对应的内容,因此,可以在parseStart函数和parseEnd函数中维护一个深度变量(depth变量),在每次标签的起始位置对depth变量++,在标签的结束位置depth--,只有depth==1的标签才是我们需要的。
本实施例通过对文件进行页面切分,仅将预设指定入口文件中的预设标签内容转换为语法树,能够减少语法树转换的内容,提升语法树转换的速度,以进一步提升小程序编译的效率。
进一步地,上述步骤a2包括:
步骤a21,对所述预设标签内容进行语法树转换,得到第二语法树;
步骤a22,确定所述第二语法树中存在预设引用声明的第一数据块,删除所述第二语法树中除所述第一数据块以外的数据块,得到第一语法树。
考虑到语法树中除了与依赖分析相关的信息外,还包括大量与依赖分析无关的信息,若直接对预设标签内容转换得到的语法树进行依赖分析,由于无关信息的存在,将会影响依赖分析的速度。
针对上述缺陷,本实施例在对预设标签内容进行语法树转换,得到第二语法树后,会对第二语法树进行简化处理,以过滤掉与依赖分析无关的信息,仅保留与依赖分析相关的信息,而与依赖分析相关的信息,即为包含预设引用声明的数据块,预设引用声明的存在可以是根据语法树中的引用声明关键词确定的,例如,该引用声明关键词可以为importDeclaration,或者其他预设的关键词;数据块则是与引用声明关键词对应的代码内容,该数据块中包括当前文件的直接依赖文件的路径。
在本实施例中,在确定第二语法树中存在预设引用声明的第一数据块后,即可将不包含预设引用声明的其他代码内容删除,即可得到简化后的语法树,即第一语法树。
本实施通过对语法树进行简化处理,以对简化后的语法树进行依赖分析,能够进一步提升依赖分析的效率。
可选地,在将代码内容转换为语法树的过程,可以通过语法树转换工具来实现,语法树转换工具能够对代码内容进行词法分析(Lexical Analysis)和语法分析(SyntaxAnalysis),得到语法树。该语法树转换工具可选为Esprima、treehugger或者其他能够将代码转换为语法树的工具,本实施例对此不做具体限定。
步骤S20,对所述第一语法树进行依赖分析,确定所述指定入口文件的依赖文件;
在得到第一语法树之后,即可对该第一语法树进行依赖分析,确定指定入口文件的依赖文件,需要说明的是,该指定入口文件的依赖文件包括指定入口文件的直接依赖文件和间接依赖文件。
其中,指定入口文件的直接依赖文件可根据第一语法树中的信息直接确定,而指定入口文件的间接依赖文件则需要根据对直接依赖文件的依赖分析结果确定,可见,当前文件的语法树中仅包含当前文件的直接依赖文件信息,要确定当前文件的间接依赖文件信息,需要对其直接依赖文件的语法树进行依赖分析才可以确定。
进一步地,上述步骤S20包括:
步骤b1,确定所述第一语法树中的预设引用声明中的第一依赖文件路径;
步骤b2,根据所述第一依赖文件路径确定所述指定入口文件的依赖文件。
需要说明的是,若当前文件(此处为指定入口文件)的语法树中存在预设引用声明,说明当前文件存在依赖文件,预设引用声明中的预设字段对应的内容即为当前文件的依赖文件路径。例如,该预设字段可以为value,可以理解的是,该预设字段也可以为其他预设的字段。
在确定依赖文件路径后,即可根据该依赖文件路径确定存储于对应位置的依赖文件。需要说明的是,在获取到依赖文件路径之后,需要对依赖文件路径的路径类型进行识别,若路径类型为非绝对路径,例如为相对路径或者别名路径,则需要将其转换为绝对路径;若路径类型为绝对路径,则无需转换。其中,绝对路径指的是以根(/)开始的路径或位置,是文件在硬盘上真正的路径(URL或物理路径),例如:\Users\19078\source\repos\ege_test\ege_test\girl.jpg代表了girl.jpg文件的绝对路径;相对路径,指的是相对于当前目录来说的路径;别名路径,又叫懒人路径,指的是自定义的路径,例如,若绝对路径为\Users\19078\source\repos\ege_test\ege_test\girl.jpg,设置styles替代\Users\19078\source\repos\ege_test\ege_test,则该绝对路径的别名路径为styles\girl.jpg。
进一步地,上述步骤b2包括:
步骤b21,根据所述第一依赖文件路径获取对应的第一依赖文件,根据所述第一依赖文件确定对应的第三语法树;
步骤b22,对所述第三语法树进行依赖分析,确定所述第一依赖文件的依赖文件,作为第二依赖文件;
步骤b23,根据所述第二依赖文件确定所述指定入口文件的依赖文件。
在本实施例中,在确定依赖文件路径后,即可根据该依赖文件路径获取存储于对应位置的第一依赖文件,按照与前述实施例类似的语法树转换方法将该第一依赖文件转换为语法树,即第三语法树,再按照与前述实施例类似的依赖分析方法对该第三语法树进行依赖分析,从而确定该第一依赖文件的直接依赖文件(即第二依赖文件)。
当然,若确定第一依赖文件不存在直接依赖文件,则可直接将该第一依赖文件作为指定入口文件的所有依赖文件。
在确定第二依赖文件之后,按照与前述实施例类似的语法树转换方法、依赖分析方法继续确定指定入口文件的依赖文件。
进一步地,上述步骤b23包括:
步骤b231,若所述第二依赖文件不存在依赖文件,则将所述第一依赖文件和所述第二依赖文件确定为所述指定入口文件的依赖文件;
步骤b232,若所述第二依赖文件存在依赖文件,则根据所述第二依赖文件对应的语法树中的预设引用声明确定对应的第三依赖文件;
步骤b233,若所述第三依赖文件不存在依赖文件,则将所述第一依赖文件、第二依赖文件和所述第三依赖文件确定为所述指定入口文件的依赖文件;
步骤b234,若所述第三依赖文件存在依赖文件,则继续对所述第三依赖文件的依赖文件进行依赖分析,直至所述第三依赖文件的依赖文件不存在依赖文件,并将分析出的所有依赖文件确定为所述指定入口文件的依赖文件。
在本实施例中,在对第二依赖文件的语法树进行依赖分析前,首先确定第二依赖文件的语法树中是否包含与依赖分析相关的信息,即是否包含预设引用声明的数据块,若否,说明第二依赖文件不存在依赖文件,则直接将第一依赖文件和第二依赖文件确定为指定入口文件的依赖文件;若是,说明第二依赖文件存在依赖文件,则需要根据第二依赖文件对应的语法树中的预设引用声明确定对应的第三依赖文件,再按照类似的方法对第三依赖文件对应的语法树进行依赖文件存在与否的分析。
若第三依赖文件不存在依赖文件,则将第一依赖文件、第二依赖文件和第三依赖文件确定为指定入口文件的依赖文件;若第三依赖文件存在依赖文件,则继续对依赖文件进行递归依赖分析,直至后续的依赖文件不存在依赖文件,则将分析出的所有依赖文件确定为指定入口文件的依赖文件。
步骤S30,对所述指定入口文件和所述依赖文件进行局部编译。
在本实施例中,指定入口文件和指定入口文件的依赖文件是本次编译的最小文件集合,该最小文件集合即本次进行局部编译需要的待编译文件。
可选地,由于小程序的启动需要TabBar页面,因此,可利用小程序的app.json文件获取项目文件中的TabBar页面文件,并将TabBar页面文件、指定入口文件和指定入口文件的依赖文件共同作为本次进行局部编译需要的待编译文件。
本实施例通过确定项目文件中的指定入口文件,根据所述指定入口文件确定对应的第一语法树;对所述第一语法树进行依赖分析,确定所述指定入口文件的依赖文件;对所述指定入口文件和所述依赖文件进行局部编译。实现了只对需要的文件做局部编译处理,对于不需要的文件不做编译处理,如此能够减小待编译的代码包体积,进而缩短编译耗时,提高开发人员的开发效率。
进一步地,提出本发明小程序局部编译方法第二实施例,上述方法,还包括:
步骤c1,在完成对当前文件的依赖分析时,计算所述当前文件的文件路径的哈希函数值,将所述当前文件的文件路径和所述当前文件的依赖分析状态,存储至与所述当前文件的文件路径的哈希函数值对应的存储位置;
步骤c2,在接收到对目标文件的依赖分析指令时,计算所述目标文件的文件路径的目标哈希函数值,确定与所述目标哈希函数值对应的存储位置是否存在存储内容;
步骤c3,若是,且存储内容中的依赖分析状态为已分析状态,则结束对所述目标文件的依赖分析;
步骤c4,若否,或者,存储内容中的依赖分析状态为未分析状态,则对所述目标文件进行依赖分析,并在完成对所述目标文件的依赖分析时,将所述目标文件的文件路径和所述目标文件的依赖分析状态更新存储至与所述目标文件的文件路径的目标哈希函数值对应的存储位置。
在文件依赖分析中会存在多个文件之间的循环依赖问题,如D直接依赖E,E直接依赖F,F直接依赖D,即D–>E,E–>F,F–>D。对于循环依赖的情况,如果不识别出该循环依赖并加以解除,则会导致依赖分析进入一个死循环,最终无法完成依赖文件的收集工作。针对该问题,本实施提出了一种识别循环依赖的方法。
在一实施场景中,首先,每当完成对当前文件的依赖分析时,即可确定当前文件的依赖分析状态(Boolean visited)为已分析状态(true),将当前文件的当前文件路径作为key值,当前文件的依赖分析状态作为value值,然后将key-value成对存储至预设存储空间(依赖收集器)。在后续获取到每一文件的依赖文件路径,要对该依赖文件路径对应的依赖文件继续进行依赖分析之前,先要确定该依赖文件路径对应的依赖文件是否已经被分析过,即,确定该依赖文件路径是否已经作为key值被存储在预设存储空间,以及对应的value值是否为已分析状态,若该依赖文件路径已经作为key值被存储在预设存储空间(依赖收集器),且对应的value值为已分析状态,说明该依赖文件已经被分析过,此处存在循环依赖,则结束对该依赖文件的依赖分析;若该依赖文件路径未被作为key值被存储在预设存储空间,或者,该依赖文件路径已经作为key值被存储在预设存储空间,但是对应的value值为未分析状态(false),说明该依赖文件未被分析过,则对该依赖文件进行依赖分析,并在完成对该依赖文件的依赖分析时,将该依赖文件的文件路径和依赖分析状态(true),存储/更新至预设存储空间。
在上述场景中,在存储key-value时,是按照分析出来的依赖文件的时间顺序依次存储的,这种存储方式会导致在需要确定目标文件是否被分析过时,需要遍历整个存储空间查找该目标文件对应的文件路径和/或依赖分析状态,其时间复杂度为O(n),效率较低。针对该问题,本实施例进一步提出了一种提升循环依赖的识别效率的方法。
在又一实施场景中,可参见图3,key值、value值与上一实施场景相同,即将当前文件的当前文件路径作为key值,当前文件的依赖分析状态作为value值,但对key-value对的存储方式进行了改进。
具体为,按照预设哈希函数计算当前文件的文件路径哈希函数值,将该哈希函数值映射至预设存储空间的对应存储位置,并将对应的key-value对存储至该存储位置。对应地,在需要确定目标文件路径对应的依赖文件是否已经被分析过时,计算该目标文件的文件路径的目标哈希函数值,然后在预设存储空间中定向查找与该目标哈希函数值对应的存储位置是否存在存储内容,若是,且对应的value值为已分析状态,说明该依赖文件已经被分析过,此处存在循环依赖,则结束对该目标文件的依赖分析;若与该目标哈希函数值对应的存储位置不存在存储内容,或者,该依赖文件路径已经作为key值被存储在该存储位置,但是对应的value值为未分析状态(false),说明该依赖文件未被分析过,则对该目标文件进行依赖分析,并在完成对该目标文件的依赖分析时,将该目标文件的文件路径和依赖分析状态(true),存储/更新至该存储位置。
如此,可以直接通过关键字key得到存储key-value对的存储位置,而无需遍历存储空间,将时间复杂度降为O(1),能够提升文件的查找效率,进而能够提升循环依赖的识别效率。
进一步地,参见图4,文件分析出来的依赖有两个特点,一是大部分文件与其依赖都呈现为一对多的关系,即一个文件会有多个直接依赖文件;二是文件的依赖分析结果大都呈现为树状结构,分析文件是根结点、直接依赖是分析文件的子节点,间接依赖是分析文件的孙子节点,可见依赖文件之间是有层级关系的,而上述存储方式在依赖收集器中存储文件的依赖分析相关信息时,仅存储了当前文件的文件路径和依赖分析状态,导致当前依赖收集器中的信息无法体现各个文件在多级依赖中层级水平。
针对该问题,本实施例在依赖收集器中存储key-value对时,还会将当前文件的前置文件的路径(String preykey)与当前文件的依赖分析状态(Boolean visited)共同作为value值,存储至依赖收集器中,其中,当前文件为前置文件的依赖文件。例如,图4中,若当前文件为A1,由于其为根节点,即指定入口文件,则A1不存在前置文件,则其前置文件可定义为root;若当前文件为C7,由于C7为A1的间接依赖文件,B4的直接依赖文件,因此C7的前置文件为A1和B4;若当前文件为B3,由于B3为A1的直接依赖文件,因此B3的前置文件为A1。
如此,通过将多级依赖的树状结构扁平化,能够将文件在多级依赖中的层级直观的体现出来,便于查看。
可选地,在确定当前文件的依赖文件时,可以通过深度优先遍历(Depth FirstSearch,DFS)来确定当前文件的所有依赖文件。
本发明还提供一种小程序局部编译装置。
参照图3,图3为本发明小程序局部编译装置第一实施例的功能模块示意图。所述小程序局部编译装置包括:
语法树确定模块10,用于确定项目文件中的指定入口文件,根据所述指定入口文件确定对应的第一语法树;
依赖分析模块20,用于对所述第一语法树进行依赖分析,确定所述指定入口文件的依赖文件;
局部编译模块30,用于对所述指定入口文件和所述依赖文件进行局部编译。
进一步地,所述语法树确定模块,还用于:
对所述指定入口文件进行页面切分,确定所述指定入口文件中的预设标签内容;
根据所述预设标签内容确定对应的第一语法树。
进一步地,所述语法树确定模块,还用于:
对所述预设标签内容进行语法树转换,得到第二语法树;
确定所述第二语法树中存在预设引用声明的第一数据块,删除所述第二语法树中除所述第一数据块以外的数据块,得到第一语法树。
进一步地,所述依赖分析模块,还用于:
确定所述第一语法树中的预设引用声明中的第一依赖文件路径;
根据所述第一依赖文件路径确定所述指定入口文件的依赖文件。
进一步地,所述依赖分析模块,还用于:
根据所述第一依赖文件路径获取对应的第一依赖文件,根据所述第一依赖文件确定对应的第三语法树;
对所述第三语法树进行依赖分析,确定所述第一依赖文件的依赖文件,作为第二依赖文件;
根据所述第二依赖文件确定所述指定入口文件的依赖文件。
进一步地,所述依赖分析模块,还用于:
若所述第二依赖文件不存在依赖文件,则将所述第一依赖文件和所述第二依赖文件确定为所述指定入口文件的依赖文件;
若所述第二依赖文件存在依赖文件,则根据所述第二依赖文件对应的语法树中的预设引用声明确定对应的第三依赖文件;
若所述第三依赖文件不存在依赖文件,则将所述第一依赖文件、第二依赖文件和所述第三依赖文件确定为所述指定入口文件的依赖文件;
若所述第三依赖文件存在依赖文件,则继续对所述第三依赖文件的依赖文件进行依赖分析,直至所述第三依赖文件的依赖文件不存在依赖文件,并将分析出的所有依赖文件确定为所述指定入口文件的依赖文件。
进一步地,所述小程序局部编译装置,还包括:
存储模块,用于在完成对当前文件的依赖分析时,计算所述当前文件的文件路径的哈希函数值,将所述当前文件的文件路径和所述当前文件的依赖分析状态,存储至与所述当前文件的文件路径的哈希函数值对应的存储位置;
计算模块,用于在接收到对目标文件的依赖分析指令时,计算所述目标文件的文件路径的目标哈希函数值,确定与所述目标哈希函数值对应的存储位置是否存在存储内容;
结束模块,用于若是,且存储内容中的依赖分析状态为已分析状态,则结束对所述目标文件的依赖分析;
递归模块,用于若否,或者,存储内容中的依赖分析状态为未分析状态,则对所述目标文件进行依赖分析,并在完成对所述目标文件的依赖分析时,将所述目标文件的文件路径和所述目标文件的依赖分析状态更新存储至与所述目标文件的文件路径的目标哈希函数值对应的存储位置。
本发明小程序局部编译装置具体实施方式与上述小程序局部编译方法各实施例基本相同,在此不再赘述。
此外,本发明实施例还提出一种计算机可读存储介质。
计算机可读存储介质上存储有小程序局部编译程序,小程序局部编译程序被处理器执行时实现如上所述的小程序局部编译方法的步骤。
本发明计算机可读存储介质具体实施方式与上述小程序局部编译方法各实施例基本相同,在此不再赘述。
上面结合附图对本发明的实施例进行了描述,但是本发明并不局限于上述的具体实施方式,上述的具体实施方式仅仅是示意性的,而不是限制性的,本领域的普通技术人员在本发明的启示下,在不脱离本发明宗旨和权利要求所保护的范围情况下,还可做出很多形式,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,这些均属于本发明的保护之内。
Claims (10)
1.一种小程序局部编译方法,其特征在于,所述小程序局部编译方法包括以下步骤:
确定项目文件中的指定入口文件,根据所述指定入口文件确定对应的第一语法树;
对所述第一语法树进行依赖分析,确定所述指定入口文件的依赖文件;
对所述指定入口文件和所述依赖文件进行局部编译。
2.如权利要求1所述的小程序局部编译方法,其特征在于,所述根据所述指定入口文件确定对应的第一语法树的步骤包括:
对所述指定入口文件进行页面切分,确定所述指定入口文件中的预设标签内容;
根据所述预设标签内容确定对应的第一语法树。
3.如权利要求2所述的小程序局部编译方法,其特征在于,所述根据所述预设标签内容确定对应的第一语法树的步骤包括:
对所述预设标签内容进行语法树转换,得到第二语法树;
确定所述第二语法树中存在预设引用声明的第一数据块,删除所述第二语法树中除所述第一数据块以外的数据块,得到第一语法树。
4.如权利要求1所述的小程序局部编译方法,其特征在于,所述对所述第一语法树进行依赖分析,确定所述指定入口文件的依赖文件的步骤包括:
确定所述第一语法树中的预设引用声明中的第一依赖文件路径;
根据所述第一依赖文件路径确定所述指定入口文件的依赖文件。
5.如权利要求4所述的小程序局部编译方法,其特征在于,所述根据所述第一依赖文件路径确定所述指定入口文件的依赖文件的步骤包括:
根据所述第一依赖文件路径获取对应的第一依赖文件,根据所述第一依赖文件确定对应的第三语法树;
对所述第三语法树进行依赖分析,确定所述第一依赖文件的依赖文件,作为第二依赖文件;
根据所述第二依赖文件确定所述指定入口文件的依赖文件。
6.如权利要求5所述的小程序局部编译方法,其特征在于,所述根据所述第二依赖文件确定所述指定入口文件的依赖文件的步骤包括:
若所述第二依赖文件不存在依赖文件,则将所述第一依赖文件和所述第二依赖文件确定为所述指定入口文件的依赖文件;
若所述第二依赖文件存在依赖文件,则根据所述第二依赖文件对应的语法树中的预设引用声明确定对应的第三依赖文件;
若所述第三依赖文件不存在依赖文件,则将所述第一依赖文件、第二依赖文件和所述第三依赖文件确定为所述指定入口文件的依赖文件;
若所述第三依赖文件存在依赖文件,则继续对所述第三依赖文件的依赖文件进行依赖分析,直至所述第三依赖文件的依赖文件不存在依赖文件,并将分析出的所有依赖文件确定为所述指定入口文件的依赖文件。
7.如权利要求1所述的小程序局部编译方法,其特征在于,所述小程序局部编译方法,还包括:
在完成对当前文件的依赖分析时,计算所述当前文件的文件路径的哈希函数值,将所述当前文件的文件路径和所述当前文件的依赖分析状态,存储至与所述当前文件的文件路径的哈希函数值对应的存储位置;
在接收到对目标文件的依赖分析指令时,计算所述目标文件的文件路径的目标哈希函数值,确定与所述目标哈希函数值对应的存储位置是否存在存储内容;
若是,且存储内容中的依赖分析状态为已分析状态,则结束对所述目标文件的依赖分析;
若否,或者,存储内容中的依赖分析状态为未分析状态,则对所述目标文件进行依赖分析,并在完成对所述目标文件的依赖分析时,将所述目标文件的文件路径和所述目标文件的依赖分析状态更新存储至与所述目标文件的文件路径的目标哈希函数值对应的存储位置。
8.一种小程序局部编译装置,其特征在于,所述小程序局部编译装置包括:
语法树确定模块,用于确定项目文件中的指定入口文件,根据所述指定入口文件确定对应的第一语法树;
依赖分析模块,用于对所述第一语法树进行依赖分析,确定所述指定入口文件的依赖文件;
局部编译模块,用于对所述指定入口文件和所述依赖文件进行局部编译。
9.一种小程序局部编译设备,其特征在于,所述小程序局部编译设备包括存储器、处理器以及存储在所述存储器上并可在所述处理器上运行的小程序局部编译程序,所述小程序局部编译程序被所述处理器执行时实现如权利要求1-7中任一项所述的小程序局部编译方法的步骤。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有小程序局部编译程序,所述小程序局部编译程序被处理器执行时实现如权利要求1-7中任一项所述的小程序局部编译方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111280796.7A CN114003234A (zh) | 2021-10-29 | 2021-10-29 | 小程序局部编译方法、装置、设备及计算机可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111280796.7A CN114003234A (zh) | 2021-10-29 | 2021-10-29 | 小程序局部编译方法、装置、设备及计算机可读存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114003234A true CN114003234A (zh) | 2022-02-01 |
Family
ID=79926093
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111280796.7A Pending CN114003234A (zh) | 2021-10-29 | 2021-10-29 | 小程序局部编译方法、装置、设备及计算机可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114003234A (zh) |
-
2021
- 2021-10-29 CN CN202111280796.7A patent/CN114003234A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR101908162B1 (ko) | 통합 개발 환경에서의 라이브 브라우저 툴 제공 기법 | |
US8392467B1 (en) | Directing searches on tree data structures | |
CN111488174A (zh) | 应用程序接口文档的生成方法、装置、计算机设备及介质 | |
Delfmann et al. | The generic model query language GMQL–Conceptual specification, implementation, and runtime evaluation | |
US11262988B2 (en) | Method and system for using subroutine graphs for formal language processing | |
Sacramento et al. | Web application model generation through reverse engineering and UI pattern inferring | |
US20060101392A1 (en) | Strongly-typed UI automation model generator | |
CN101866315A (zh) | 软件开发工具的测试方法及系统 | |
CN115017516A (zh) | 一种基于符号执行的模糊测试方法 | |
JP2018510445A (ja) | プログラム性能を向上させる領域特化システムおよび方法 | |
CN115509514B (zh) | 一种前端数据模拟方法、装置、设备及介质 | |
CN108563561B (zh) | 一种程序隐性约束提取方法及系统 | |
CN115033894A (zh) | 一种基于知识图谱的软件组件供应链安全检测方法及装置 | |
CN114356964A (zh) | 数据血缘构建方法、装置、存储介质及电子设备 | |
Bull et al. | Semantic grep: Regular expressions+ relational abstraction | |
EP3816814A1 (en) | Crux detection in search definitions | |
CN113835952B (zh) | 基于编译器代码注入的Linux系统调用监控方法 | |
Anderson et al. | Supporting analysis of SQL queries in PHP AiR | |
CN114003234A (zh) | 小程序局部编译方法、装置、设备及计算机可读存储介质 | |
CN115310095A (zh) | 一种区块链智能合约混合形式化验证方法及系统 | |
WO2022047623A1 (zh) | 一种软件信息组织方法、装置和计算机可读介质 | |
Raj et al. | Distributed component-based crawler for AJAX applications | |
JP6955162B2 (ja) | 解析装置、解析方法および解析プログラム | |
Mennie et al. | Giving meaning to macros | |
CN112445468A (zh) | Typescript类型文件生成方法、装置、设备及计算机可读存储介质 |
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 |