繁体   English   中英

Webpack 无法从 io-ts 解析类型

[英]Webpack can't resolve type from io-ts

我目前正在使用 TS + React 制作一个简单的应用程序,其中包含一些对服务器的 API 请求。 当我尝试使用io-ts解码响应时,webpack 响应Module not found: Error: Can't resolve '../shared/Response' - 如果我删除使用io-ts解码响应,我不要得到那个错误。

我的文件夹结构是

src
    client
        PlayerTimer.tsx
        <skipped>
    server
        <skipped>
    shared
        Phase.d.ts
        Response.d.ts

Phase.d.ts包含以下内容:

import * as t from 'io-ts';

export const PhaseDecode = t.union([
  t.literal(1),
  t.literal(2),
  t.literal(3),
  t.literal(4),
  t.literal(5),
]);
export type Phase = t.TypeOf<typeof PhaseDecode>

Response.d.ts包含以下内容:

import * as t from 'io-ts';
import { DateFromISOString as IoDate } from 'io-ts-types/DateFromISOString';
import { PhaseDecode } from './Phase';

const ApiResponseDecode = t.type({
  turnNumber: t.number,
  phase: PhaseDecode,
  breakingNews: t.union([t.string, t.null]),
  active: t.boolean,
  phaseEnd: IoDate
});

type ApiResponse = t.TypeOf<typeof ApiResponseDecode>

export { ApiResponseDecode, ApiResponse as default };

PlayerTimer.tsx包含一堆 React 组件,但只需在顶部的以下代码即可重现

import { ApiResponseDecode } from '../shared/Response';

const temp = {};

if (ApiResponseDecode.is(temp)) {
  console.log('Webpack fails');
}

我的 webpack 配置是:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CopyPlugin = require('copy-webpack-plugin');

const outputDirectory = 'dist';

module.exports = {
  entry: ['babel-polyfill', './src/client/index.tsx'],
  output: {
    path: path.join(__dirname, outputDirectory),
    filename: './js/[name].bundle.js'
  },
  devtool: 'source-map',
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader'
        }
      },
      {
        test: /\.tsx?$/,
        use: 'ts-loader',
        exclude: /node_modules/
      },
      {
        enforce: 'pre',
        test: /\.js$/,
        loader: 'source-map-loader'
      },
      {
        test: /\.less$/,
        use: [
          { loader: 'style-loader' },
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              publicPath: './Less',
              hmr: process.env.NODE_ENV === 'development',
            },
          },
          { loader: 'css-loader' },
          {
            loader: 'less-loader',
            options: {
              strictMath: true,
              noIeCompat: true,
            }
          },
        ]
      },
      {
        test: /\.css$/,
        use: [
          { loader: 'style-loader' },
          { loader: 'css-loader' },
        ],
      },
      {
        test: /\.(png|woff|woff2|eot|ttf|svg)$/,
        loader: 'url-loader?limit=100000'
      },
    ]
  },
  resolve: {
    extensions: ['*', '.ts', '.tsx', '.js', '.jsx', '.json', '.less']
  },
  devServer: {
    port: 3000,
    open: true,
    hot: true,
    historyApiFallback: true,
    proxy: {
      '/api/**': {
        target: 'http://localhost:8050',
        secure: false,
        changeOrigin: true
      }
    }
  },
  plugins: [
    new CleanWebpackPlugin([outputDirectory]),
    new HtmlWebpackPlugin({
      template: './public/index.html',
      favicon: './public/favicon.ico',
      title: 'Test application',
    }),
    new MiniCssExtractPlugin({
      filename: './css/[name].css',
      chunkFilename: './css/[id].css',
    }),
    new CopyPlugin([
      { from: './src/client/Assets', to: 'assets' },
    ])
  ],
};

我通过将类型定义和 io-ts 定义移动到单独的文件中来解决这个问题。 我真的不明白为什么会这样,但我会添加这个以防其他人发现这个

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM