Como processar dependências

Uma função pode usar módulos Node.js externos, bem como dados locais. Dependências no Node.js são gerenciadas com npm e expressas em um arquivo de metadados chamado package.json. Os ambientes de execução do Node.js para Cloud Functions geralmente são compatíveis com a instalação usando npm ou yarn.

Para especificar uma dependência para sua função, adicione-a ao seu arquivo package.json.

Neste exemplo, uma dependência é listada no arquivo package.json:

{
  "dependencies": {
    "escape-html": "^1.0.3"
  }
}

Em seguida, a dependência é importada na função:

JavaScript

const escapeHtml = require('escape-html');

// Return a greeting with the input HTML-escaped.
exports.hello = functions.https.onRequest((req, res) => {
  res.send(`Hello ${escapeHtml(req.query.name || req.body.name || 'World')}!`);
});

TypeScript

import * as escapeHtml from 'escape-html';

// Return a greeting with the input HTML-escaped.
export let hello = functions.https.onRequest((req, res) => {
  res.send(`Hello ${escapeHtml(req.query.name || req.body.name || 'World')}!`);
}

Como incluir módulos Node.js locais como parte do seu pacote de implantação

Também é possível incluir módulos Node.js como parte da sua função. Para isso, declare seu módulo em package.json usando o prefixo file:. No exemplo a seguir, mymodule refere-se ao nome do seu módulo e mymoduledir é o diretório que contém seu módulo:

{
  "dependencies": {
    "mymodule": "file:mymoduledir"
  }
}

O código para este módulo local não deve estar na sua pasta node_modules. É possível armazená-lo na raiz do diretório da sua função.

Usar npm para instalar os módulos Node.js localmente

A maneira mais fácil de instalar um módulo Node.js localmente é usar o comando npm install na pasta que contém o Cloud Function. Por exemplo, o seguinte comando adiciona o módulo uuid:

npm install uuid

Esse processo combina duas etapas:

  1. Ele marca a versão mais recente do módulo como uma dependência no seu arquivo package.json. Importante: o Cloud Functions instala apenas módulos que são declarados em seu arquivo package.json.
  2. Ele faz o download do módulo no diretório node_modules. Isso permite que você use o módulo ao desenvolver localmente.

Se você não tiver o npm instalado na sua máquina, faça o download aqui.

Etapas adicionais do TypeScript

O TypeScript é mais útil com o uso de bibliotecas que têm informações de tipo. Isso permite que o TypeScript capture erros de sintaxe e ofereça aos editores sugestões de preenchimento automático melhores. Algumas bibliotecas, como firebase-admin e firebase-functions, incluem envios de definições de TypeScript.

Muitas bibliotecas não oferecem definições próprias do TypeScript. O projeto DefinitelyTyped fornece definições mantidas pela comunidade para as bibliotecas de node mais conhecidas. O DefinitelyTyped publica essas definições com o mesmo nome do pacote NPM, mas dentro da organização "@types". Por exemplo, é possível instalar as informações de tipo para a biblioteca uuid com o seguinte:

npm install @types/uuid

Conforme você se familiarizar com o TypeScript, poderá combinar ambas as instalações:

npm install uuid @types/uuid

As dependências de tipo precisam ser do mesmo tipo que a dependência da biblioteca. Por exemplo, não se deve salvar uuid como uma dependência normal e @types/uuid como uma dependência de desenvolvedor ou de pares.

Carregar módulos Node.js

Use a função require() do Node.js para carregar qualquer módulo Node.js que você tenha instalado. Também é possível usar a função require() para importar arquivos locais implantados com sua função.

Se você estiver escrevendo funções no TypeScript, use a declaração import da mesma maneira para carregar qualquer módulo Node.js instalado.

Usar módulos particulares

Para usar um módulo npm privado, é preciso fornecer as credenciais (token de autenticação) do registro npm em um arquivo .npmrc localizado no diretório da função. A documentação do npm explica como criar tokens personalizados de acesso somente leitura. Não recomendamos a utilização do arquivo .npmrc criado no diretório pessoal, porque ele contém um token de leitura/gravação. Permissões de gravação não são necessárias durante a implantação e podem representar um risco de segurança.

Não inclua o arquivo .npmrc se você não estiver usando repositórios particulares, porque isso pode aumentar o tempo de implementação de suas funções.