Usar TypeScript para Cloud Functions

Para desenvolvedores que preferem escrever funções em TypeScript, o Cloud Functions oferece dois tipos de suporte:

  • Crie e configure projetos TypeScript para transpilação automática na inicialização ( firebase init functions ).
  • Transpile a fonte TypeScript existente para JavaScript no momento da implantação por meio de um gancho pré-implantação .

Seguindo as instruções neste guia, você pode migrar um projeto JavaScript existente para TypeScript e continuar implantando funções usando um gancho de pré-implantação para transpilar seu código-fonte. TypeScript oferece muitos benefícios em relação ao JavaScript vanilla ao escrever funções:

  • TypeScript oferece suporte aos recursos JavaScript mais recentes, como async/await, simplificando o gerenciamento de promessas
  • Um linter do Cloud Functions destaca problemas comuns durante a codificação
  • A segurança de tipo ajuda a evitar erros de tempo de execução em funções implantadas

Se você é novo no TypeScript, consulte TypeScript em 5 minutos .

Inicializando um novo projeto do Cloud Functions com TypeScript

Execute firebase init functions em um novo diretório. A ferramenta oferece opções para construir o projeto com JavaScript ou TypeScript. Escolha TypeScript para gerar a seguinte estrutura de projeto:

myproject
 +- functions/     # Directory containing all your functions code
      |
      +- package.json  # npm package file describing your Cloud Functions code
      |
      +- tsconfig.json
      |
      +- .eslintrc.js # Optional file if you enabled ESLint
      +- tsconfig.dev.json # Optional file that references .eslintrc.js
      |
      +- src/     # Directory containing TypeScript source
      |   |
      |   +- index.ts  # main source file for your Cloud Functions code
      |
      +- lib/
          |
          +- index.js  # Built/transpiled JavaScript code
          |
          +- index.js.map # Source map for debugging

Assim que a inicialização for concluída, remova o comentário do exemplo em index.ts e execute npm run serve para ver uma função "Hello World" em ação.

Usando um projeto TypeScript existente

Se você tiver um projeto TypeScript existente, poderá adicionar um gancho de pré-implantação para garantir que seu projeto seja transpilado sempre que você implantar seu código no Cloud Functions para Firebase. Você precisará de um arquivo tsconfig.json formado corretamente e de um projeto do Firebase, além de fazer as seguintes modificações na configuração do Firebase:

  1. Edite package.json para adicionar um script bash para construir seu projeto TypeScript. Por exemplo:

     {
       "name": "functions",
       "scripts": {
         "build": "npm run lint && tsc"
       }
     ...
    
  2. Edite firebase.json para adicionar um gancho de pré-implantação para executar o script de construção. Por exemplo:

     {
       "functions": {
         "predeploy": "npm --prefix functions run build",
       }
     }
    

Com essa configuração, um comando firebase deploy --only functions cria seu código TypeScript e o implanta como funções.

Migrando um projeto JavaScript existente para TypeScript

Se você tiver um projeto do Cloud Functions inicializado e desenvolvido em JavaScript, poderá migrá-lo para TypeScript. É altamente recomendável criar um ponto de verificação git ou outro backup antes de começar.

Para migrar um projeto JavaScript existente do Cloud Functions:

  1. Crie um ponto de verificação git e salve cópias dos arquivos de origem JavaScript existentes.
  2. No diretório do projeto, execute firebase init functions e selecione TypeScript quando for solicitado um idioma para escrever funções.
  3. Quando for perguntado se deseja substituir o arquivo package.json existente, selecione Não , a menos que tenha certeza de que não deseja manter o arquivo existente.
  4. Exclua index.ts do diretório functions/src , substituindo-o pelo seu código-fonte existente.
  5. No arquivo tsconfig.json criado na inicialização, defina as opções do compilador para permitir JavaScript: "allowJs": true .
  6. Copie o arquivo package.json salvo no diretório functions e edite-o para definir "main" como "lib/index.js" .
  7. Também em package.json , adicione um script de construção para TypeScript como o seguinte:

     {
       "name": "functions",
       "scripts": {
         "build": "npm run lint && tsc"
       }
     ...
    
  8. Adicione "typescript" como uma dependência de desenvolvimento executando npm install --save-dev typescript @typescript-eslint/eslint-plugin @typescript-eslint/parser .

  9. Para todas as dependências, execute npm install --save @types/<dependency> .

  10. Reescreva o código-fonte de .js para .ts conforme desejado.

Emulando funções TypeScript

Para testar funções TypeScript localmente, você pode usar as ferramentas de emulação descritas em Executar funções localmente . É importante compilar seu código antes de usar essas ferramentas, portanto, certifique-se de executar npm run build dentro do diretório de funções antes de executar firebase emulators:start ou firebase functions:shell . Como alternativa, execute npm run serve ou npm run shell como atalho; esses comandos executam a construção e servem/iniciam o shell de funções.

Logs de funções para projetos TypeScript

Durante firebase deploy , index.ts do seu projeto é transpilado para index.js , o que significa que o log do Cloud Functions gerará números de linha do arquivo index.js e não o código que você escreveu. Para facilitar a localização dos caminhos e números de linha correspondentes em index.ts , firebase deploy cria functions/lib/index.js.map . Você pode usar este mapa de origem em seu IDE preferido ou por meio de um módulo de nó .