tsc arroja `TS2307: No se puede encontrar el módulo` para un archivo local

84

Tengo un proyecto de ejemplo simple usando TypeScript: https://github.com/unindented/ts-webpack-example

Ejecutar tsc -p .(con la tscversión 1.8.10) arroja lo siguiente:

app/index.ts(1,21): error TS2307: Cannot find module 'components/counter'.
components/button/index.ts(2,22): error TS2307: Cannot find module 'shared/backbone_base_view'.
components/button/index.ts(3,25): error TS2307: Cannot find module 'shared/backbone_with_default_render'.
components/counter/index.ts(2,22): error TS2307: Cannot find module 'shared/backbone_base_view'.
components/counter/index.ts(3,25): error TS2307: Cannot find module 'shared/backbone_with_default_render'.
components/counter/index.ts(4,27): error TS2307: Cannot find module 'shared/backbone_with_subviews'.
components/counter/index.ts(5,20): error TS2307: Cannot find module 'components/button'.

Se queja de todas las importaciones de archivos locales, como los siguientes:

import Counter from 'components/counter';

Si lo cambio a una ruta relativa, funciona, pero no quiero, ya que hace que mi vida sea más difícil al mover archivos:

import Counter from '../components/counter';

El vscodecódigo base no usa rutas relativas, pero todo funciona bien para ellos, por lo que debo perder algo en mi proyecto: https://github.com/Microsoft/vscode/blob/0e81224179fbb8f6fda18ca7362d8500a263cfef/src/vs/languages/typescript/common /typescript.ts#L7-L14

Puede consultar mi repositorio de GitHub, pero en caso de que ayude, aquí está el tsconfig.jsonarchivo que estoy usando:

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "noImplicitAny": false,
    "removeComments": false,
    "preserveConstEnums": true,
    "sourceMap": true,
    "outDir": "dist"
  },
  "exclude": [
    "dist",
    "node_modules"
  ]
}

Lo curioso es que construir el proyecto mediante el webpackuso ts-loaderfunciona bien, así que supongo que es solo un problema de configuración ...

Daniel Pérez Alvarez
fuente

Respuestas:

132

@vladima respondió a este problema en GitHub :

La forma en que el compilador resuelve los módulos se controla mediante la opción moduleResolution que puede ser nodeo classic(se pueden encontrar más detalles y diferencias aquí ). Si se omite esta configuración, el compilador trata esta configuración como nodesi el módulo es commonjsy classic, en caso contrario. En su caso, si desea classicque la estrategia de resolución de módulos se use con commonjsmódulos, debe establecerla explícitamente mediante

{
    "compilerOptions": {
        "moduleResolution": "node"
    }
}
Daniel Pérez Alvarez
fuente
2
Veo este error:error TS5023: Unknown compiler option 'moduleResolution'.
SSH Este
Obligatorio si está utilizando import * as microsoftTeams from "@microsoft/teams-js";un .html estático que utiliza .jsarchivos compilados tscpara equipos de MS.
ManuelTS
6

En VS2019, la página de propiedades del proyecto , la pestaña Compilación de TypeScript tiene una configuración (menú desplegable) para "Sistema de módulos". Cuando cambié eso de "ES2015" a CommonJS , VS2019 IDE dejó de quejarse de que no podía encontrar ni axios ni redux-thunk (TS2307).

tsconfig.json:

{
  "compilerOptions": {
    "allowJs": true,
    "baseUrl": "src",
    "forceConsistentCasingInFileNames": true,
    "jsx": "react",
    "lib": [
      "es6",
      "dom",
      "es2015.promise"
    ],
    "module": "esnext",
    "moduleResolution": "node",
    "noImplicitAny": true,
    "noImplicitReturns": true,
    "noImplicitThis": true,
    "noUnusedLocals": true,
    "outDir": "build/dist",
    "rootDir": "src",
    "sourceMap": true,
    "strictNullChecks": true,
    "suppressImplicitAnyIndexErrors": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "target": "es5",
    "skipLibCheck": true,
    "strict": true,
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true
  },
  "exclude": [
    "build",
    "scripts",
    "acceptance-tests",
    "webpack",
    "jest",
    "src/setupTests.ts",
    "node_modules",
    "obj",
    "**/*.spec.ts"
  ],
  "include": [
    "src",
    "src/**/*.ts",
    "@types/**/*.d.ts",
    "node_modules/axios",
    "node_modules/redux-thunk"
  ]
}
sef
fuente
1
No puedo encontrar esta configuración. ¿Dónde está?
Ganesh Satpute
Se encuentra en el tsconfig.jsonarchivo.
Monkrus
5

En algunos casos, solo necesita actualizar la includematriz.

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "moduleResolution": "node",
    "outDir": "dist",
    "sourceMap": false,
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    }
  },
  "include": ["src/**/*.ts", "tests/**/*.ts"],
  "exclude": ["node_modules", ".vscode"]
}
codejockie
fuente
4

El código base de vscode no usa rutas relativas, pero todo funciona bien para ellos

Realmente depende de su cargador de módulos. Si está usando systemjscon baseurlentonces funcionaría. VSCode usa su propio cargador de módulos personalizado (basado en una versión anterior de requirejs).

Recomendación

Utilice rutas relativas ya que eso es lo que commonjsadmite. Si mueve archivos, obtendrá un error de tiempo de compilación mecanografiado (algo bueno), por lo que estará mejor que la gran mayoría de los proyectos js puros que existen (en npm).

basarat
fuente
Al cargar la vscodebase de código en Visual Studio Code, no obtengo líneas onduladas, por lo que Visual Studio Code de alguna manera entiende cosas como import {notImplemented} from 'vs/base/common/errors';, independientemente de dónde viva el archivo que contiene ese código. ¿Cómo lo hicieron?
Daniel Perez Alvarez
1

Si usa webstorm, presione Ctrl + Alt + S y abra la ventana de configuración. Idiomas y marcos> TypeScript, habilite la opción "usar tsconfig.json".

Feng Zhang
fuente
2
En WebStorm 2020.1, esta opción se ha modificado para decir: "También para proyectos sin tsconfig.json".
gnu_lorien
0

Tuve problemas para importar un Enum en mecanografiado

error TS2307: No se puede encontrar el módulo ...

Lo que hice para que funcionara fue migrar la enumeración a otro archivo y realizar este cambio:

export enum MyEnum{
    VALUE = "MY_VALUE"
}

a

export enum MyEnum{
    VALUE = 1
}
DigaoParceiro
fuente
-1

En mi caso ,

   //app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
            //{
            //    HotModuleReplacement = true
            //});

lo comenté en startup.cs

mahendra mucama
fuente