Webpack Dev Server не может найти модули с Typescript, если я использую пользовательские пути в tsconfig - PullRequest
0 голосов
/ 18 октября 2019

Я строю проект с нуля на React + TypeScript и использую сервер Webpack Dev. Я хочу использовать относительные пути к компонентам, которые не будут строгими для более гибкой разработки.

В моем App.tsx я пытаюсь импортировать компонент:

import EntityTypes from "components/EntityTypes/EntityTypes";

иполучая ошибку

Module not found: Error: Can't resolve 'components/EntityTypes/EntityTypes' in '/home/eugene/prj/work/crud-react/src'

Файл по этому пути существует (/src/components/EntityTypes/EntityTypes.js) и экспортирует класс как

export default EntityTypes;

Мой tsconfig.json:

{
  "compilerOptions": {
    "sourceMap": true,
    "noImplicitAny": false,
    "module": "commonjs",
    "target": "es5",
    "lib": [
      "es2015",
      "es2017",
      "dom"
    ],
    "removeComments": true,
    "allowSyntheticDefaultImports": false,
    "jsx": "react",
    "allowJs": true,
    "baseUrl": ".",
    "paths": {
      "components/*": [
        "src/components/*"
      ]
    }
  }
}

webpack.config.js:

const HtmlWebPackPlugin = require( 'html-webpack-plugin' );
const path = require( 'path' );
module.exports = {
    context: __dirname,
    entry: './src/index.js',
    resolve: {
        extensions: ['.ts', '.tsx', '.js', '.jsx']
    },
    output: {
        path: path.resolve( __dirname, 'dist' ),
        filename: 'main.js',
        publicPath: '/',
    },
    devServer: {
        historyApiFallback: true
    },
    module: {
        rules: [
            {
                test: /\.(tsx|ts)?$/,
                loader: 'awesome-typescript-loader'
            },
            {
                test: /\.js$/,
                use: 'babel-loader',
            },
            {
                test: /\.css$/,
                use: ['style-loader', 'css-loader'],
            },
            {
                test: /\.(png|j?g|svg|gif)?$/,
                use: 'file-loader'
            }
        ]
    },
    plugins: [
        new HtmlWebPackPlugin({
            template: path.resolve( __dirname, 'public/index.html' ),
            filename: 'index.html'
        })
    ]
};

Я проверил документацию машинописи о "путях", файл существует, я не понимаю, в чем проблема.

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Я разобрался, как использовать пути для моих файлов и сделать их гибкими, чтобы я мог легко реорганизовать проект и управлять путями без большого количества изменений строгих относительных путей.

Проблема была связана снастройка веб-пакета. Окончательная конфигурация следующая:

tsconfig.json

{
  "compilerOptions": {
    // ...
    "paths": {
      "~/components/*": [
        "./src/components/*"
      ],
      "~/services/*": [
        "./src/services/*"
      ],
      "~/interfaces/*": [
        "./src/interfaces/*"
      ]
    },
  }
}

webpack.config.js

const path = require('path');
module.exports = {
  // ...
  resolve: {
    // ...
    alias: {
      '~/components': path.resolve(process.cwd(), './src/components'),
      '~/interfaces': path.resolve(process.cwd(), './src/interfaces'),
      '~/services': path.resolve(process.cwd(), './src/services'),
    }
  },
}

Примеры использования

import {IEntities} from "~/interfaces/entities.interface";
// ...
import EntityForm from "~/components/EntityForm/EntityForm";
0 голосов
/ 18 октября 2019

Вы используете абсолютный импорт, а не относительный. Попробуйте import EntityTypes from "./components/EntityTypes/EntityTypes";, если предполагается, что файл, в который вы его импортируете, находится на том же уровне, что и каталог components.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...