Puede ver mi proyecto de muestra aquí: https://github.com/DanKaplanSES/typescript-stub-examples/tree/JavaScript-import-invalid
He creado este archivo llamado main.ts:
import uuid from "uuid"; console.log(uuid.v4()); Aunque mecanografiado está bien con esta importación, cuando trato de node main.js , da este error:
console.log(uuid_1["default"].v4()); ^ TypeError: Cannot read property 'v4' of undefined at Object.<anonymous> (C:\root\lib\main.js:5:31) ←[90m at Module._compile (internal/modules/cjs/loader.js:1063:30)←[39m ←[90m at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)←[39m ←[90m at Module.load (internal/modules/cjs/loader.js:928:32)←[39m ←[90m at Function.Module._load (internal/modules/cjs/loader.js:769:14)←[39m ←[90m at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)←[39m ←[90m at internal/main/run_main_module.js:17:47←[39mSi cambio el archivo a esto, se ejecuta bien:
import * as uuid from "uuid"; console.log(uuid.v4());Si la primera versión no es válida, ¿por qué mecanografiado no me informa?
Tengo una configuración de tsconfig de varios archivos. Consulte el proyecto github para obtener más detalles, pero aquí están las opciones del compilador compartido que pueden ser relevantes:
{ "compilerOptions": { "rootDir": ".", "esModuleInterop": true, "module": "CommonJS", "moduleResolution": "node", "composite": true, "importHelpers": true, }, }Así es como se ve main.js:
"use strict"; exports.__esModule = true; var tslib_1 = require("tslib"); var uuid_1 = tslib_1.__importDefault(require("uuid")); console.log(uuid_1["default"].v4()); "use strict"; exports.__esModule = true; var tslib_1 = require("tslib"); var uuid = tslib_1.__importStar(require("uuid")); console.log(uuid.v4());En primer lugar, estoy trabajando en el entorno del módulo ESM.
He estado luchando con el problema de la importación del paquete uuid varias veces en los últimos años.
Hoy volví a encontrarlo y encontré algo nuevo para mí y me gusta compartirlo con su excelente respuesta de análisis.
TL; DR: el comportamiento del import UUID from 'uuid' es diferente cuando el paquete uuid depende directa o indirectamente.
Creo que esto está relacionado con el comportamiento de ESM.
dependencia de package.json con uuid | import * as UUID from 'uuid' | import UUID from 'uuid' |
|---|---|---|
| directamente (tsc) | OK | OK |
| directamente (tiempo de ejecución) | OK | SyntaxError: The requested module 'uuid' does not provide an export named 'default' |
| indirectamente (tsc) | OK | Module "node_modules/@types/uuid/index" has no default export.ts(1192) |
| indirectamente (tiempo de ejecución) | TypeError: UUID.v4 is not a function | OK |
uuid " significa que tenemos un uuid en las dependencies de package.jsonuuid " significa que no tenemos uuid en las dependencies de package.json (pero otro módulo de dependencia lo ha incluido) Parece que solo hay una situación en la que el sistema de escritura y el tiempo de ejecución funcionan como se espera con ESM: use una dependencia directa al paquete uuid .
Siempre npm install --save uuid . (ver mi problema aquí con confirmaciones)