Uber开源内部使用的通用网页开发框架Fusion.js

Uber开源其内部使用的网页框架Fusion.js,该框架能够简化网页开发并产出轻量高性能的应用程序,支援React和Redux等热门函式库,也提供热模组重载、资料感知服务器端渲染与捆绑拆分等先进功能。而且用Fusion.js开发的应用程序为通用架构,具单一入口档案,且可以在服务器与浏览器上重复使用程式码。
Uber开发了数百个网页应用程序,其中许多是用于内部管理业务的,而部分是对外面向公众的,为了让数百名工程师都能在同样的技术基础上,开发最佳实践应用程序,Uber网页平台团队建构了Fusion.js,除了提供高品质的框架与先进功能外,也可以同时保持网页平台的动态特性,简化开发并产生高效能网页应用程序。
官方提到,Fusion.js适合那些想要寻找开源样板来建置现代与非平凡(Non-trivial)网页应用程序的开发者。除了提供预先配置好的最佳化样板外,Fusion.js提供基于套件的灵活架构,同样适用于依赖复杂服务层的单一页面或是网页应用程序,可以建置像是追踪日志、量测仪表板等监控应用,以及单元测试等功能。
由于Fusion.js应用程序是通用架构,因此应用程序具有单一入口档案,并且能够在服务器与浏览器上重复使用程式码。在通用的应用程序中,React元件也能提取资料并在服务器上渲染成HTML,以减少浏览器载入页面的时间,避免JavaScript DOM API造成的额外成本。
单一入口架构使得Fusion.js的插件本身也具有通用性,但并非是指程式码执行的环境,而是允许套件开发者对共同使用的函式库程式码片段定位。另外,套件可以透过中介软件存取HTTP请求生命周期,也可以存取React Tree以新增Provider元件。
Uber提到,他们近几年遇到的其中一个开发挑战,便是在热门的HTTP服务器函式库Express中的API,其存在缺点使得复杂的回应转换难以封装与测试。对于Uber以前的架构,应用程序开发者经常需要以猴子修补法,临时维护Express的请求与回应物件,久而久之,程式码越来越凌乱,复杂相互影响的子系统,让测试变得困难。
Uber现在采用了中介软件Koa来解决这个问题,以补足Fusion.js的设计不足,使其拥有更加友善的Context-based API单元测试方法。Koa为React Provider元件提供了逻辑整合点,上游与下游抽象与React服务器渲染的内容生命周期同步,网络带来的副作用与应用程序脱勾后,增加了可测试性。
除了支援Jest、Enzyme和Puppeteer等JavaScript现代测试工具外,Fusion.js也为开发人员提供了测试套件的工具,fusion-test-util软件包允许模拟服务器,因此开发者可以快速的模拟套件与模拟器间任意的组合。
