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...
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
ouclassic
(plus détails et différences peuvent être trouvés ici). Si ce paramètre est omis le compilateur traite de ce paramètrenode
si le module estcommonjs
etclassic
- dans le cas contraire. Dans votre cas, si vous voulezclassic
module stratégie de résolution à utiliser aveccommonjs
modules - vous devez définir les il explicitement en utilisant{ "compilerOptions": { "moduleResolution": "node" } }
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 systemjs
baseurl
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).