Apresentando o Fusion.js: um framework web open source baseado em plug-in

0

O Fusion.js, o novo framework web da Uber, suporta recursos e integrações modernas que facilitam a criação de aplicativos leves e de alto desempenho para a web.

De acordo com a empresa, o framework web ajuda na criação de aplicativos da Web para usuários internos e públicos, tendo em mente os desafios da mudança de tecnologias da web. O Fusion.js abordará os seguintes problemas:

  • Configuração complexa relacionada ao clichê necessário de várias ferramentas que são necessárias para renderização no lado do servidor, recarregamento de módulos e divisão de código.
  • A falta de abstrações para implementar recursos que envolvem aplicativos React renderizados pelo servidor. (ou seja, abrangendo servidor e cliente, lidando com serialização / hidratação, comunicação servidor-cliente etc.)
  • Fragilidade devido a um acoplamento rígido de código localizado em lugares diferentes.
  • Teste de dificuldades decorrentes de efeitos colaterais e singletons.
  • Falta de flexibilidade de um quadro monolítico

Embora as soluções existentes abordassem alguns desses desafios, descobrimos que a utilização de uma biblioteca frente à um framework exigia alterações em vários arquivos não relacionados. Por exemplo, suportar o Redux em um aplicativo renderizável pelo servidor envolve adicionar código de configuração em algum lugar nos arquivos relacionados ao servidor, código semelhante em algum lugar no navegador, alteração no modelo HTML, um componente React Provider, etc. E isto ocasionava queda de performance a aumento de complexidade na hora de construir aplicações web.

Outra razão pela qual preferimos uma abordagem modular sobre nossa abordagem monolítica existente é que ela nos força a ser explícitos sobre dependências, o que torna mais fácil evitar fontes comuns de dívida técnica, como objetos de Deus (God objects), interfaces internas ad-hoc e acoplamento rígido.

Quem deve usar o Fusion.js?

O Fusion.js é uma boa opção para quem procura um framework de código aberto para criar um aplicativo da web moderno e não trivial.

Resumidamente, o Fusion.js é uma estrutura JavaScript licenciada pelo MIT que oferece suporte a bibliotecas populares como React e Redux, e vem com recursos modernos como recarregamento de módulo quente, renderização do lado do servidor com reconhecimento de dados e suporte a divisão de pacote. Para mais informações sobre os benefícios do Fusion.js, confira a documentação.

De acordo com a empresa, “os aplicativos Fusion.js são universais, o que significa que os aplicativos têm um único arquivo de ponto de entrada e é possível reutilizar o código no servidor e no navegador. Em aplicativos universais, os componentes do React também podem buscar dados e renderizar HTML no servidor, melhorando assim o tempo de carregamento da página no navegador, aproveitando o analisador HTML nativo do navegador e evitando a sobrecarga da API DOM do JavaScript. ”

Figura 1. Os plug-ins do Fusion.js encapsulam a lógica com base em seu agrupamento lógico, em vez de se basear em onde o código precisa ser incluído.

Os plug-ins usam a injeção de dependência, o que significa que eles podem expor APIs bem definidas como serviços para outros plug-ins, e as dependências de um plug-in podem ser facilmente ridicularizadas durante os testes.
/*
This example implements an endpoint that reads from session data.
Session is an injected dependency.
SessionToken is a label (and it helps enforce type safety).
*/

// src/plugins/user.js
import {createPlugin} from 'fusion-core';
import {SessionToken} from 'fusion-tokens';

export default __NODE__ && createPlugin({
  deps: {Session: SessionToken},
  middleware({Session}) {
    return async (ctx, next) => {
      if (ctx.path === '/api/user') {
        ctx.body = JSON.parse(await Session.from(ctx).get('user'));
      }
      return next();
    }
  }
});

Também é possível garantir a segurança do tipo estaticamente entre dependências por meio do Flow.js, conforme ilustrado abaixo:

Figura 2. Erros de tipo de superfície diretamente no editor de código ajudam a capturar erros antes da execução do código.

Além de oferecer suporte a ferramentas de teste modernas, como Jest , Enzyme e Puppeteer , o Fusion.js também fornece ferramentas para desenvolvedores testarem plugins.

Apenas o começo

Dentro do Uber, já existem mais de 60 repositórios usando o Fusion.js desde seu lançamento interno. Esperamos que esse número aumente rapidamente devido a uma combinação de novos projetos da web e migração automatizada de projetos antigos para o Fusion.js. Dada essa demanda, as melhorias no nível da estrutura devem melhorar significativamente a linha de base da qualidade do software para esses projetos.

Quer conferir mais dicas? Acesso nossa sessão de dicas e fique por dentro das novidades!

Compartilhe.

Sobre o autor

Criador do blog Código Simples e com mais 9 anos de experiência em TI, com títulos de MVP Microsoft na área de Visual Studio Development, Neo4j Top 50 Certificate, Scrum Master e MongoDB Evangelist. Atuando em funções analista, desenvolvedor, arquiteto, líder técnico e gestor de equipes. Mais informações em : http://jhonathansoares.com