Uber 宣布开源 Fusion.js https://eng.uber.com/fusionjs/ , 这是一个 "基于插件的通用 web 框架". 在发布说明中, Uber 的高级软件工程师 Leo Horie 说到, Uber 已经构建了上百个基于 Web 的应用, 随着 Web 技术的快速变化和最佳实践的持续演化, 让数百位 Web 工程师充分利用现代语言的特性, 同时还要跟上 Web 平台的动态化发展确实是一项很大的挑战. 而 Fusion.js 就是 Uber 为该问题所给出的解决方案.
在评估框架的时候, 很关键的一点就是要理解框架的目标和目的, 从而决定某个框架是否适合构建你的应用. Horie 是这样描述 Uber 的现状的:
需要改造陈旧的单体 Web 框架, 解决数年的技术债所带来的挑战. 但是, 我们还希望让工程师能够继续使用他们所热爱的技术 (如 React 和 Redux), 同时保持与 Uber 的应用健康监控基础设施的兼容性.
为了达成这一目标, Fusion.js 能够解决 Uber 团队所识别出的如下痛点:
在服务器端渲染, 代码拆分和模块热加载时, 使用的工具需要配置以及样板代码
抽象服务端渲染时所面临的挑战
大型代码库的耦合
当出现副作用时的测试
单体框架的灵活性
Uber 团队在与已有的解决方案进行协同工作时遇到了挑战, 在集成国际化和其他特性时也困难重重. Fusion.js 还有一个主要目标就是避免单体的方式, 从而保持 bundle 文件的体积比较小.
Horie 这样向工程师们推荐 Fusion.js:
Fusion.js 是一个基于 MIT 许可证的 JavaScript 框架, 支持 React 和 Redux 等流行库, 并提供了很多现代特性, 如模块热加载, 数据感知服务器端渲染和对 bundle 拆分的支持.
Fusion.js 应用重点强调的特点是通用性和基于插件. Fusion.js 有一个入口点文件, 使得它能够在服务器端和客户端重用代码. Fusion.js 的插件是通用的, 这样的话就能让开发人员很容易实现类似的功能.
除了 React 和 Redux 之外, Fusion.js 还利用 Flow https://flow.org/ 实现类型安全并使用 Koa https://koajs.com/ 进行中间件管理. Fusion.js 支持像 Jest,Enzyme 和 Puppeteer 这样的测试工具, 同时还为开发人员 提供了工具 https://github.com/fusionjs/fusion-test-utils , 以便于借助 fusion-test-utils 包来测试插件.
插件架构以及避免单体架构风格似乎在一定程度上与 JavaScript 最近的发展趋势背道而驰, 最近的趋势是单个包 (monopackage). 随着 ES 模块的广泛采用并且有 webpack 这样的工具来处理代码的分割, 我们比以往更容易减少 bundle 的大小, 而且无需将所有的包分离开来. 但是, Uber 所强调的更小的 bundle 体积是对其工程团队在构建复杂 Web 应用时所面临挑战的直接回应.
这个项目的最初反馈毁誉参半, 有些工程师质疑为何采用 Flow 而不是 TypeScript, 有些人则不明白为何还需要另外一个框架. 现在判断 Fusion.js 是否能够在 Uber 之外得到关注还为时尚早, 但是看到有这样的组织发布对他们有益的基础设施还是很令人鼓舞的.
Fusion.js 可以基于 MIT 许可证获取, 他们鼓励工程师通过 GitHub https://github.com/fusionjs/ 为该项目做出贡献.
来源: http://www.tuicool.com/articles/iaayYrU