HiveBrain v1.2.0
Get Started
← Back to all entries
debugtypescriptCritical

tsc throws `TS2307: Cannot find module` for a local file

Submitted by: @import:stackoverflow-api··
0
Viewed 0 times
ts2307modulefindforthrowsfilecannottsclocal

Problem

I've got a simple example project using TypeScript: https://github.com/unindented/ts-webpack-example

Running tsc -p . (with tsc version 1.8.10) throws the following:

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


It complains about all imports of local files, like the following:

import Counter from 'components/counter';


If I change it to a relative path it works, but I don't want to, as it makes my life more difficult when moving files around:

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


The vscode codebase does not use relative paths, but everything works fine for them, so I must be missing something in my project: https://github.com/Microsoft/vscode/blob/0e81224179fbb8f6fda18ca7362d8500a263cfef/src/vs/languages/typescript/common/typescript.ts#L7-L14

You can check out my GitHub repo, but in case it helps here's the tsconfig.json file I'm using:

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


Funny thing is, building the project through webpack using ts-loader works fine, so I'm guessing it's just a configuration issue...

Solution

@vladima replied to this issue on GitHub:

The way the compiler resolves modules is controlled by
moduleResolution option that can be either node or classic (more
details and differences can be found here). If this setting is omitted
the compiler treats this setting to be node if module is commonjs and
classic - otherwise. In your case if you want classic module
resolution strategy to be used with commonjs modules - you need to set
it explicitly by using

{
    "compilerOptions": {
        "moduleResolution": "node"
    }
}

Code Snippets

{
    "compilerOptions": {
        "moduleResolution": "node"
    }
}

Context

Stack Overflow Q#37548734, score: 181

Revisions (0)

No revisions yet.