reactjs - Webpack Dev Server kan ikke finne moduler med Typescript hvis jeg bruker tilpassede stier i tsconfig


Jeg bygger et prosjekt fra bunnen av med React + TypeScript og bruker Webpack Dev-serveren. Jeg vil bruke relative stier til komponenter, som ikke vil være strenge for en mer fleksibel utvikling.

I min App.tsx prøver jeg å importere en komponent:

import EntityTypes from "components/EntityTypes/EntityTypes";

og får en feil

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

Fil på denne banen eksisterer (/src/components/EntityTypes/EntityTypes.js) og eksporterer klassen som

export default EntityTypes;

Min 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'
        })
    ]
};

Jeg har sjekket dokumentasjonen til TypeScript om «paths», filen eksisterer, jeg forstår ikke hva problemet er.

Svar #1

Jeg har funnet ut hvordan jeg kan bruke stier for filene mine og gjøre dem fleksible, slik at jeg kan omorganisere prosjektet og håndtere stier enkelt uten mange endringer av strenge relative stier.

Problemet var relatert til konfigurasjonen av webpack. Den endelige konfigurasjonen er som følger:

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'),
    }
  },
}

Eksempler på bruk

import {IEntities} from "~/interfaces/entities.interface";
// ...
import EntityForm from "~/components/EntityForm/EntityForm";

Svar #2

Bare legg til tsconfig-paths-webpack-plugin i webpack-konfigurasjonen din:

const { cwd } = require('node:process');
const { resolve } = require('node:path');

const TsconfigPathsWebpackPlugin = require('tsconfig-paths-webpack-plugin');


module.exports = {
    resolve: {
        plugins: [
            new TsconfigPathsWebpackPlugin({
                configFile: resolve(cwd(), './tsconfig.json'),
            })
        ]
    }

};

Og du trenger ikke å duplisere sti-konfigurasjon som webpack-aliaser.