¿Cómo resuelve "No se puede usar la declaración de importación fuera de un módulo" de una dependencia cuando la dependencia no se declara como un módulo?
Quiero usar el validador en Svelte/kit para validar correos electrónicos. Sin embargo, al importar la versión de ESM, aparece el error "No se puede usar la declaración de importación fuera de un módulo". Estoy usando pnpm en lugar de npm o yarn.
import isEmail from 'validator/es/lib/isEmail' /node_modules/.pnpm/validator@13.6.0/node_modules/validator/es/lib/isEmail.js:1 import assertString from './util/assertString'; ^^^^^^ SyntaxError: Cannot use import statement outside a module at Object.compileFunction (node:vm:355:18) at wrapSafe (node:internal/modules/cjs/loader:1039:15) at Module._compile (node:internal/modules/cjs/loader:1073:27) at Object.Module._extensions..js (node:internal/modules/cjs/loader:1138:10) at Module.load (node:internal/modules/cjs/loader:989:32) at Function.Module._load (node:internal/modules/cjs/loader:829:14) at Module.require (node:internal/modules/cjs/loader:1013:19) at require (node:internal/modules/cjs/helpers:93:18) at nodeRequire Parece que el validador está intentando usar la declaración de importación, pero es package.json no especifica "type": "module" . Supongo que esta es la causa raíz del error.
"type": "module"'validator/lib/isEmail' , pero eso provoca otros errores no relacionados con este hilo.Intenta importar así
import { isEmail } from "validator"Sin más información, si su problema radica únicamente en un problema con el código del que depende, considere usar a corto plazo algo como un paquete de parches para hacer los ajustes necesarios y, a largo plazo, ¡abra un PR en el repositorio de validator.js !
para el paquete de parches, simplemente agregue el "type": "module" al paquete.json en node_modules/validator , y luego ejecute npx patch-package validator . Luego puede controlar la versión del archivo diff generado, y los cambios se realizan automáticamente con ganchos npm, suponiendo que el paquete de parches es una dependencia (de desarrollo).
El comportamiento o defecto de la biblioteca aquí es probablemente de los desarrolladores, más teniendo en cuenta cosas como el paquete web que importa ESM en sus propios términos, y no con los patrones de resolución del módulo de nodo que parece que está usando Svelte. o al menos cómo el problema ha llegado tan lejos (¡podría estar equivocado al respecto!).
Intenta importar como a continuación
const {isEmail} = require('validator');¿Has probado a importar así?
import validator from 'validator'Intenté reproducir tu problema con el último SvelteKit. Esto funciona bien:
// index.svelte <script> import validator from 'validator'; let result = validator.isEmail('foo@bar.com'); console.log(result); </script>Cuando cambié la declaración de importación a:
import validator from 'validator/es/lib/isEmail'Recibí el error de su pregunta (No se puede usar la declaración de importación fuera de un módulo).
Importar validator/es/lib/isEmail supuestamente solo importa un subconjunto de la biblioteca. No estoy seguro de cuánta diferencia hará; puede que no haga ninguna diferencia. Una compilación un poco más grande supera a una compilación que no funciona. Sugiero que funcione primero, luego optimice el tamaño de construcción si realmente lo necesita.
Después de leer sus documentos: https://github.com/validatorjs/validator.js#es6 , parece que la parte es en la importación, por lo que puede ser modificable. Puede corregir este error, simplemente importándolo normalmente:
import isURL from 'validator/lib/isURL';