node.js - ¿Por qué VS Code y TypeScript no pueden encontrar el paquete assert?
Estoy teniendo un problema particularmente con las bibliotecas integradas de node (path, fs, assert). Aquí están los pasos para reproducirlo:
- Abre Visual Studio.
Archivo > Abrir carpeta, y elige la carpeta raízcore-demo.- En el panel de archivos, navega al archivo
core/library/waitFor.tests.ts. - Observe que VS Code resalta el paquete
asserten rojo y diceNo se puede encontrar el módulo 'assert' o sus definiciones de tipo correspondientes.
La parte interesante de esto es que el código realmente se ejecuta y funciona. Estoy ejecutando este módulo de prueba desde un script tsx definido en package.json: "test": "tsx ./test.ts".
test.ts:
import { default as waitForTests } from './library/waitFor.tests.js'
const run = async () => {
console.log('Running core tests...')
await waitForTests()
console.log('👍 core tests pass.')
}
run()
Este código se ejecuta y funciona como se espera -- npm run test ejecuta la prueba y la prueba pasa, confirmado con la salida de la consola:
Running core tests...
Running waitFor tests...
👍 waitFor tests pass.
👍 core tests pass.
Entonces, ¿por qué VS Code marca el import como un problema cuando TypeScript y TSX no tienen problema para encontrar y ejecutar el script?
tsconfig.json:
{
"compilerOptions": {
"allowUmdGlobalAccess": true, // Solves React problems. https://stackoverflow.com/a/76409663/6100384
"declaration": true,
"declarationMap": true,
"jsx": "react",
"lib": ["es2022", "dom"],
"module": "node16",
"moduleResolution": "node16",
"outDir": "./.compiled",
"skipLibCheck": true, // We don't want Typescript to check our pulled-in dependencies. It's been shown that our dependency authors can't be trusted to write good typings.
"sourceMap": true,
"strict": true,
"target": "es2020",
"verbatimModuleSyntax": true
},
"include": [
"./index.ts"
]
}
package.json:
{
"name": "core",
"version": "1.0.0",
"description": "A sample core project for use in other projects",
"author": "demo",
"license": "ISC",
"engines": {
"node": "18.15.0"
},
"main": "./.compiled/index.js",
"types": "./.compiled/index.d.ts",
"files":[
"./.compiled/**"
],
"type": "module",
"scripts": {
"build": "npm run clean && npm install && tsc && npm run test && npm pack",
"clean": "rm -rf ./.compiled && rm -rf ./node_modules && rm -rf ./package-lock.json",
"test": "tsx ./test.ts"
},
"dependencies": {
"@types/node": "18.15.11",
"@types/react": "18.0.31",
"@uppy/aws-s3": "3.3.1",
"@uppy/core": "3.5.1",
"@uppy/dashboard": "3.5.4",
"classnames": "2.3.2",
"next": "13.2.4",
"react": "18.2.0",
"react-dom": "18.2.0",
"tsx": "4.6.1",
"typescript": "5.2.2",
"uuid": "9.0.1"
}
}
Estoy intentando crear un paquete npm que se pueda instalar tanto en el JavaScript del navegador del lado del cliente como ejecutarse en Node.js. Hay una mezcla de características de React y Node.js que estoy definiendo en el proyecto. Comencé con la recomendación de la biblioteca de TypeScript para la mayoría de las configuraciones de tsconfig.json, y las ajusté y agregué a medida que me encontraba con ellas.
Mi package.json sí incluye "@types/node": "18.15.11" en la sección de dependencies, ya que eso es lo que normalmente he encontrado que causa este problema en otros proyectos, y confirmé que hay un archivo node_modules/@types/node/assert.d.ts presente en mi sistema de archivos y ciertamente parece estar lleno de un archivo de definición adecuado.
¿Qué más me estoy perdiendo? ¿Por qué VS Code no puede encontrar esta definición? Ya he intentado las respuestas de Typescript - No se puede encontrar el módulo ... o sus declaraciones de tipo correspondientes sin éxito. Reiniciar VSCode no tiene ningún efecto.
Editar He creado un proyecto de ejemplo que ilustra el problema para cualquiera que intente reproducirlo; tal vez sea solo mi máquina. Hay instrucciones en el readme.md en la raíz.
Mis detalles de VSCode son:
Version: 1.84.2 (user setup)
Commit: 1a5daa3a0231a0fbba4f14db7ec463cf99d7768e
Date: 2023-11-09T10:51:52.184Z
Electron: 25.9.2
ElectronBuildId: 24603566
Chromium: 114.0.5735.289
Node.js: 18.15.0
V8: 11.4.183.29-electron.0
OS: Windows_NT x64 10.0.22621
También pude reproducir esto en otra máquina. Mismo problema.
Version: 1.84.1 (Universal)
Commit: 2b35e1e6d88f1ce073683991d1eff5284a32690f
Date: 2023-11-06T12:37:18.666Z
Electron: 25.9.2
ElectronBuildId: 24603566
Chromium: 114.0.5735.289
Node.js: 18.15.0
V8: 11.4.183.29-electron.0
OS: Darwin x64 21.6.0
Respuesta #1
Lo resolví. La estructura del sistema de archivos de mi proyecto estaba causando el problema. La estructura de carpetas se ve así:
/package.json << A convenience `npm run build` that builds all three projects
/readme.md
/core/*
/projectA/*
/projectB/*
En VS Code, estaba abriendo la carpeta del directorio raíz / al trabajar con este proyecto. Así que aparentemente VS Code esperaba encontrar los tipos de Node.js en la carpeta /node_modules (no hay dependencias en /package.json).
Extraño, en mi opinión, que VSCode no tuviera problemas para encontrar las dependencias normales en /core/node_modules, teniendo problemas solo para encontrar los módulos integrados de Node.js.
Las dos soluciones que he encontrado para este problema son:
- Abrir instancias separadas de VS Code para cada subproyecto y abrir la raíz de cada proyecto. Algo molesto ya que se pierde la capacidad de saltar rápidamente entre archivos de diferentes proyectos.
- Usando los espacios de trabajo de VS Code y agregando las carpetas al espacio de trabajo. Pierdo los archivos raíz
/readme.mdy/package.json. Desafortunadamente, incluso después de muchos años de que los desarrolladores lo pidieran, VS Code se niega a agregar archivos individuales a los espacios de trabajo.
