Construa e implante aplicativos TypeScript Azure Functions

Azure Functions suporta múltiplas opções de compilação para publicar seus aplicativos TypeScript no Azure. Escolha seu método de build com base no ambiente local, dependências do app, requisitos de compilação TypeScript e necessidades de runtime.

Escolhendo um método de construção

Fator Compilação local (recomendado) Compilação remota
Mais adequado para Construções complexas, repositórios individuais, ferramentas personalizadas Projetos simples, implantações rápidas
Tamanho do pacote Maior (inclui node_modules) Menor (dependências instaladas no Azure)
Compilação TypeScript Você compila localmente O Azure compila automaticamente
Compatibilidade binária nativa Você deve corresponder à arquitetura de destino Gerenciado automaticamente (Linux x64)
Risco de tempo limite na compilação Nenhum (funciona na sua máquina) É possível para grandes conjuntos de dependências
Controle Completo (qualquer ferramenta de compilação, empacotador, otimizador) Limitado aos padrões da plataforma

Para pacotes privados de npm ou registros personalizados, veja Dependências personalizadas.

Empacote seu aplicativo para implantação

Ao implantar seu aplicativo de função TypeScript no Azure, seu pacote de implantação deve atender a estes requisitos:

  • Saída JavaScript necessária: Azure Functions roda JavaScript, então o TypeScript deve ser compilado antes ou durante a implantação.

  • Nível da raiz host.json: verifique se há um único host.json arquivo na raiz do pacote de implantação e não dentro de nenhuma subpasta.

  • package.json main campo: O runtime Functions lê esse campo na inicialização para localizar e indexar suas funções. Ele deve apontar para o seu ponto de entrada JavaScript compilado (por exemplo, dist/src/index.js).

  • Excluir arquivos de desenvolvimento: Use um .funcignore arquivo para excluir arquivos desnecessários da implantação, como neste exemplo:

    .git/
    .vscode/
    local.settings.json
    test/
    .env
    tsconfig.json
    src/
    node_modules/
    

Também tenha em mente esses trade-offs ao planejar sua implantação:

  • O ambiente de compilação deve corresponder à produção: dependências com binários nativos devem ser construídas para a arquitetura Linux x64. A build remota lida com isso automaticamente; para compilação local, considere usar Docker ou um ambiente de build containerizado.
  • O tamanho do pacote de implantação afeta o cold start: Grandes conjuntos de dependências aumentam a latência de cold start porque o runtime precisa carregar cada arquivo individualmente. Agrupar seu app em menos arquivos com ferramentas como esbuild ou webpack pode reduzir significativamente o tempo de inicialização.
  • A compilação remota tem limites de tempo útil: Se a instalação de dependências ou compilação TypeScript exceder os limites da plataforma, a compilação falha. Use uma compilação local com dependências pré-compiladas para projetos de grande porte.
  • A inicialização de módulos tem limites de tempo: Node.js carregamento de módulos e indexação de funções durante a inicialização são limitados por tempo. Reduza importações de nível superior ou use importações dinâmicas sempre que possível.

Construção local

Se você não solicitar explicitamente uma build remota, sua máquina instala dependências e compila o TypeScript. Você então empacota e implanta todo o projeto compilado e as dependências localmente no seu aplicativo de funções.

A compilação local resulta em um upload de pacote maior, mas dá controle total sobre o processo de compilação e garante compatibilidade com seu ambiente de desenvolvimento.

Para projetos TypeScript que usam compilação local:

  1. Precompile TypeScript: Compile seu código TypeScript localmente antes da implantação.
  2. Instalar dependências: Execute npm install ou yarn install para instalar as dependências localmente.
  3. Verificação de builds: Garanta que seus resultados de build funcionem corretamente no seu ambiente local.
  4. Implante a saída compilada: Implemente o JavaScript compilado junto com as dependências.

Exemplos de comandos para compilação local:

# Install dependencies
npm install

# Compile TypeScript
npm run build
# or
tsc

# Deploy with local build (no remote compilation)
func azure functionapp publish <APP_NAME> --no-build

Você pode configurar as seguintes ferramentas para usar compilação local:

Build remoto

Quando você usa build remota, a plataforma Functions cuida da instalação de pacotes, compilação em TypeScript e garante compatibilidade com o ambiente de execução remoto.

Ao usar build remota, você obtém um pacote de implantação menor porque não precisa incluir node_modules ou compilar arquivos JavaScript.

Quando você implanta projetos TypeScript usando compilação remota:

  1. Detecção automática: A plataforma detecta projetos TypeScript pela presença de tsconfig.json.
  2. Compilação: A plataforma compila arquivos TypeScript usando a configuração TypeScript do seu projeto.
  3. Instalação de dependências: a plataforma instala tanto dependencies quanto devDependencies a partir de package.json, já que pacotes de compilação como typescript são necessários para a compilação.
  4. Otimização: A plataforma inclui apenas os arquivos necessários no pacote final de implantação.

Você pode usar a build remota ao publicar seu aplicativo TypeScript usando estas ferramentas:

Para habilitar o build remoto para outros cenários, como entrega contínua com o Azure Pipelines, consulte Habilitando o Build Remoto.

Dependências personalizadas

Azure Functions suporta dependências npm personalizadas e privadas usando registros npm personalizados, pacotes privados ou pacotes locais.

Compilação remota com registro personalizado do npm

Quando seus pacotes privados estiverem disponíveis em um registro npm personalizado, você pode solicitar uma build remota após configurar a localização do registro.

Para usar um registro personalizado, crie um .npmrc arquivo na raiz do seu projeto:

registry=https://your-private-registry.com/
//your-private-registry.com/:_authToken=${NPM_TOKEN}

Pacotes locais e módulos privados

Pacotes locais e módulos privados são suportados ao construir aplicativos TypeScript Azure Function.

Para incluir pacotes locais usando compilação remota, faça referência a eles no arquivo package.json:

{
  "dependencies": {
    "@azure/functions": "^4.0.0",
    "my-private-package": "file:../my-private-package",
    "another-local-package": "file:./packages/local-lib"
  }
}

Para incluir dependências locais usando a compilação local, instale as dependências localmente e implante com a compilação remota desativada:

# Install all dependencies including local ones
npm install

# Build your TypeScript project
npm run build

# Publish with local build
func azure functionapp publish <APP_NAME> --no-build

Use pacotes do espaço de trabalho

Para configurações de monorepo ou npm workspace, faça referência a pacotes compartilhados usando npm workspaces no seu package.json arquivo:

{
  "name": "functions-app",
  "dependencies": {
    "@azure/functions": "^4.0.0",
    "@mycompany/shared-lib": "workspace:*"
  },
  "workspaces": [
    "packages/*"
  ]
}

Empacotar antes da implantação

Use ferramentas de agrupamento como webpack, esbuild ou rollup para criar um único pacote antes da implantação:

# Bundle your application
npm run bundle

# Deploy the bundled output
func azure functionapp publish <APP_NAME> --no-build