Búsqueda de sitios web

¿Qué configuración de TypeScript produce una salida más cercana a las capacidades de Node.js 18?


¿Cómo configuraría TypeScript para aprovechar todas las últimas funciones en Node.js 18? Específicamente, me gustaría saber cómo obtener soporte completo para ESM y cómo usar toda la sintaxis y funciones más recientes introducidas en ES2021/ES2022.

Respuesta #1

A fecha de Node.js 18.0.0, el 100% de ES2022 está soportado (salvo un error en RegEx.flags), ¡y el soporte para módulos ES es estable! Si sabes que estás apuntando a esa versión o a una versión más reciente, la configuración óptima sería la siguiente:

  • "módulo": "ES2022" & "resoluciónDeMódulo": "node"

    Node.js 18 admite la carga de módulos en lugar del antiguo formato CommonJS, tenemos que decirle a TypeScript que estamos usando las reglas de Node.js para resolver módulos.

  • "allowSyntheticDefaultImports": true

    Para proporcionar compatibilidad hacia atrás, Node.js permite importar paquetes de CommonJS con una importación predeterminada. Esta bandera indica a TypeScript que está bien usar importar en módulos de CommonJS.

  • "target": "ES2022"

    Esto le indica a TypeScript que está bien generar síntaxis de JavaScript con características de ES2022. En la práctica, esto significa que, por ejemplo, generará operadores de asignación lógica y la sintaxis async/await en lugar de incluir un polyfill.

  • "lib": ["ES2022"]

    Esto le dice a TypeScript que está bien usar funciones y propiedades introducidas en ES2022 o anteriores. En la práctica, esto significa que puedes usar, por ejemplo, Promise.any y String.prototype.replaceAll.

La configuración completa sería así:

{
  "compilerOptions": {
    "allowSyntheticDefaultImports": true,
    "lib": ["ES2022"],
    "module": "ES2022",
    "moduleResolution": "node",
    "target": "ES2022"
  }
}

Además de esto, también necesitamos decirle a Node.js que trate los archivos .js en este proyecto como Módulos ES. La razón de esto es que Node.js tuvo que mantener la compatibilidad hacia atrás con el código escrito para versiones anteriores de Node.js. Esto se puede hacer agregando "type": "module" a tu package.json:

{
  "type": "module"
}

Otro cambio si vienes de una versión anterior de Node.js es que las extensiones de archivo al importar archivos ahora son obligatorias. Esto significa que debes escribir .js al final de tus importaciones locales. Ten en cuenta que esto es .js aunque estés importando un archivo TypeScript que en realidad tiene la extensión de archivo .ts. Esto puede parecer un poco confuso, pero este comentario de uno de los colaboradores de TS explica por qué es así.

Aquí hay algunos ejemplos de cómo escribir tus declaraciones import:

// Built-in Node.js modules
import { readFileSync } from 'fs'

// CommonJS packages from Npm
import md5File from 'md5-file'

// The local file "a.ts"
import { a } from './a.js'

Si quieres mantenerte con CommonJS por ahora, para evitar las advertencias explicadas arriba, puedes usar la siguiente configuración:

{
  "compilerOptions": {
    "lib": ["ES2022"],
    "module": "CommonJS",
    "target": "ES2022"
  }
}

Si estás usando Node.js 16, puedes ver mi respuesta similar para Node.js 16 aquí

Si estás usando Node.js 14, puedes ver mi respuesta similar para Node.js 14 aquí

Si estás usando Node.js 12, puedes ver mi respuesta similar para Node.js 12 aquí

Si vas a jugar Node.js 10, puedes ver mi respuesta similar para Node.js 10 aquí

Si estás usando Node.js 8, puedes ver mi respuesta similar para Node.js 8 aquí

Artículos relacionados