1.本技术涉及计算机技术领域,尤其涉及一种前端编译方法、装置、设备及存储介质。
背景技术:
2.通常情况下,一个程序或者库需要依赖于其他的软件或者库才能正常工作。行业内,将这些被程序或者库所依赖的软件或者库称为依赖包。在软件开发以及迭代过程中,将源文件和依赖包编译成目标文件是非常频繁的工作,每次编译时均需要安装依赖包,而依赖包的数量可能达到上千个,且每次编译开始必须使用依赖安装器来检查依赖的完整性,这导致需要消耗大量的计算机性能,延长整个编译的时间,从而延长软件开发以及迭代的时间。
技术实现要素:
3.针对上述技术问题,本技术的目的在于提供一种前端编译方法、装置、设备及存储介质,旨在提高软件开发及迭代过程中程序的编译效率,从而缩短软件开发以及迭代的时间。
4.第一方面,本技术实施例提供一种前端编译方法,包括:
5.获取待编译的前端项目代码;
6.判断所述前端项目代码上一次是否编译成功;
7.若为成功,则判断所述前端项目代码对应的依赖包是否已经更新;
8.若所述前端项目代码对应的依赖包已经更新,则重新安装依赖包,并在依赖包安装成功后,触发下一个编译流程,直至结束编译;
9.若所述前端项目代码对应的依赖包没有更新,则跳过安装依赖包的步骤,触发下一个编译流程,直至结束编译。
10.进一步的,所述判断所述前端项目代码上一次是否编译成功的步骤包括:
11.获取所述前端项目代码的node_modules的md5缓存值;其中,所述node_modules的md5缓存值为所述前端项目代码上一次编译成功对应的node_modules的md5值;
12.若所述node_modules的md5缓存值为非空值,则判定所述前端项目代码上一次编译成功,否则,为不成功。
13.进一步的,所述判断所述前端项目代码对应的依赖包是否已经更新的步骤包括:
14.智能识别出所述前端项目代码的package.lock文件,并计算出所述package.lock文件的md5值;
15.获取package.lock文件的md5缓存值;其中,所述package.lock文件的md5缓存值为所述前端项目代码上一次编译成功对应的package.lock文件的md5值;
16.判断计算得到的所述package.lock文件的md5值和所述package.lock文件的md5缓存值是否相同;
17.若不相同,则判定所述前端项目代码对应的依赖包已经更新;
18.若相同,则智能识别出所述前端项目代码的node_modules,并计算出所述node_modules的md5值;
19.获取所述前端项目代码的node_modules的md5缓存值;其中,所述node_modules的md5缓存值为所述前端项目代码上一次编译成功对应的node_modules的md5值;
20.判断计算得到的所述node_modules的md5值与所述node_modules的md5缓存值是否相同;
21.若不同,则判定所述前端项目代码对应的依赖包已经更新;
22.若相同,则判定所述前端项目代码对应的依赖包未更新。
23.进一步的,所述获取前端项目代码的步骤之前,还包括:
24.根据抽取操作从原前端项目代码中抽取出用户指定的代码模块;其中,所述原前端项目代码采用javascript编写得到;
25.从第一存储位置中获取采用第二计算机语言重写所述代码模块的代码;其中,所述第二计算机语言为可以转换为webassembly的语言;
26.将重写得到的代码转换为webassembly字节码;
27.将所述webassembly字节码加载到所述代码模块被抽取后的前端项目代码中,得到优化后的前端项目代码;
28.将所述优化后的前端项目代码作为待编译的前端项目代码存储到第二存储位置。
29.进一步的,所述从第一存储位置中获取采用第二计算机语言重写所述代码模块的代码的步骤之前,还包括:
30.采用ai智能推荐工具对所述代码模块进行分析,以获得最适合目标性能的代码方案;
31.将根据所述代码方案,利用第二计算机语言重写所述代码模块的代码存储到所述第一存储位置。
32.进一步的,所述第二语言为c、c 、rust、go或c#。
33.进一步的,所述重新安装所述依赖包的步骤之后,还包括:
34.若所述依赖包未安装成功,则抛出错误并结束编译流程。
35.第二方面,本发明实施例提供一种前端编译装置,包括:
36.获取模块,用于获取待编译的前端项目代码;
37.第一判断模块,用于判断所述前端项目代码上一次是否编译成功;
38.第二判断模块,用于若为成功,则判断所述前端项目代码对应的依赖包是否已经更新;
39.依赖包安装模块,用于若所述前端项目代码对应的依赖包已经更新,则重新安装依赖包,并在依赖包安装成功后,触发下一个编译流程,直至结束编译;
40.触发模块,用于若所述前端项目代码对应的依赖包没有更新,则跳过安装依赖包的步骤,触发下一个编译流程,直至结束编译。
41.第三方面,本技术实施例提供一种计算机设备,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器执行所述计算机程序时实现如上述任一项所述方法的步骤。
42.第四方面,本技术实施例提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如上述任一项所述方法的步骤。
43.本发明实施例通过获取待编译的前端项目代码;判断所述前端项目代码上一次是否编译成功;若为成功,则判断所述前端项目代码对应的依赖包是否已经更新;若所述前端项目代码对应的依赖包已经更新,则重新安装依赖包,并在依赖包安装成功后,触发下一个编译流程,直至结束编译;若所述前端项目代码对应的依赖包没有更新,则跳过安装依赖包的步骤,触发下一个编译流程,直至结束编译,如此,避免了每次编译时均要重新安装依赖包的问题,由于在上一次编译成功且依赖包没有更新的情况下无需重新安装依赖包,因此,可以提高前端编译效率,从而缩短软件开发以及迭代的时间。
附图说明
44.为了更清楚地说明本技术的技术方案,下面将对实施方式中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
45.图1是本技术实施例提供的前端编译方法的流程示意图;
46.图2是本技术实施例提供的前端编译装置的结构示意图
47.图3是本技术实施例提供的计算机设备的结构示意框图。
具体实施方式
48.为了使本技术的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本技术进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本技术,并不用于限定本技术。
49.本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“上述”和“该”也可包括复数形式。应该进一步理解的是,本技术的说明书中使用的措辞“包括”是指存在特征、整数、步骤、操作、元件、模块、和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、模块、组件和/或它们的组。应该理解,当我们称元件被“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列出项的全部或任一模块和全部组合。
50.本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本技术所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样被
51.请参阅图1,本技术实施例提供一种前端编译方法,包括步骤s1-s5:
52.s1、获取待编译的前端项目代码;
53.s2、判断所述前端项目代码上一次是否编译成功;
54.s3、若为成功,则判断所述前端项目代码对应的依赖包是否已经更新;
55.s4、若所述前端项目代码对应的依赖包已经更新,则重新安装依赖包,并在依赖包安装成功后,触发下一个编译流程,直至结束编译;
56.s5、若所述前端项目代码对应的依赖包没有更新,则跳过安装依赖包的步骤,触发下一个编译流程,直至结束编译。
57.在本技术实施例种,所述前端编译方法的依赖包需要安装在本地。
58.如上述步骤s1,所述前端项目是可以共享的,可由多人开发。在前端项目开发过程中,由于项目中的代码是会变更的,因此,会在不同时间节点对该前端项目进行多次编译。所述待编译的前端项目代码可理解为待编译的前端项目。
59.如上述步骤s2~s5,判断所述前端项目代码上一次是否编译成功,若前端项目代码上一次是没有编译成功或本次编译是首次编译,则需要重新安装依赖包。若编译成功,则表示依赖包在上一次编译时已经安装好,那么接下来需要判断前端项目代码对应的依赖包是否已经更新,即判断依赖是否已经更新。若前端项目代码对应的依赖包已经更新,则需要重新安装依赖包,并在依赖包安装成功后,触发下一个编译流程,直至结束编译。若前端项目代码对应的依赖包没有更新,即依赖没有更新,则可以跳过安装依赖包的步骤,使用上次安装结果,并触发下一个编译流程,直至结束编译。如此,避免了每次编译时均要重新安装所有依赖包的问题,由于在上一次编译成功且依赖包没有更新的情况下无需重新安装依赖包,因此,可以提高前端编译效率,从而缩短软件开发以及迭代的时间。
60.在一些实施例中,所述判断所述前端项目代码上一次是否编译成功的步骤包括:
61.获取所述前端项目代码的node_modules的md5缓存值;其中,所述node_modules的md5缓存值为所述前端项目代码上一次编译成功对应的node_modules的md5值;
62.若所述node_modules的md5缓存值为非空值,则判定所述前端项目代码上一次编译成功,否则,为不成功。
63.在本技术实施例中,node_modules是一个目录,它是用于存储node.js项目中所需的第三方库和依赖包的地方。当使用npm(node package manager)或类似的工具安装依赖包时,这些依赖包会被下载并存储在node_modules目录中。若前端项目在上一次编译成功了,该node_modules的md5值会存储起来。
64.在一些实施例中,所述检测所述前端项目代码对应的依赖包是否已经更新的步骤包括:
65.智能识别出所述前端项目代码的package.lock文件,并计算出所述package.lock文件的md5值;
66.获取package.lock文件的md5缓存值;其中,所述package.lock文件的md5缓存值为所述前端项目代码上一次编译成功对应的package.lock文件的md5值;
67.判断计算得到的所述package.lock文件的md5值和所述package.lock文件的md5缓存值是否相同;
68.若不相同,则判定所述前端项目代码对应的依赖包已经更新;
69.若相同,则智能识别出所述前端项目代码的node_modules,并计算出所述node_modules的md5值;
70.获取所述前端项目代码的node_modules的md5缓存值;其中,所述node_modules的md5缓存值为所述前端项目代码上一次编译成功对应的node_modules的md5值;
71.判断计算得到的所述node_modules的md5值与所述node_modules的md5缓存值是否相同;
72.若不同,则判定所述前端项目代码对应的依赖包已经更新;
73.若相同,则判定所述前端项目代码对应的依赖包未更新。
74.在本技术实施例中,在该前端项目共同开发的情况下,若外来的package.lock将本地的package.lock更新了,即表示该前端项目对应的依赖包已经更新了(即依赖已经发生了变更),那么这种情况本地需要重新安装依赖包,这里指的是重新安装所有依赖包。判断依赖是否发生变更可以通过采用文件识别方法,具体的,使用文件系统操作,如读取文件列表或特定的文件搜索算法,识别出package.lock文件(package.lock文件是在执行npm install(npm安装)或类似的命令时自动生成的,它记录了当前项目的确切依赖版本以及它们之间的依赖关系树),然后采用加密库或哈希函数计算出package.lock文件的md5值,将计算得到的package.lock文件的md5值与上一次编译成功对应的package.lock文件的md5值进行比较,若不相同,则表示前端项目代码对应的依赖包已经更新,需要重新安装依赖包,并在依赖包安装成功后,重新计算package.lock文件的md5值和node_modules的md5值,并更新package.lock文件的缓存值和node_modules的缓存值。若相同,则表示不确定,需要进一步判定。通过文件识别方法,具体的,使用文件系统操作,如读取文件列表或特定的文件搜索算法智能识别出前端项目代码的node_modules,并采用加密库或哈希函数计算出该node_modules的md5值,将计算得到的node_modules的md5值与该前端项目代码上一次编译成功对应的node_modules的md5值进行比较,若不同,则判定所述前端项目代码对应的依赖包已经更新,需要重新安装依赖包,并在依赖包安装成功后,重新计算package.lock文件的md5值和node_modules的md5值,并更新package.lock文件的缓存值和node_modules的缓存值。
75.在一个实施例中,所述获取前端项目代码的步骤之前,还包括:
76.根据抽取操作从原前端项目代码中抽取出用户指定的代码模块;其中,所述原前端项目代码采用javascript编写得到;
77.从第一存储位置中获取采用第二计算机语言重写所述代码模块的代码;其中,所述第二计算机语言为可以转换为webassembly的语言;
78.将重写得到的代码转换为webassembly字节码;
79.将所述webassembly字节码加载到所述代码模块被抽取后的前端项目代码中,得到优化后的前端项目代码;
80.将所述优化后的前端项目代码作为待编译的前端项目代码存储到第二存储位置。
81.在本发明实施例中,应当理解的是,javascript是一种直译式脚本语言。所述用户指定的代码模块为需要提高性能的代码模块。在抽取得到用户指定的代码模块后,用户需要利用第二语言重写该代码模块的代码,该第二语言是可以转换为webassembly的语言,如采用c 、c语言。webassembly是一种新的字节码格式,它可以在现代web浏览器上运行高效的二进制代码。它是针对低级语言(如c、c )编写的代码的格式,可以以原生代码的速度在web浏览器上运行。当然,也可以利用工具将该段代码模块的代码转换成c或c ,例如,采用chatgpt。chatgpt是美国人工智能研究实验室openai新推出的一种人工智能技术驱动的自然语言处理工具,其拥有语言理解和文本生成能力,尤其是它会通过连接大量的语料库来训练模型。chatgpt不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。在得到重写的代码后,可以将这段重写的代码存储到指定的位置,如存储到第一存储位
置。那么,在需要时,可从该存储位置中获取该重写的代码。在获取到该重写的代码后,通过webassembly编译器将该代码转换为webassembly字节码,生成wasm格式的文件。wasm(全称:webassembly)是一个可移植、体积小、加载快并且兼容web的全新格式。在获得wasm格式的文件后,可以将其上传到npm(全称:node package manager)包管理服务器。需要时,可从该npm包管理服务将该wasm格式的文件加载到被抽取后的前端javascript代码中,这样就得到优化后的前端项目代码。最后,将该优化后的前端项目代码存储到指定的存储位置,如存储到第二存储位置,这样在需要时,便可从第二存储位置中获取该优化后的前端项目代码作为待编译的前端项目代码。
82.本发明实施例通过使用webassembly编译器将需要提升性能的代码转换为webassembly字节码,并加载到前端项目代码中,可以保证代码的高效运行。webassembly代码可以直接在浏览器中运行,无需经过任何转换,进一步提高前端项目代码的编译速度,在多次测试中,性能提升30%。
83.在一些实施例中,所述从第一存储位置中获取采用第二计算机语言重写所述代码模块的代码的步骤之前,还包括:
84.采用ai智能推荐工具对所述代码模块进行分析,以获得最适合目标性能的代码方案;
85.将根据所述代码方案,利用第二计算机语言重写所述代码模块的代码存储到所述第一存储位置。
86.在本技术实施例种,需要说明的是,在需要处理大规模数据集的应用中,如数据分析、机器学习或大数据处理,ai可以分析数据处理算法、并行化策略、数据分片等因素,并提供最适合性能的代码方案,以加速数据处理过程。
87.在本技术实施例中,通过ai智能推荐最适合性能的代码方案,能够有效减少频繁访问内存,进一步提高编译效率。
88.在一些实施例中,所述第二语言为c、c 、rust、go或c#。
89.本发明实施例只是列举若干个常用的可转成为webassembly的语言,本发明实施例对此不作限制。
90.在一个实施例中,所述重新安装所述依赖包的步骤之后,还包括:
91.若所述依赖包未安装成功,则抛出错误并结束编译流程。
92.在本发明实施例中,通过在依赖包未安装成功时,抛出错误并结束编译流程,可以提示用户编译出错,从而让用户了解编译情况。
93.请参阅图2,本技术实施例还提供一种前端编译装置,包括:
94.获取模块1,用于获取待编译的前端项目代码;
95.第一判断模块2,用于判断所述前端项目代码上一次是否编译成功;
96.第二判断模块3,用于若为成功,则判断所述前端项目代码对应的依赖包是否已经更新;
97.依赖包安装模块4,用于若所述前端项目代码对应的依赖包已经更新,则重新安装依赖包,并在依赖包安装成功后,触发下一个编译流程,直至结束编译;
98.触发模块5,用于若所述前端项目代码对应的依赖包没有更新,则跳过安装依赖包的步骤,触发下一个编译流程,直至结束编译。
99.在一些实施例,所述第一判断模块2具体用于:
100.获取所述前端项目代码的node_modules的md5缓存值;其中,所述node_modules的md5缓存值为所述前端项目代码上一次编译成功对应的node_modules的md5值;
101.若所述node_modules的md5缓存值为非空值,则判定所述前端项目代码上一次编译成功,否则,为不成功。
102.进一步的,所述第二判断模块3具体用于:
103.智能识别出所述前端项目代码的package.lock文件,并计算出所述package.lock文件的md5值;
104.获取package.lock文件的md5缓存值;其中,所述package.lock文件的md5缓存值为所述前端项目代码上一次编译成功对应的package.lock文件的md5值;
105.判断计算得到的所述package.lock文件的md5值和所述package.lock文件的md5缓存值是否相同;
106.若不相同,则判定所述前端项目代码对应的依赖包已经更新;
107.若相同,则智能识别出所述前端项目代码的node_modules,并计算出所述node_modules的md5值;
108.获取所述前端项目代码的node_modules的md5缓存值;其中,所述node_modules的md5缓存值为所述前端项目代码上一次编译成功对应的node_modules的md5值;
109.判断计算得到的所述node_modules的md5值与所述node_modules的md5缓存值是否相同;
110.若不同,则判定所述前端项目代码对应的依赖包已经更新;
111.若相同,则判定所述前端项目代码对应的依赖包未更新。
112.在一些实施例中,所述前端编译装置还包括待编译前端项目代码生成模块,用于:
113.根据抽取操作从原前端项目代码中抽取出用户指定的代码模块;其中,所述原前端项目代码采用javascript编写得到;
114.从第一存储位置中获取采用第二计算机语言重写所述代码模块的代码;其中,所述第二计算机语言为可以转换为webassembly的语言;
115.将重写得到的代码转换为webassembly字节码;
116.将所述webassembly字节码加载到所述代码模块被抽取后的前端项目代码中,得到优化后的前端项目代码;
117.将所述优化后的前端项目代码作为待编译的前端项目代码存储到第二存储位置。
118.在一些实施例,所述从第一存储位置中获取采用第二计算机语言重写所述代码模块的代码之前,还包括:
119.采用ai智能推荐工具对所述代码模块进行分析,以获得最适合目标性能的代码方案;
120.将根据所述代码方案,利用第二计算机语言重写所述代码模块的代码存储到所述第一存储位置。
121.在一些实施例,所述第二语言为c、c 、rust、go或c#。
122.在一些实施例,所述重新安装所述依赖包的步骤之后,还包括:
123.若所述依赖包未安装成功,则抛出错误并结束编译流程。
124.本技术实施例提供的前端编译装置是与上述实施例一提供的前端编译方法一一对应的装置项,因此,上述实施例一所记载的全部技术内容均适用于本技术实施例提供的前端编译装置,因此,本技术实施例不再赘述。
125.实施例三:
126.参照图3,本技术实施例还提供一种计算机设备,该计算机设备的内部结构可以如图3所示。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口和数据库。其中,该计算机设备设计的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作装置、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于存储一种前端编译方法等数据。该计算机设备的网络接口用于与外部的终端通过网络连接通信。进一步地,上述计算机设备还可以设置有输入装置和显示屏等。上述计算机程序被处理器执行时以实现一种前端编译方法.包括:获取待编译的前端项目代码;判断所述前端项目代码上一次是否编译成功;若为成功,则判断所述前端项目代码对应的依赖包是否已经更新;若所述前端项目代码对应的依赖包已经更新,则重新安装依赖包,并在依赖包安装成功后,触发下一个编译流程,直至结束编译;若所述前端项目代码对应的依赖包没有更新,则跳过安装依赖包的步骤,触发下一个编译流程,直至结束编译。本领域技术人员可以理解,图3中示出的结构,仅仅是与本技术方案相关的部分结构的框图,并不构成对本技术方案所应用于其上的计算机设备的限定。
127.本技术一实施例还提供一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现一种前端编译方法,包括:获取待编译的前端项目代码;判断所述前端项目代码上一次是否编译成功;若为成功,则判断所述前端项目代码对应的依赖包是否已经更新;若所述前端项目代码对应的依赖包已经更新,则重新安装依赖包,并在依赖包安装成功后,触发下一个编译流程,直至结束编译;若所述前端项目代码对应的依赖包没有更新,则跳过安装依赖包的步骤,触发下一个编译流程,直至结束编译。
128.本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本技术所提供的和实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可以包括只读存储器(rom)、可编程rom(prom)、电可编程rom(eprom)、电可擦除可编程rom(eeprom)或闪存。易失性存储器可包括随机存取存储器(ram)或者外部高速缓冲存储器。作为说明而非局限,ram通过多种形式可得,诸如静态ram(sram)、动态ram(dram)、同步dram(sdram)、双速据率sdram(ssrsdram)、增强型sdram(esdram)、同步链路(synchlink)dram(sldram)、存储器总线(rambus)直接ram(rdram)、直接存储器总线动态ram(drdram)、以及存储器总线动态ram(rdram)等。
129.需要说明的是,在本文中,术语“包括”、“包含”或者其任何其它变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、装置、物品或者方法不仅包括那些要素,而且还包括没有明确列出的其它要素,或者是还包括为这种过程、装置、物品或者方法所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括该要素的过程、装置、物品或者方法中还存在另外的相同要素。
130.以上所述仅为本技术的优选实施例,并非因此限制本技术的专利范围,凡是利用本技术说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本技术的专利保护范围内。