具体实施方式
为了使本技术领域的人员更好地理解本申请中的技术方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
下面结合附图对本申请所述的前端项目构建方法、装置及系统进行详细的说明。虽然本申请提供了如下述实施例或附图所示的方法操作步骤或装置结构,但基于常规或者无需创造性的劳动在所述方法或装置中可以包括更多或者更少的操作步骤或模块结构。在逻辑性上不存在必要因果关系的步骤或结构中,这些步骤的执行顺序或装置的模块结构不限于本申请实施例提供的执行顺序或模块结构。所述的方法或模块结构的在实际中的装置或终端产品执行时,可以按照实施例或者附图所示的方法或模块结构连接进行顺序执行或者并行执行(例如并行处理器或者多线程处理的环境)。
图2是本申请提出的前端项目构建方法的一种实施例的方法流程图,该方法应用于调度器,如图2所示,本申请提供的前端项目构建方法的一种实施例可以包括:
步骤S201,调度器获取前端项目的入口模块。一般情况下,一个前端项目具有多个入口,一个入口对应一个入口模块。在实际操作中,可基于前端项目的构建需求选择对哪一个入口模块进行后续的分析处理操作。
步骤S202,调度器将入口模块作为当前待处理模块,为其分配一个处理器以执行分析处理操作。上述分析处理操作至少可以包括:查找与当前待处理模块有依赖关系的模块以及反馈当前待处理模块的javascript代码。
之后,调度器将与当前待处理模块有依赖关系的模块均作为当前待处理模块,利用CPU的多核并行处理能力,并行执行上述分析处理操作。重复执行该步骤,直至不再存在具备依赖关系的模块为止。
步骤S203,调度器根据执行完成上述分析处理操作的所有模块的javascript代码以及所有模块之间的依赖关系,生成项目构建文件。
本实施例提供的前端项目构建方法,利用CPU的并行计算能力,对待处理模块并行执行分析处理操作,大大节省了时间。并且,调度器与处理器之间通过异步消息通讯,避免了消息等待过程。从而大大缩短了前端项目构建时间,提高了前端项目构建效率。
为了更好的管理待处理模块,可以建立一个初始为空的模块列表,将入口模块放入模块列表中,此时入口模块的状态是待处理状态。还可以建立一个包含有多个处理器的处理器列表,处理器的状态初始均设置为空闲状态。为了更好的利用CPU的多核并行处理能力,处理器的个数可以设置为与CPU的核数相等。
在此之后,为入口模块分配一个空闲状态的处理器,该处理器对入口模块执行下述分析处理操作:查找与入口模块有依赖关系的模块,并反馈入口模块的javascript代码。在该分析处理操作过程中,处理器的状态设置为忙碌状态,一旦处理器查找到与入口模块有依赖关系的一个模块,便立即将其放入模块列表中,并设置为待处理状态。然后继续查找,直至与入口模块有依赖关系的模块全部查找到。此时,该分析处理操作结束,处理器向调度器反馈入口模块的javascript代码,处理器的状态恢复为空闲状态。
之后,将与入口模块有依赖关系的模块标识为待处理模块,假设与入口模块有依赖关系的模块有A模块、B模块和C模块,则依次为待处理模块(A模块、B模块或者C模块)分配处理器,处理器查找与待处理模块(A模块、B模块或者C模块)有依赖关系的模块,并反馈待处理模块(A模块、B模块或者C模块)的javascript代码。假设与A模块有依赖关系的模块有两个,分别为A1模块和A2模块,则将A1模块和A2模块标识为待处理模块,依次为A1模块或A2模块分配处理器,处理器查找与待处理模块(A1模块或A2模块)有依赖关系的模块,并反馈待处理模块(A1模块或者A2模块)的javascript代码。如此循环,直至查找完所有依赖关系。B模块和C模块同样如此,在此不再重复说明。A模块、B模块和C模块的分析处理操作过程可并行处理,以缩短分析处理时长。
与此同时,模块列表中只要有处于待处理状态的模块(称为待处理模块),便从模块列表中依次调出待处理模块,为其分配空闲状态的处理器,如果此时所有处理器均处于忙碌状态,则等待,直至出现空闲状态的处理器。为了更好的管理模块列表,可以遵循先进先出的原则,先调出最早放入的待处理模块,为其分配处理器。多个处理器对多个待处理模块的分析处理操作可并行进行,从而节约前端项目构建时间。
下面针对处理器对模块的分析处理操作进行详细介绍。图3是本申请提出的前端项目构建方法的一种实施例的方法流程图,该方法应用于处理器,如图3所示,本申请提供的前端项目构建方法的一种实施例可以包括:
步骤S301,接收调度器的操作指令,该操作指令中携带有待处理模块的文件路径。处理器可基于文件路径准确找到待处理模块。
步骤S302,查找与待处理模块有依赖关系的模块。
步骤S303,将查找结果和待处理模块的javascript代码反馈至调度器。调度器可根据该查找结果和javascript代码生成项目构建文件。
本实施例提供的前端项目构建方法,调度器与处理器之间通过异步消息通讯,避免了消息等待过程。从而大大缩短了前端项目构建时间,提高了前端项目构建效率。
由于每个模块的文件类型可能并不相同,因此处理器需要根据待处理模块的文件类型,调用对应类型的解析器对模块文件进行解析,以查找与待处理模块有依赖关系的模块。
模块的文件类型至少有以下三种:js后缀名文件、jsx后缀名文件、ts后缀名文件。如果待处理模块的文件类型是js后缀名文件,则确定对应的解析器为Js解析器,由于该类型模块已经有javascript代码,因此不需要再进行代码解析。如果待处理模块的文件类型是jsx后缀名文件,则确定对应的解析器为Jsx解析器,并编译得到待处理模块的javascript代码;如果待处理模块的文件类型是ts后缀名文件,则确定对应的解析器为Ts解析器,并编译得到待处理模块的javascript代码。
在解析器对待处理模块的文件进行解析时,是将文件分割为多块,依次分析每一块文件内容,从而查找与待处理模块有依赖关系的模块。每查找到一个与待处理模块有依赖关系的模块,便即时通知处理器,以便处理器通过发现依赖消息(FOUND_DEPENDENCY)反馈给调度器,直至所有文件内容全部解析完成。与此同时,对需要进行代码编译的待处理模块进行编译,将待处理模块的javascript代码反馈至处理器,以便处理器通过分析结束消息(ANALYSIS_FINISH)反馈给调度器。基于此,解析器对待处理模块的文件进行解析后,既查找到与待处理模块有依赖关系的所有模块,又得到待处理模块的javascript代码,将查找结果与javascript代码都反馈给处理器,简化了处理流程,节省了时间。
本申请是一个分布式的并行处理方案,主要通过调度器(Dispatcher)和处理器(Worker)来实现。图4是本申请提出的调度器与处理器的体系架构图,如图4所示,一个调度器连接多个处理器,调度器与处理器之间通过异步消息进行交互。为了充分利用CPU的并行处理能力,处理器的个数可以设置为与CPU的核数相等。
下面通过优选实施例和附图对本申请的技术方案进一步详细介绍。
图5是本申请提出的调度器侧的前端项目构建方法的优选实施例的方法流程图,如图5所示,可以包括以下步骤:
步骤S501,调度器维护一个模块列表,初始为空。
步骤S502,调度器维护一个处理器(Worker)列表,Worker的初始数量可以设置为与CPU核数相等,以充分利用CPU的多核并行处理能力。处理器列表中的所有Worker均标记为空闲(Avaliable)状态。
步骤S503,调度器获取项目的一个入口模块。一个项目一般有多个入口,每个入口对应一个入口模块。
步骤S504,调度器将上述入口模块添加到模块列表中,并将其标记为待处理模块。
步骤S505,调度器为待处理模块分配Avaliable状态的Worker。具体包括以下步骤:
步骤S505a,调度器判断模块列表中是否还有待处理模块;如果有,则执行步骤S505b,如果没有,则执行步骤S506。
步骤S505b,调度器从模块列表中取一个最早添加的待处理模块。
步骤S505c,调度器判断处理器列表中是否还有Avaliable状态的Worker;如果有,则执行步骤S505d,如果没有,则执行步骤S506。
步骤S505d,调度器从处理器列表中取一个Avaliable状态的Worker。
步骤S505e,调度器将步骤S505b中的待处理模块分配给步骤S505d中的Worker进行分析处理操作。同时,将该待处理模块标记为“正在处理”状态,将该Worker标记为忙碌(Busy)状态。
步骤S506,调度器判断模块列表里的所有模块是否都是已处理状态;如果是,则执行步骤S508,如果否,则执行步骤S507。
步骤S507,调度器等待Worker的消息。这是一个异步的过程,调度器可能收到的消息包括:
1)FOUND_DEPENDENCY(发现依赖消息)
Worker在对待处理模块进行分析处理操作的过程中,会查找到与该模块依赖的其它模块。Worker不会在查找到所有有依赖关系的模块后再传递给调度器,而是一旦查找到一个有依赖关系的模块,就立即通过FOUND_DEPENDENCY消息告知调度器。调度器会将查找到的这个模块放入模块列表中,然后执行步骤S505。
2)ANALYSIS_FINISH(分析结束消息)
Worker在分析处理操作结束后,会通过ANALYSIS_FINISH告知调度器待处理模块分析结束,同时返回待处理模块的javascript代码。调度器会把该模块标记为“已处理”,把该Worker标记为Avaliable。然后执行步骤S508。
步骤S508,将模块列表里的所有模块进行打包,根据模块之间的依赖关系以及所有模块的javascript代码,生成项目构建文件。
在本实施例中,调度器与处理器之间通过异步消息通讯,并且充分利用CPU的多核处理能力,从而大大提高前端项目构建效率。
图6是本申请提出的处理器侧的前端项目构建方法的优选实施例的方法流程图,如图6所示,可以包括以下步骤:
步骤S601,处理器自身状态标记为Avaliable。处理器初始化不同文件类型的解析器(Loader),至少包括:javascript解析器(JsLoader)、jsx解析器(JsxLoader)、typescript(TsLoader)解析器。
步骤S602,等待调度器(Dispatcher)的消息,这是一个异步的过程,可能收到的消息包括:ANALYSIS_MODULE,该消息会通知处理器有一个待处理模块需要进行分析处理,同时会把待处理模块的文件路径传递过来。Worker通过文件路线确定该待处理模块,之后Worker标记自身状态为Busy。
步骤S603,处理器读取待处理模块的文件内容,判断待处理模块的文件需要哪种解析器进行处理。
如果待处理模块是js后缀名文件,则执行步骤S604a。
如果待处理模块是jsx后缀名文件,则执行步骤S604b。
如果待处理模块是ts后缀名文件,则执行步骤S604c。
步骤S604,调取解析器对待处理模块进行分析处理。具体地:
步骤S604a,将模块文件分为多块内容,Js解析器依次分析每一块内容,如果查找到与待处理模块有依赖关系的模块,则执行步骤S605。然后继续查找,直至查找到与待处理模块有依赖关系的所有模块。在Js解析器分析到文件尾后,执行步骤S606。
步骤S604b,将模块文件分为多块内容,Jsx解析器依次分析每一块内容,如果查找到与待处理模块有依赖关系的模块,则执行步骤S605。然后继续查找,直至查找到与待处理模块有依赖关系的所有模块。同时,Jsx解析器将模块文件的jsx语言转换成javascript语言,从而编译得到待处理模块的javascript代码。在Jsx解析器分析到文件尾后,执行步骤S606。
步骤S604c,将模块文件分为多块内容,Ts解析器依次分析每一块内容,如果查找到与待处理模块有依赖关系的模块,则执行步骤S605。然后继续查找,直至查找到与待处理模块有依赖关系的所有模块。同时,Ts解析器将模块文件的Ts语言转换成javascript语言,从而编译得到待处理模块的javascript代码。在Ts解析器分析到文件尾后,执行步骤S606。
步骤S605,处理器将查找到的与待处理模块有依赖关系的模块,通过FOUND_DEPENDENCY消息传递给调度器。
步骤S606,处理器传递ANALYSIS_FINISH消息给调度器,同时将待处理模块的javascript代码也一并传递。处理器将自身状态设置为Avaliable。
在本实施例中,处理器调用解析器对待处理模块进行分析处理,可以在查找与待处理模块有依赖关系的模块的同时,获取到待处理模块的javascript代码。处理器将查找结果与javascript代码均反馈至调度器,以利于调度器据此生成项目构建文件。从而有效缩短了操作流程,节省了前端项目构建时间。
基于与上述前端项目构建方法相同的发明构思,本申请提供一种前端项目构建装置,应用于调度器,如下面实施例所述。由于该前端项目构建装置解决问题的原理与前端项目构建方法相似,因此该前端项目构建装置的实施可以参见前端项目构建方法的实施,重复之处不再赘述。
图7是本申请所述前端项目构建装置一种实施例的结构示意图,如图7所示,所述装置可以包括:
模块获取单元10,用于获取前端项目的入口模块。模块获取单元10是前端项目构建装置中获取前端项目的入口模块的部分,可以是软件、硬件或二者的结合,例如可以是完成前端项目的入口模块获取功能的接口、处理芯片等元器件。
分配单元12,连接至模块获取单元10,用于将入口模块作为当前待处理模块,为其分配一个处理器以执行分析处理操作;其中,上述分析处理操作包括:查找与当前待处理模块有依赖关系的模块以及反馈当前待处理模块的javascript代码;将与当前待处理模块有依赖关系的模块均作为当前待处理模块,并行执行上述分析处理操作。分配单元12是前端项目构建装置中为模块分配处理器的部分,可以是软件、硬件或二者的结合,例如可以是完成处理器分配功能的接口、处理芯片等元器件。
文件生成单元14,连接至分配单元12,用于根据执行完成上述分析处理操作的所有模块的javascript代码以及所有模块之间的依赖关系,生成项目构建文件。文件生成单元30是前端项目构建装置中生成项目构建文件的部分,可以是软件、硬件或二者的结合,例如可以是完成文件打包构建功能的接口、处理芯片等元器件。
本实施例提供的前端项目构建装置,利用CPU的并行计算能力,大大节省了时间。调度器与处理器之间通过异步消息通讯,避免了消息等待过程。从而大大缩短了前端项目构建时间,提高了前端项目构建效率。
为了更好的管理待处理模块,本实施例提供了一种优选实施方式,即上述装置还可以包括:模块列表建立单元,用于建立初始为空的模块列表,将入口模块放入模块列表中。处理器列表建立单元,用于建立处理器列表;其中,处理器列表中的处理器状态初始为空闲状态,处理器的个数与CPU的核数相等。
上述装置还可以包括:状态设置单元,用于将执行分析处理操作的处理器的状态设置为忙碌状态;将执行完成分析处理操作的处理器的状态设置为空闲状态。从而准确掌握处理器的状态,便于分配单元12的分配工作的准确性和时效性。
基于与上述前端项目构建方法相同的发明构思,本申请提供一种前端项目构建装置,应用于处理器,如下面实施例所述。由于该前端项目构建装置解决问题的原理与前端项目构建方法相似,因此该前端项目构建装置的实施可以参见前端项目构建方法的实施,重复之处不再赘述。
图8是本申请所述前端项目构建装置一种实施例的结构示意图,如图8所示,所述装置可以包括:
指令接收单元20,用于接收调度器的操作指令;其中,上述操作指令中携带有待处理模块的文件路径;指令接收单元20是前端项目构建装置中接收调度器的操作指令的部分,可以是软件、硬件或二者的结合,例如可以是完成指令接收功能的接口、处理芯片等元器件。
处理单元22,连接至指令接收单元20,用于查找与上述待处理模块有依赖关系的模块;处理单元22是前端项目构建装置中查找依赖关系的部分,可以是软件、硬件或二者的结合,例如可以是完成查找功能的接口、处理芯片等元器件。
反馈单元24,连接至处理单元22,用于将查找结果和上述待处理模块的javascript代码反馈至上述调度器;其中,上述查找结果和上述javascript代码用于生成项目构建文件;反馈单元24是前端项目构建装置中查找结果和javascript代码反馈的部分,可以是软件、硬件或二者的结合,例如可以是完成信息反馈功能的接口、处理芯片等元器件。
本实施例提供的前端项目构建装置,利用CPU的并行计算能力,对待处理模块并行执行分析处理操作,大大节省了时间。调度器与处理器之间通过异步消息通讯,避免了消息等待过程。从而大大缩短了前端项目构建时间,提高了前端项目构建效率。
由于每个模块的文件类型可能并不相同,因此处理器需要根据待处理模块的文件类型,调用对应类型的解析器对模块文件进行解析,以查找与待处理模块有依赖关系的模块。基于此,本实施例提供了一种优选实施方式,图9是本申请所述处理单元一种实施例的结构示意图,如图9所示,上述处理单元22可以包括:类型确定模块220,用于确定与上述待处理模块的文件类型相对应的解析器;调用模块222,连接至类型确定模块220,用于调用上述解析器对上述待处理模块的文件进行分析,以查找与上述待处理模块有依赖关系的模块。
上述类型确定模块可以包括:第一子模块,用于在上述待处理模块的文件类型是js后缀名文件的情况下,确定对应的解析器为Js解析器;或者,第二子模块,用于在上述待处理模块的文件类型是jsx后缀名文件的情况下,确定对应的解析器为Jsx解析器,并编译得到上述待处理模块的javascript代码;或者,第三子模块,用于在上述待处理模块的文件类型是ts后缀名文件的情况下,确定对应的解析器为Ts解析器,并编译得到上述待处理模块的javascript代码。
图10是本申请所述反馈单元一种实施例的结构示意图,如图10所示,上述反馈单元24可以包括:第一反馈模块240,用于在查找到与上述待处理模块有依赖关系的模块之后,即时通过发现依赖消息向上述调度器反馈当前查找结果,直至查找到与上述待处理模块有依赖关系的所有模块;第二反馈模块242,连接至第一反馈模块240,用于将上述待处理模块的javascript代码通过分析结束消息反馈至上述调度器。基于此,处理器在向调度器反馈查找到的与待处理模块有依赖关系的所有模块的同时,又向调度器反馈待处理模块的javascript代码,简化了处理流程,节省了时间。
基于与上述前端项目构建装置相同的发明构思,本申请提供一种前端项目构建系统。图11是本申请所述前端项目构建系统一种实施例的结构示意图,如图11所示,所述系统可以包括:应用于调度器的前端项目构建装置,以及应用于处理器的前端项目构建装置。其中,调度器与多个处理器之间通过异步消息进行交互。从而节省处理时间,提高前端项目构建效率。
本申请可以依托于nodejs平台来实现,跟现有方案相比,本申请技术方案在保持webpack功能的同时,极大地提高构建过程的速度。
虽然本申请提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的劳动可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的装置或客户端产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行(例如并行处理器或者多线程处理的环境)。
上述实施例阐明的装置或模块,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。为了描述的方便,描述以上装置时以功能分为各种模块分别描述。在实施本申请时可以把各模块的功能在同一个或多个软件和/或硬件中实现。当然,也可以将实现某功能的模块由多个子模块或子单元组合实现。
本申请中所述的方法、装置或模块可以以计算机可读程序代码方式实现控制器按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC 625D、Atmel AT91SAM、MicrochipPIC18F26K20以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内部包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
本申请所述装置中的部分模块可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构、类等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的硬件的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,也可以通过数据迁移的实施过程中体现出来。该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,移动终端,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。
本说明书中的各个实施例采用递进的方式描述,各个实施例之间相同或相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。本申请的全部或者部分可用于众多通用或专用的计算机系统环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、移动通信终端、多处理器系统、基于微处理器的系统、可编程的电子设备、网络PC、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。
虽然通过实施例描绘了本申请,本领域普通技术人员知道,本申请有许多变形和变化而不脱离本申请的精神,希望所附的权利要求包括这些变形和变化而不脱离本申请的精神。