tsc ném `TS2307: Không thể tìm thấy mô-đun` cho một tệp cục bộ


84

Tôi có một dự án ví dụ đơn giản sử dụng TypeScript: https://github.com/unindented/ts-webpack-example

Đang chạy tsc -p .(với tscphiên bản 1.8.10) ném như sau:

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

Nó phàn nàn về tất cả các lần nhập tệp cục bộ, như sau:

import Counter from 'components/counter';

Nếu tôi thay đổi nó thành một đường dẫn tương đối thì nó hoạt động, nhưng tôi không muốn, vì nó khiến cuộc sống của tôi khó khăn hơn khi di chuyển tệp xung quanh:

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

Cơ vscodesở mã không sử dụng đường dẫn tương đối, nhưng mọi thứ đều hoạt động tốt đối với chúng, vì vậy tôi phải thiếu thứ gì đó trong dự án của mình: https://github.com/Microsoft/vscode/blob/0e81224179fbb8f6fda18ca7362d8500a263cfef/src/vs/languages/typescript/common /typescript.ts#L7-L14

Bạn có thể xem repo GitHub của tôi, nhưng trong trường hợp nó hữu ích, đây là tsconfig.jsontệp tôi đang sử dụng:

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

Điều buồn cười là, việc xây dựng dự án thông qua webpackviệc sử dụng ts-loaderhoạt động tốt, vì vậy tôi đoán đó chỉ là vấn đề cấu hình ...

Câu trả lời:


132

@vladima đã trả lời vấn đề này trên GitHub :

Cách trình biên dịch giải quyết các mô-đun được điều khiển bởi tùy chọn moduleResolution có thể là một trong hai nodehoặc classic(có thể tìm thấy thêm chi tiết và sự khác biệt tại đây ). Nếu cài đặt này bị bỏ qua, trình biên dịch sẽ coi cài đặt này là nodenếu mô-đun là commonjsvà classic- nếu không. Trong trường hợp của bạn, nếu bạn muốn classicchiến lược phân giải mô-đun được sử dụng với commonjscác mô-đun - bạn cần đặt nó một cách rõ ràng bằng cách sử dụng

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

2
Tôi gặp lỗi này:error TS5023: Unknown compiler option 'moduleResolution'.
— SSH Điều này

Bắt buộc nếu bạn đang sử dụng import * as microsoftTeams from "@microsoft/teams-js";.html tĩnh sử dụng .jscác tệp được biên dịch với tscnhóm MS.
— ManuelTS

6

Trong VS2019, trang thuộc tính dự án , tab TypeScript Build có cài đặt (thả xuống) cho "Hệ thống mô-đun". Khi tôi thay đổi điều đó từ "ES2015" thành CommonJS , thì VS2019 IDE đã ngừng phàn nàn rằng nó không thể tìm thấy axios và 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"
  ]
}

1
Không thể tìm thấy cấu hình này. Nó đâu rồi?
— Ganesh Satpute

Nó nằm trong tsconfig.jsonhồ sơ.
— Monrus

5

Trong một số trường hợp, bạn chỉ cần cập nhật includemảng.

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

4

Cơ sở mã vscode không sử dụng các đường dẫn tương đối, nhưng mọi thứ đều hoạt động tốt đối với chúng

Thực sự phụ thuộc vào trình tải mô-đun của bạn. Nếu bạn đang sử dụng systemjsvới baseurlthì nó sẽ hoạt động. VSCode sử dụng trình tải mô-đun tùy chỉnh của riêng nó (dựa trên phiên bản cũ của requestjs).

sự giới thiệu

Sử dụng các đường dẫn tương đối vì đó là những gì commonjshỗ trợ. Nếu bạn di chuyển các tệp xung quanh, bạn sẽ gặp lỗi thời gian biên dịch bản ghi (một điều tốt), vì vậy bạn sẽ tốt hơn phần lớn các dự án js thuần túy ngoài kia (trên npm).


Đang tải vscodecodebase trong Visual Studio Code, tôi không nhận được dòng nào nguệch ngoạc, vì vậy Visual Studio Code bằng cách nào đó hiểu được những thứ như thế nào import {notImplemented} from 'vs/base/common/errors';, bất kể tệp chứa mã đó nằm ở đâu. Họ làm nó như thế nào?
— Daniel Perez Alvarez,

1

Nếu sử dụng webstorm, hãy nhấn Ctrl + Alt + S và hiển thị cửa sổ cài đặt. Ngôn ngữ & Khung công tác> TypeScript, bật tùy chọn "sử dụng tsconfig.json".


2
Trong WebStorm 2020.1, tùy chọn này đã được đổi tên thành "Cũng dành cho các dự án không có tsconfig.json."
— gnu_lorien

0

Tôi đã gặp sự cố khi nhập một Enum trong bảng sắp chữ

lỗi TS2307: Không thể tìm thấy mô-đun ...

Những gì tôi đã làm để làm cho nó hoạt động là di chuyển enum sang một tệp khác và thực hiện thay đổi này:

export enum MyEnum{
    VALUE = "MY_VALUE"
}

đến

export enum MyEnum{
    VALUE = 1
}

-1

Trong trường hợp của tôi ,

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

tôi đã nhận xét nó trong startup.cs

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.