具体实施方式
在下面的描述中,为了解释的目的,提出许多具体细节以提供对本发明的透彻理解。然而,很明显,本发明能够在没有这些具体细节的情况下实施。在其他例子中,公知的结构和设备以框图形式显示,以避免不必要地模糊本发明。
总体概述
提供了一种用于路由处理器的技术,其使用加载在单页应用(SPA)环境中的动态路由和依赖项。路由处理器是当SPA加载在客户端设备上时启动的进程。该路由处理器可能最初不可访问用户可能请求的至少某些路由。该路由处理器最终接收了请求,其包含与依赖项信息关联的路由,路由与依赖项均不可在客户端设备获得。代替显示请求路由对路由处理器未知的错误信息,路由处理器引起请求的路由发送至服务器,服务器用所请求的路由和所请求的路由的依赖项信息做出响应。
系统概述
图1是描述了在实施例中用于在客户端设备上处理路由请求的示例系统100的框图。系统100包含客户端设备110、网络120、和服务器130。虽然在系统100中只描述了一个客户端设备110,但系统100可包含很多客户端设备。类似的,虽然在系统100中只描述了一个服务器130,但系统110可包含多个支持客户端设备110的服务器。例如,如果服务器130出故障或超载,那么来自客户端设备110的请求能够重定向至另一台可以响应这些请求的服务器。
客户端设备110的例子包含便携式电脑、平板电脑、智能手机和台式电脑。客户端设备110包含在其上执行的主机应用112。主机应用112的一个例子是构成为接受(作为输入)许多不同域的网址(URLs:Uniform Resource Locators)的网页浏览器,与一个或多个域名服务器(DNSs:Domain Name Servers)通信以查找URLs的IP地址,并和与IP地址相关联的网页服务器通信。网页浏览器的例子包含Chrome、Firefox、Safari和InternetExplorer。另一个主机应用112的例子是客户端侧应用,例如移动应用,其构成为与能够由多个web服务器支持的单一web域通信。
网络120能够通过提供在客户端设备110与服务器130之间的数据交换的任何介质或装置实现。网络120的例子包含但不限于例如局域网(LAN)、广域网(WAN)、以太网或英特网,或一个或多个陆地、卫星、或无线链路的网络。
服务器130是一个组件,其构成为处理和响应来自主机应用112的请求和在其他客户端设备上执行的主机应用112的其他实例(图1中未描绘)。例如,响应于来自主机应用112的请求,服务器130提供主机应用112进行处理以在主机应用112中加载和执行单页应用114的文档和数据(用于单页应用114)。
服务器130存储或可访问路由-模块关联数据132,该路由-模块关联数据132将路由(完整的URLs或URL片段)与数据文档相关联。一个或多个数据文档的集合对应于SPA114基于处理相应的数据文档生成的模块。例如,该关联数据可关联(1)路由“/profile/”与用于生成简档模块(或子-应用)的数据文档,(2)路由“/search/”与用于生成搜索模块的数据文档,以及(3)路由“/mail/”与用于生成邮件模块的数据文档。每个模块允许客户端设备110的用户启动确定的动作。例如,简档模块可允许用户观查看用户简档,编辑用户简档,并且分享用户简档。类似的,搜索模块可允许用户启动社交网络的搜索,编辑之前的搜索,和保存搜索结果。类似的,邮件模块可允许用户查看所有用户的电子消息,查看满足确定标准的电子消息,并创建、发送、回复、和转发电子消息。
模块的数据文档的例子包含JavaScript文档和层叠样式表(CSS:CascadingStyle Sheet)文档。单一模块的数据文档也可包含一个或多个HTML文档。如果单一模块与多个路由相关联,则每个路由相对应于单一web文档。例如,简档模块能够与路由“/profile/view/”、“/profile/edit/”、和“/profile/share/”相关联。因此,相同的JavaScript文档和CSS文档能够用于生成三个不同路由的网页,但是三个不同的HTML文档(即,三个路由中的每一个路由一个HTML文档)能够与简档模块相关联。当选择相应的路由查看时,使用不同的HTML文档生成网页。
服务器130能够在软件、硬件或软硬件组合中实现。服务器130能够在单一计算设备或多个计算设备上实现。
主机应用112从服务器130提交了对数据的请求(例如,HTTP)。该请求可以由在主机应用112的文本字段中输入URL,并提供输入(例如,选择键盘上的键或语音输入)的用户启动。或者,该请求能够通过用户选择在客户端设备110上显示的图形图标来启动。该请求通过网络120传输至服务器130。作为答复,服务器130发送HTML和其他数据源,例如JavaScript文档和CSS文档,至客户端设备110。
响应于接收HTML和其他数据源,SPA 114基于典型地作为依赖项加载步骤的一部分被加载的模块-具体模板文档而创建文档对象模型(DOM:Document Object Model)。SPA114启动路由处理器116,这是构成为接收和处理路由请求,并根据特别的路由请求加载适当的模块的进程。在多页应用中,该路由处理器在服务器上实现,而不是在提交路由请求的客户端上实现。
路由请求表明是URL的片段的路由,例如“/search/”、“/profile/”、或“/mail/”。另外,路由能够是完整的URL,例如“http://www.linkedin.com/search/”。路由请求能够基于来自用户的输入启动。例如,该输入能够是用户选择的与特别路由相关联的链接或按钮。如另一个例子,该输入可以是用户选择在键盘上的多个键,该键可以是实物的或图形的。或者,路由请求能够自动启动。例如,如果基于在显示特别网页时经常选择特别路由(例如,“/mail/”)的用户选择历史,该用户更可能选择那个特别路由,那么SPA114自动启动该路由请求。
示例进程
图2是描述了在实施例中用于在客户端设备上处理路由请求的示例进程200的流程图。进程200在客户端设备110上进行。
在块210,路由处理器116由SPA 114启动。路由处理器116能够启动以响应于加载在在主机应用112的数据文档(例如JavaScript文档和CSS文档)和SPA 114开启。最初,路由处理器116可能不可访问一个或多个可供用户选择的路由。此外,客户端设备110不能存储任何用于在主机应用112中运行模块的依赖项信息(与一个或多个路由相关联)。
在块220,路由处理器116接收表明特别路由的路由请求。该路由请求能够基于用户与SPA 114交互而从SPA114接收,交互为例如在客户端设备110的屏幕上显示的按钮或链接的选择。
在块230,路由处理器116决定该特别路由不匹配由路由处理器116保持的任何在路由列表中的路由。路由处理器116可只保持单一的路由列表。最初,该路由列表可能是空的。在路由列表中没有请求的路由表明当前加载的模块(例如,SPA 114最初或另一个模块)不能处理该请求的路由。
在块240,路由处理器116引起服务器请求通过网络120发送至服务器130。该服务器请求能够是HTTP请求并且可包括完整的URL。例如,当该路由请求能够是URL片段(例如,“/search/”),该服务器请求能够是整个相关联的URL(“http://www.linkedin.com/search/”)。
在块250,路由处理器116从服务器130接收一个或多个路由和一个或多个依赖项的集合,例如JavaScript文档、CSS文档、和图像,用于相对应于请求的路由的模块。模块被设计成单机应用。使用模块作为应用体系结构的一部分提供了许多优点,例如减少主应用的大小,将相关功能封装到单个模块中,在能够将单一模块加载到不同的主机应用方面的可重用性,并且将第三方模块集成到主应用中。
如果从块250中的服务器130接收了多个路由,则多个路由中的一个或多个能够是请求的路由的“子”路由。例如,如果该请求的路由是“/profile/”,则连同请求的路由从服务器130接收的另外的路由能够是“/profile/edit”、“/profile/view”、和“/profile/share”。这样的“子”路由可能或可能不与另一模块相关联。因此,能够服务请求的路由“/profile/”的相同的模块也能够服务请求的路由“/profile/edit/”。
块250也涉及将请求的路由和任何其他路由,例如该请求的路由的子路由插入路由处理器116保留的路由列表。如果当路由处理器116引起服务器请求发送时(在块240中)该路由列表不为空,,则该路由列表在插入从服务器130接收的路由之前能够被清空。
在块260,响应于接收该请求的路由,该请求的路由被重新触发,该步骤涉及路由处理器116识别在路由列表中的请求的路由。
在块270,与请求的路由相关联的模块的合适的依赖项被识别并被加载至SPA114。块270能够通过主机应用112实现。每个模块(或子-应用)包括处理(同时加载)任何未来路由请求的分离路由处理器。因此,路由处理器116不再是当前路由处理器,除非再加载其相关联的模块或应用。
在块280,该加载的模块处理该请求的路由并基于该请求的路由在客户端设备110的屏幕上显示适当的数据。例如,如果请求的路由是“/profile/”,则加载用于客户端设备110显示用户的简档信息的模块。块280也可包括SPA 114,或加载的模块,如果web内容没有事先下载至块250中的客户端设备110,则从服务器130检索web内容。
未知路由
如之前关于块230描述的,用户可能会启动在路由处理器的路由列表中找不到的请求的路由。此处提到的这样的路由为“未知路由”。要处理这样的场景,SPA的典型实现包含在路由处理器的路由列表中的通配符路由。如果该请求的路由不匹配在路由列表中的任何其他路由,则该通配符路由能够是作为全能性的“/*”。该通配符路由能够与函数调用或消息显示有关,例如“404()”,表明该路由处理器调用404错误函数,引起对用户显示错误消息。未知路由调用错误函数。如果路由处理器以特别顺序扫描其路由列表,则该通配符路由能够放置在路由列表的末尾,以确保如果该请求的路由是未知的,则只调用错误函数。
在实施例中,代替将错误函数与通配符路由相关联,而是将寻径函数与通配符路由相关联。因此,如果该请求的路由未知(例如,如果在路由处理器116到达该通配符路由之前,该请求的路由没有在路由列表中找到),则路由处理器116调用该寻径函数(此处提及为“通配符寻径函数”)。该通配符寻径函数决定是否有任何模块或子-应用在主机应用112中映射至请求的路由。如果有,则该通配符寻径函数为请求的路由加载依赖项。否则,该通配符寻径函数引起服务器请求(包含该请求的路由)通过网络120传递至服务器130。
如果路由出现在路由列表中,则意味着那个路由的那个依赖项信息可能已经加载或存储在客户端设备110中。然而,该通配符寻径函数逻辑无论如何都能够在路由中执行。
服务器130从客户端设备110接收请求的路由,识别与请求的路由相关联的数据文档(例如,使用路由-模块关联数据132),并发送数据文档至客户端设备110。该数据文档包含用于初始化和执行在SPA114中的模块并显示web内容的数据文档。该数据文档可包含JavaScript文档、CSS文档、和/或HTML文档。
随后的路由请求
如前所述,路由处理器116可响应于包含未知路由的单一服务器请求而接收多个路由。例如,未知路由能够是路由“/profile/”,并且服务器130可通过也发送路由“/profile/edit/”、“/profile/view/”、和“/profile/share/”回复表明路由“/profile/”的服务器请求。路由处理器116包含在其路由列表中的附加路由。随后,合适的模块被加载在SPA114中之后,用户可启动一个或多个附加的路由请求。附加的请求的路由可匹配路由处理器116最近接收的路由之一。继续举例,该下一个请求的路由能够是“/profile/edit/”,表明用户希望编辑他的/她的简档。该当前加载的模块能够构成为处理该请求的路由。然而,该当前加载的模块可能需要将与请求的路由相关联的web内容的请求(例如,HTML文档)发送至服务器130。因此,当单一模块的实例能够用于处理多个路由时,多个路由中的每一个能够与不同的组的网页内容,例如HTML文档相关联。
删除模块
在某些情况下,加载的模块不构成为处理请求的路由。例如,如果简档模块是当前加载的,并且用户请求只能由搜索模块服务的路由,则该搜索模块需要被加载。
在实施例中,加载的模块被删除(或卸载),以响应于决定(1)该加载的模块不能服务请求的路由和/或(2)该请求的路由还未被加载。例如,响应于请求的路由“/profile/”而被加载的模块不能服务请求的路由“/mail/”,当该路由通过合适的模块服务时,允许用户访问已寻址并发送至用户账户的一组电子信息(例如,即时消息或邮件消息)。该当前加载的“profile”模块可能不构成为提供关于用户的电子消息的信息。
该第一决定(即加载的模块不能服务请求的路由)能够通过加载的模块做出,并且该第二决定(即该请求的路由还未被加载)能够通过路由处理器116做出。
删除加载的模块可涉及删除在运行时间环境中执行的模块实例,并且解除分配用于存储通过模块生成的实例、变量和数据的内存。删除加载的模块还可涉及删除所有用于生成该模块实例的数据文档(例如,JavaScript文档和CSS文档)。
客户端侧缓存
在将特别模块的数据文档下载到客户端设备110之后,SPA114将特别模块的实例加载进运行时间环境。如果不再需要该特别模块的实例(例如当接收的另一请求的路由要求不同的模块),则SPA114可引起该实例(连同实例的其他工件(artifacts)例如搜索结果)从运行时间环境被删除。这样,SPA 114的内存占用保持相对较小。
然而,在实施例中,即使特别模块的实例被删除了,主机应用112包含缓存功能,利用缓存功能使与该模块相关联的数据文档缓存在客户端设备110上。因此,如果随后请求与特别模块相关联的路由,则该特别模块的数据文档已经存储在客户端设备110上。因此,避免与服务器130往返来检索合适的数据文档。
预取
在实施例中,保留表明先前请求的一个或多个路由的请求的路由历史数据(或简化为“历史数据”)。历史数据能够存储于客户端设备110或通过服务器130存储。
历史数据还能够表明一个或多个路由被请求的次数和/或时间。例如,该历史数据可表明路由“/profile/”被选择了五次,并且最后一次选择路由“/search/”是一天前。
通过分析历史数据,SPA114(或服务器130)可决定一个或多个特别路由(和它们关联的依赖项信息)应当在路由处理器116接收到与一个或多个特别路由匹配的请求的路由之前发送至客户端设备110。在从用户接收请求的路由之前发送路由数据和依赖项数据在此被称为“预取”。例如,如果用户几乎总是在加载SPA114之后先选择路由“/search/”,则SPA114(或服务器130)可在用户选择那个路由之前决定请求(或传输)路由“/search/”和其依赖项信息。以这种方式,当该用户最终选择那个路由时,创建搜索模块的实例所需要的依赖项信息可能已经存储在客户端设备110上了。
优点
在此的实施例的一个优点是,SPA的模块(或子应用)的开发者可开发模块,而不需要任何SPA的其他模块的知识。因此,避免了在潜在的许多不同的开发团队之间管理单一大型路由。这里的实施例的另一个优点是,SPA有小得多的内存占用空间,因为当SPA被下载时路由和与这些路由相关联的依赖项信息不需要立即下载。相反,在SPA中执行的模块的数据文档在需要时下载。
硬件概述
根据一个实施例,此处描述的技术由一个或多个专用计算设备实现。该专用计算设备能够被硬连线以执行技术,或可包含数字电子设备例如一个或多个专用集成电路(ASICs:Application-Specific Integrated Circuits)或持续编程以执行技术的可编程逻辑门阵列(FPGAs:Field Programmable Gate Arrays),或可包含一个或多个通用硬件处理器,其被编程以其按照在固件、内存、其他存储器、或组合中的程序指令执行技术。这样的专用计算设备也可将自定义的硬连线逻辑、ASICs、或FPGAs与自定义编程结合来完成技术。该专用计算设备能够是台式计算机系统、便携式计算机系统、手持设备、网络设备或任何其他包含硬连线和/或程序逻辑来实现技术的设备。
例如,图3是说明计算机系统300的框图,在该系统上能够实现本发明的实施例。计算机系统300包含总线302或其他用于通信信息的通信机构,和用于处理信息的与总线302耦合的硬件处理器304。硬件处理器304能够是例如通用微处理器。
计算机系统300也包含主存储器306,例如随机存取存储器(RAM:Random AccessMemory)或其他动态存储设备,其耦合到总线302用于存储通过处理器304执行的信息和指令。主存储器306也能够用于在执行通过处理器304执行的指令期间存储临时变量或其他中间信息。当这样的指令存储在处理器304可访问的非临时存储介质中时,使计算机系统300成为专用机器,该机器被自定义以执行指令中规定的操作。
计算机系统300还包含只读存储器(ROM:Read Only Memory)308或其他静态存储设备,其耦合至总线302,用于存储用于处理器304的静态信息和指令。提供存储设备310,例如磁盘或光盘,并耦合至总线302,用于存储信息和指令。
计算机系统300能够通过总线302耦合至显示器312,例如阴极射线管(CRT:Cathode Ray Tube),用于向计算机用户显示信息。包含字母数字和其他按键的输入设备314耦合到总线302,用于向处理器304发送通信信息和命令选择。另一种类型的用户输入设备是光标控制器316,例如鼠标、轨迹球、或光标方向键,用于将方向信息和命令选择传递至处理器304并且控制光标在显示器312上移动。该输入设备典型地在第一轴线(例如x)和第二轴线(例如y)这两个轴线上具有两个自由度,允许该设备在平面中指定位置。
计算机系统300可使用定制的硬连线逻辑、一个或多个ASICs或FPGAs、固件和/或程序逻辑来实现在此描述的技术,上述技术与计算机系统相结合引起或编程计算机系统300成为专用机。根据一个实施例,通过计算机系统300执行在此的技术以响应于处理器304执行一个或多个包含在主存储器306中的指令的一个或多个序列。这样的指令能够从例如存储设备310的其他存储介质读入主存储器306。包含在主存储器306中的指令序列的执行引起处理器304执行在此描述的处理步骤。在另一实施例中,能够使用硬连线电路代替软件指令或与软件指令相结合。
该在此使用的术语“存储介质”指代任何非临时介质,该非临时介质存储引起机器以特别方式运行的数据和/或指令。这样的存储介质可包括非易失性介质和/或易失性介质。非易失性介质包含例如光盘或磁盘,例如存储设备310。易失性介质包含动态存储器,例如主存储器306。存储介质常见形式包含例如软盘、磁盘、硬盘、固态硬盘、磁带,或任何其他磁性数据存储介质,CD-ROM、任何其他光学数据存储介质、任何带有洞的样式的物理介质、RAM、PROM和EPROM、FLASH-EPROM、NVRAM、任何其他存储芯片或胶卷(cartridge)。
存储介质不同于传输介质但是能够与传输介质的结合使用。传输介质参与在存储介质之间传输信息。例如,传输介质包含同轴电缆、铜线和光纤,包含包括总线302的线缆。传输介质也可采取声波或光波形式,例如在无线电波和红外线数据通信中产生的那些声波或光波。
介质的各种形式可能涉及携带一个或多个指令的一个或多个序列至处理器304以供执行。例如,该指令可最初携带至远程计算机的磁盘或固态驱动器。该远程计算机可将指令加载到其动态存储器中,并使用调制解调器将指令通过电话线发送。至计算机系统300的本地调制解调器可接收电话线上的数据并使用红外线发射器将数据转换成红外信号。红外线检测器可接收红外线信号携带的数据,并且合适的电路可将数据放置在总线302上。总线302将数据携带至供处理器304检索并执行指令的主存储器306。通过主存储器306接收的指令可选择地在通过处理器304执行之前或之后存储在存储设备310上。
计算机系统300也包含与总线302耦合的通信接口318。通信接口318提供双向数据通信,与连接至本地网络322的网络链路320耦合。例如,通信接口318能够是综合业务数字网(ISDN:Integrated Services Digital Network)卡、电缆调制解调器、卫星调制解调器、或向对应类型的电话线提供数据通信连接的调制解调器。作为其他例子,通信接口318能够是提供数据通信连接至兼容的局域网(LAN:Local Area Network)的局域网卡。无线链路也能够被执行。在任何这样的执行中,通信接口318发送和接收携带代表不同类型信息的数字数据流的电气、电磁或光信号。
网络链路320典型地通过一个或多个网络向其他数据设备提供数据通信。例如,网络链路320可通过本地网络322向主机计算机324或向通过英特网服务提供者(ISP:Internet Service Provider)326操作的数据装置提供连接。ISP326转而通过现在通常被称为“英特网”328的全球分组数据通信网提供数据通信服务。本地网络322和英特网328均使用携带数字数据流的电气、电磁或光信号。通过多个网络的信号,在网络链路320上并通过通信接口318(将数字数据携带到或出计算机系统300)的信号,构成传输介质的例子。
计算机系统300可通过网络、网络链路320和通信接口318发送消息和接收数据,包含程序代码。在英特网的例子中,服务器330可以通过Internet328、ISP 326、本地网络322和通信接口318传输用于应用程序的请求的代码。
接收到的代码当被接收时能够通过处理器304处理,和/或存储在存储设备310中,或其他非易失性存储器中用于之后执行。
在前述说明书中,参照许多具体细节描述了本发明的实施例,这些细节可根据实现方式而变化。该说明书和附图因此被认为是具有说明性的而不是限制性的意义。本发明的范围和申请人所预期的本发明的范围的唯一和排他性指标,是本申请发布的权利要求的集合的字面上和等价范围,本申请中这类权利要求采用的具体形式发布,包含任何后续修正。