# Escrevendo Código Universal
Antes de prosseguir, vamos discutir as restrições ao escrever código "universal" - ou seja, código que é executado no servidor e no cliente. Devido às diferenças de caso de uso e API de plataforma, o comportamento do nosso código não será exatamente o mesmo quando executado em ambientes diferentes. Aqui vamos falar sobre as principais coisas que você precisa estar ciente.
# Reatividade de Dados no Servidor
Em um aplicativo client-only, cada usuário usará uma nova instância do aplicativo em seu navegador. Para renderização do lado do servidor, queremos o mesmo: cada solicitação deve ter uma instância de aplicativo nova e isolada para que não haja poluição de estado em solicitação cruzada.
Como o processo de renderização real precisa ser determinístico, também estaremos "pre-fetching" dados no servidor - isso significa que o estado do nosso aplicativo já estará resolvido quando iniciarmos a renderização. Isso significa que a reatividade de dados é desnecessária no servidor, então está desabilitada por padrão. A desativação da reatividade de dados também evita o custo de desempenho da conversão de dados em objetos reativos.
# Gatilhos de Ciclo de Vida do Componente
Como não há atualizações dinâmicas, os únicos gatilhos de ciclo de vida que serão chamados durante o SSR são beforeCreate
e created
. Isso significa que qualquer código dentro de outros gatilhos de ciclo de vida, como beforeMount
ou mounted
, só serão executados no cliente.
Outra coisa a notar é que você deve evitar código que produza efeitos colaterais globais em beforeCreate
e created
, por exemplo configurando temporizadores com setInterval
. No código client-side podemos configurar um temporizador e, em seguida, destruí-lo em beforeUnmount
ou unmounted
. No entanto, como os gatilhos de destruição não serão chamados durante o SSR, os temporizadores permanecerão para sempre. Para evitar isso, mova seu código de efeito colateral para beforeMount
ou mounted
.
# Acesso a APIs Específicas da Plataforma
Código universal não pode assumir o acesso a APIs específicas de uma plataforma, portanto, se seu código usar diretamente globais somente do navegador, como window
ou document
, gerará erros quando executado no Node.js e vice-versa.
Para tarefas compartilhadas entre servidor e cliente, mas usando APIs de plataforma diferentes, é recomendável agrupar as implementações específicas da plataforma dentro de uma API universal ou usar bibliotecas que fazem isso para você. Por exemplo, axios (opens new window) é um cliente HTTP que expõe a mesma API para servidor e cliente.
Para APIs somente do navegador, a abordagem comum é acessá-las preguiçosamente dentro de gatilhos de ciclo de vida client-only.
Observe que, se uma biblioteca de terceiros não for escrita com o uso universal em mente, pode ser complicado integrá-la em um aplicativo renderizado pelo servidor. Você pode ser capaz de fazê-lo funcionar simulando alguns dos globais, mas seria hacky e pode interferir no código de detecção de ambiente de outras bibliotecas.
# Diretivas Customizadas
A maioria das diretivas customizadas manipula diretamente o DOM, o que causará erros durante o SSR. Recomendamos usar componentes como mecanismo de abstração em vez de diretivas.