Otimize as aplicações Node.js para o Cloud Run

Este guia descreve as otimizações para serviços do Cloud Run escritos em JavaScript ou TypeScript, executados no tempo de execução do Node.js. As informações nesta página complementam as sugestões de desenvolvimento gerais, que também se aplicam ao Node.js.

Otimize o tempo de arranque

Ao otimizar o tempo de arranque, pode reduzir a latência, melhorar a capacidade de resposta e alcançar uma otimização de custos eficaz. Esta secção descreve diferentes formas de otimizar o tempo de arranque.

Inicie a sua app com o node em vez do npm

Inicie a sua aplicação diretamente através de node index.js em vez de npm start, uma vez que npm adiciona latência adicional.

Para iniciar a aplicação com o node index.js, siga um destes métodos:

  • Use CMD node index.js no seu Dockerfile, por exemplo:

    CMD node index.js
    
  • Defina node index.js como o seu ponto de entrada. Execute o seguinte comando com a CLI do Google Cloud:

    gcloud run deploy SERVICE --command "node index.js"
    

    Para mais informações e opções de configuração de pontos de entrada, consulte o artigo Configure contentores para serviços.

Se usar implementações de origem sem um Dockerfile, o Cloud Run faz a otimização.

Agrupe o seu código

Um agrupador é uma ferramenta de compilação que otimiza a disposição dos seus ficheiros de origem JavaScript para tempos de carregamento mais rápidos. Algumas otimizações comuns de agrupadores incluem a eliminação de código não utilizado, a minimização e a união de ficheiros pequenos. Os agrupadores reduzem significativamente o tamanho total do pacote e o número de pedidos de leitura de ficheiros. Os agrupadores de JavaScript comuns são o esbuild, o webpack e o rollup.

Carregue dependências em diferido

No arranque, o Cloud Run faz stream de cada ficheiro que o seu código carrega a partir de uma localização remota. Em comparação com um sistema de ficheiros local, a utilização de uma localização remota gera latência adicional sempre que um ficheiro é lido. Os pacotes Node.js podem usar muitos ficheiros com dependências indiretas. Em vez de importar todas as dependências no início, recomendamos que carregue apenas as dependências necessárias para o servidor iniciar e carregue as outras dependências de forma diferida com importações dinâmicas.

Por exemplo, em vez de usar import na parte superior do módulo, como import { Storage } from '@google-cloud/storage', use import() na função quando requer o objeto importado, por exemplo:

const { Storage } = await import('@google-cloud/storage');

Para identificar os módulos carregados durante o arranque e o tempo necessário para cada módulo ser carregado no seu computador, execute o seguinte comando:

node --trace-event-categories node.module_timer --trace-event-file-pattern 'trace-events.log' index.js

Configure o limite de tempo

O servidor HTTP incorporado do Node.js tem um tempo limite predefinido de dois minutos. Se o tempo limite do pedido do seu serviço do Cloud Run for mais longo, modifique o tempo limite usando server.setTimeout(msecs). Também tem de modificar o limite de tempo para frameworks criadas no servidor Node.js, como o Express. Para alcançar um limite de tempo ilimitado no Node.js e depender do limite de tempo incorporado do Cloud Run, use server.setTimeout(0).