According to the company, it creates a lot of web applications for both internal and public uses, but recognized that keeping up with the changing web technologies was a challenge. The company set out to create a web framework that would address the challenges associated with overcoming a multi-year accrual of technical debt.
It wanted to address the following areas with this framework:
- Complex configuration and the necessary boilerplate of multiple tools needed for things such as server-side rendering, code splitting, and hot module reloading.
- Lack of abstractions for implementing features involving different aspects of server-rendered React applications.
- Brittleness as a result of tight coupling of code located in different places.
- Testing difficulties that are a result of side effects and singletons.
- Lack of flexibility in a monolithic framework.
Some existing solutions do address some of those challenges, but implementing a library on top of a framework requires changes to multiple unrelated files, the company explained. Additionally, a lot of application-specific code depends on libraries that manage side effects, making it difficult for an engineer to integrate such a library in a way that is testable without the help of a service layer abstraction.
By creating a modular framework instead of a monolithic one, bundles can be kept small. It also forces developers to be explicit about dependencies, making it easy to avoid common sources of technical debt.
“Within Uber, there are already more than 60 repositories using Fusion.js since its internal release. We expect this number to increase rapidly due to a combination of new web projects and automated migration of older projects to Fusion.js. Given this demand, improvements at the framework level should significantly improve the software quality baseline for these projects,” Leo Horie, senior software engineer at Uber, wrote in a post.