Tengo una biblioteca foo que está escrita con ES6, import/export y en Typescript.
Tengo una bar de aplicaciones que usa foo . bar también está escrito con exportaciones y mecanografiado. Me gustaría que la bar se ejecute en AWS Lambda.
Por lo que puedo decir, no puedo usar import/export en Lambda (con el nodo de tiempo de ejecución 14.x) como
export const handler = async () => {...};Error, pero
exports.handler = async () => {...};No lo haré.
Así que dentro de mi tsconfig he configurado:
"target": "ES5", (or ES6) "module": "CommonJS",en las opciones del compilador.
Con esto, al ejecutar Lambda obtengo errores ya que ahora intenta require la biblioteca foo y dice que debe usar import .
¿Cómo puedo lograr mi objetivo final?
Tal como lo veo, hay 3 opciones, ninguna de las cuales sé mucho ya que todavía soy nuevo en los matices de JS.
bar transpile, o use el paquete web, o cualquiera que sea la herramienta para replicar la import en cjs.foo también incluya una distribución CJS (comencé a hacer esto y obtuve muchos errores de los aros que tuve que superar para que la biblioteca funcionara en es6).Se agregó compatibilidad con módulos ES en Node v14. Sin embargo, necesitamos ayudar un poco a Node a determinar qué tipo debe usar para cargar un archivo.
Si solo está utilizando módulos ES, es bastante fácil, simplemente puede agregar "type": "module" a su archivo package.json para indicarle a Node que use módulos ES. Otra forma es usar una extensión de archivo diferente. Sin embargo, dado que AWS Lambda necesita que el controlador se configure en forma de filename.methodname , siempre usará la extensión .js , lo que hace que no sea posible usar una extensión de archivo diferente para su punto de entrada.
He probado el "type": "module" en AWS Lambda, y parece funcionar. No he probado cómo funcionaría la interoperabilidad con dependencias que usan módulos CommonJS, pero asumo que esto funcionaría de inmediato.
Puede consultar este blog para obtener más información sobre cómo Node maneja esto.