Construir e implementar aplicações TypeScript Funções do Azure

O Funções do Azure suporta múltiplas opções de compilação para publicar as suas aplicações TypeScript no Azure. Escolha o seu método de compilação com base no ambiente local, dependências da aplicação, requisitos de compilação TypeScript e necessidades de runtime.

Escolher um método de construção

Fator Construção local (recomendado) Construção remota
Melhor para Construções complexas, monorepos, ferramentas personalizadas Projetos simples, implementações rápidas
Tamanho da embalagem Maior (inclui node_modules) Menor (dependências instaladas no Azure)
Compilação TypeScript Compilas localmente O Azure compila automaticamente
Compatibilidade binária nativa Tens de corresponder à arquitetura alvo Gerido automaticamente (Linux x64)
Risco de tempo limite da compilação Nenhum (é executado na tua máquina) Possível para grandes conjuntos de dependências
Controlo Completo (qualquer ferramenta de build, agregador, otimizador) Limitado aos padrões padrão da plataforma

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

Empacota a tua aplicação para implementação

Ao implementar a sua aplicação de funções TypeScript para o Azure, o seu pacote de implementação deve cumprir estes requisitos:

  • Saída JavaScript necessária: O Funções do Azure executa JavaScript, pelo que o TypeScript deve ser compilado antes ou durante a implementação.

  • Nível host.jsonraiz: Certifique-se de que um único host.json ficheiro está na raiz do pacote de implementação, não estando dentro de uma subpasta.

  • package.json main campo: O runtime das Funções lê este campo no arranque para localizar e indexar as suas funções. Deve apontar para o seu ponto de entrada JavaScript compilado (por exemplo, dist/src/index.js).

  • Excluir ficheiros de desenvolvimento: Use um .funcignore ficheiro para excluir ficheiros desnecessários da implementação, como neste exemplo:

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

Também tenha em mente estes compromissos ao planear a sua implantação:

  • O ambiente de compilação deve corresponder à produção: Dependências com binários nativos devem ser construídas para arquitetura Linux x64. A build remota trata disto automaticamente; para construção local, considere usar Docker ou um ambiente de compilação containerizado.
  • O tamanho do pacote de implementação afeta o arranque a frio: Grandes conjuntos de dependências aumentam a latência de arranque a frio porque o tempo de execução tem de carregar cada ficheiro individualmente. Agrupar a sua aplicação em menos ficheiros com ferramentas como o esbuild ou webpack pode reduzir significativamente o tempo de arranque.
  • A compilação remota tem limites de timeout: 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 grandes.
  • A inicialização de módulos tem limites de tempo: Node.js carregamento de módulos e indexação de funções durante o arranque são limitadas no tempo. Reduza importações de topo ou use importações dinâmicas sempre que possível.

Construção local

Se não solicitares explicitamente uma build remota, a tua máquina instala dependências e compila o TypeScript. Depois, empacotas e implementas todo o projeto compilado e as dependências localmente na tua aplicação funcional.

A compilação local resulta num carregamento de pacotes maior, mas dá-lhe controlo total sobre o processo de compilação e garante compatibilidade com o seu ambiente de desenvolvimento.

Para projetos TypeScript que usam compilação local:

  1. Precompile TypeScript: Compila o teu código TypeScript localmente antes da implementação.
  2. Instalar dependências: Executar npm install ou yarn install instalar dependências localmente.
  3. Verificação de builds: Garanta que os resultados das builds funcionam corretamente no seu ambiente local.
  4. Implementar a saída compilada: Implementar o JavaScript compilado juntamente 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

Pode configurar as seguintes ferramentas para usar compilação local:

Compilação remota

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

Ao usar build remota, obtém um pacote de implementação mais pequeno porque não precisa de incluir node_modules ou compilar ficheiros JavaScript.

Quando implementas projetos TypeScript usando compilação remota:

  1. Deteção automática: A plataforma deteta projetos TypeScript pela presença de tsconfig.json.
  2. Compilação: A plataforma compila ficheiros TypeScript utilizando a configuração TypeScript do seu projeto.
  3. Instalação de dependências: A plataforma instala tanto dependencies como devDependencies a partir de package.json, uma vez que pacotes de compilação como typescript são necessários para a compilação.
  4. Otimização: A plataforma inclui apenas os ficheiros necessários no pacote final de implementação.

Pode usar a compilação remota ao publicar a sua aplicação TypeScript usando estas ferramentas:

Para permitir a compilação remota para outros cenários, como entrega contínua com Azure Pipelines, veja Ativar a Construção Remota.

Dependências personalizadas

O Funções do Azure suporta dependências npm personalizadas e privadas utilizando registos npm personalizados, pacotes privados ou pacotes locais.

Compilação remota com repositório npm personalizado

Quando os seus pacotes privados estão disponíveis num registo npm personalizado, pode solicitar uma compilação remota após configurar a localização do registo.

Para usar um registo personalizado, crie um .npmrc ficheiro 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 na construção de aplicações TypeScript Azure Function.

Para incluir pacotes locais usando compilação remota, referencia-os no seu package.json ficheiro:

{
  "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 compilação local, instale as dependências localmente e implemente 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 de espaço de trabalho

Para configurações de monorepo ou de workspaces do npm, referencie pacotes partilhados através dos workspaces do npm no seu ficheiro package.json:

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

Bundle antes da implementação

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

# Bundle your application
npm run bundle

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