TSC lance 'TS2307: impossible de trouver module' pour un fichier local

j'ai un exemple simple de projet en utilisant TypeScript: https://github.com/unindented/ts-webpack-example

Exécution tsc -p . (avec tsc version 1.8.10) lance ce qui suit:

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'.

Il se plaint de toutes les importations de fichiers locaux, comme suit:

import Counter from 'components/counter';

si je le change en un chemin relatif, il fonctionne, mais je ne veux pas, car il rend ma vie plus difficile quand je déplace des fichiers autour de:

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

vscode codebase n'utilise pas de chemins relatifs, mais tout fonctionne bien pour eux, donc je dois manquer quelque chose dans mon projet: https://github.com/Microsoft/vscode/blob/0e81224179fbb8f6fda18ca7362d8500a263cfef/src/vs/languages/typescript/common/typescript.ts#L7-L14

vous pouvez vérifier mon github repo, mais au cas où il aide voici le tsconfig.json fichier que j'utilise:

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

ce qui est drôle, c'est de construire le projet par le biais de webpack en utilisant ts-loader fonctionne très bien, donc je suppose que c'est juste un problème de configuration...

19
demandé sur Daniel Perez Alvarez 2016-05-31 17:40:37

2 réponses

@vladima a répondu à ce numéro sur GitHub:

la façon dont le compilateur résout les modules est contrôlée par moduleResolution option qui peut être soit node ou classic (plus détails et différences peuvent être trouvés ici). Si ce paramètre est omis le compilateur traite de ce paramètre node si le module est commonjs et classic - dans le cas contraire. Dans votre cas, si vous voulez classic module stratégie de résolution à utiliser avec commonjs modules - vous devez définir les il explicitement en utilisant

{
    "compilerOptions": {
        "moduleResolution": "node"
    }
}
35
répondu Daniel Perez Alvarez 2016-06-01 16:53:05

la base de codes vscode n'utilise pas de chemins relatifs, mais tout fonctionne très bien pour eux

dépend Vraiment de votre chargeur de module. Si vous utilisez systemjsbaseurl alors ça marcherait. VSCode utilise son propre chargeur de module personnalisé (basé sur une ancienne version de requirejs).

Recommandation

utilisez les chemins relatifs car c'est ce que commonjs prise en charge. Si vous déplacez vos fichiers, vous obtiendrez un tapuscrit erreur de compilation (une bonne chose) ainsi, vous serez mieux qu'une grande majorité de pure js projets en cours (mnp).

2
répondu basarat 2016-06-01 01:43:20