Compilar y desplegar aplicaciones TypeScript Azure Functions

Azure Functions soporta múltiples opciones de compilación para publicar tus aplicaciones TypeScript en Azure. Elige tu método de compilación en función de tu entorno local, dependencias de la app, requisitos de compilación de TypeScript y necesidades de ejecución.

Elección de un método de construcción

Factor Montaje local (recomendado) Montaje remoto
Más adecuado para Compilaciones complejas, monorepos, herramientas personalizadas Proyectos sencillos, despliegues rápidos
Tamaño de paquete Más grande (incluye node_modules) Más pequeño (dependencias instaladas en Azure)
Compilación de TypeScript Compilas localmente Azure compila automáticamente
Compatibilidad binaria nativa Debe coincidir con la arquitectura de destino Gestionado automáticamente (Linux x64)
Riesgo de que se agote el tiempo de espera de la compilación Ninguna (se ejecuta en tu equipo) Posible para grandes conjuntos de dependencias
Supervisión Completo (cualquier herramienta de compilación, bundler, optimizador) Limitado a los valores predeterminados de la plataforma

Para paquetes npm privados o registros personalizados, véase Dependencias personalizadas.

Empaqueta tu aplicación para su despliegue

Al desplegar tu aplicación de función TypeScript en Azure, tu paquete de despliegue debe cumplir con estos requisitos:

  • Se requiere salida de JavaScript: Azure Functions ejecuta JavaScript, por lo que TypeScript debe compilarse antes o durante el despliegue.

  • Nivel host.jsonraíz: Asegúrese de que haya un solo archivo host.json en la raíz del paquete de implementación, no anidado en una subcarpeta.

  • package.json main campo: El runtime de Funciones lee este campo al inicio para localizar e indexar tus funciones. Debe apuntar a tu punto de entrada compilado en JavaScript (por ejemplo, dist/src/index.js).

  • Excluir archivos de desarrollo: Utiliza un .funcignore archivo para excluir archivos innecesarios del despliegue, como en este ejemplo:

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

Ten en cuenta también estas contrapartidas al planificar tu despliegue:

  • El entorno de compilación debe coincidir con la producción: Las dependencias con binarios nativos deben construirse para la arquitectura Linux x64. La compilación remota gestiona esto automáticamente; para la compilación local, considera usar Docker o un entorno de compilación contenedorizado.
  • El tamaño del paquete de despliegue afecta al inicio en frío: Los conjuntos de dependencias grandes aumentan la latencia de inicio en frío porque el tiempo de ejecución debe cargar cada archivo individualmente. Agrupar tu aplicación en menos archivos con herramientas como esbuild o webpack puede reducir significativamente el tiempo de arranque.
  • La compilación remota tiene límites de tiempo de espera: si la instalación de dependencias o la compilación en TypeScript superan los límites de la plataforma, la compilación falla. Utiliza una compilación local con dependencias preconstruidas para proyectos grandes.
  • La inicialización de módulos tiene límites de tiempo: Node.js carga de módulos e indexación de funciones durante el arranque están limitadas en tiempo. Reducir las importaciones de nivel superior o usar importaciones dinámicas cuando sea posible.

Compilación local

Si no solicitas explícitamente una compilación remota, tu máquina instala dependencias y compila TypeScript. Luego empaquetas y despliegas todo el proyecto compilado y las dependencias localmente en tu aplicación de funciones.

La compilación local da lugar a una subida de paquetes más grande, pero te da control total sobre el proceso de compilación y garantiza la compatibilidad con tu entorno de desarrollo.

Para proyectos TypeScript que usan compilación local:

  1. Precompilar TypeScript: Compila tu código TypeScript localmente antes del despliegue.
  2. Instalar dependencias: Ejecuta npm install o yarn install instala dependencias localmente.
  3. Verificación de compilaciones: Asegúrate de que tus salidas de compilación funcionen correctamente en tu entorno local.
  4. Desplegar la salida compilada: Desplegar el JavaScript compilado junto con las dependencias.

Ejemplos de comandos de compilación para compilación 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

Puedes configurar las siguientes herramientas para usar la compilación local:

Compilación remota

Cuando usas la compilación remota, la plataforma Functions se encarga de la instalación de paquetes, la compilación de TypeScript y garantiza la compatibilidad con el entorno de ejecución remoto.

Al usar compilación remota, obtienes un paquete de despliegue más pequeño porque no necesitas incluir node_modules ni compilar archivos JavaScript.

Cuando despliegas proyectos TypeScript usando compilaciones remotas:

  1. Detección automática: La plataforma detecta proyectos TypeScript por la presencia de tsconfig.json.
  2. Compilación: La plataforma compila archivos TypeScript utilizando la configuración TypeScript de tu proyecto.
  3. Instalación de dependencias: La plataforma instala tanto dependencies como devDependencies desde package.json, ya que se necesitan paquetes en tiempo de compilación como typescript para la compilación.
  4. Optimización: La plataforma solo incluye los archivos necesarios en el paquete final de despliegue.

Puedes usar la compilación remota cuando publicas tu aplicación TypeScript usando estas herramientas:

Para habilitar la compilación remota para otros escenarios, como la entrega continua con Azure Pipelines, consulte Habilitación de la compilación remota.

Dependencias personalizadas

Azure Functions soporta dependencias npm personalizadas y privadas utilizando registros npm personalizados, paquetes privados o paquetes locales.

Construcción remota con registro npm personalizado

Cuando tus paquetes privados estén disponibles en un registro npm personalizado, puedes solicitar una compilación remota tras configurar la ubicación del registro.

Para usar un registro personalizado, crea un .npmrc archivo en la raíz de tu proyecto:

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

Paquetes locales y módulos privados

Se soportan paquetes locales y módulos privados al construir aplicaciones TypeScript Azure Function.

Para incluir paquetes locales usando compilación remota, refírelos en tu package.json archivo:

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

Para incluir dependencias locales usando la compilación local, instala las dependencias localmente y desplázalas con la compilación remota deshabilitada:

# 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

Utiliza paquetes de espacio de trabajo

Para configuraciones de monorepo o npm workspace, consulta los paquetes compartidos usando npm workspaces en tu package.json archivo:

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

Empaquetar antes del despliegue

Utiliza herramientas de empaquetado como webpack, esbuild o rollup para crear un único paquete antes del despliegue:

# Bundle your application
npm run bundle

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