Webpack + tsconfig + .d.ts文件的动态导入引发NoEmit错误

时间:2018-11-30 22:15:46

标签: reactjs typescript webpack tsconfig ts-loader

我在理解webpack,tsconfig和.d.ts文件如何协同工作时遇到了一个奇怪的问题。

我具有以下项目结构:

enter image description here

ScriptsApp包含一个@types文件夹,如下所示:

enter image description here

我的tsconfig.json如下:

{
  "compilerOptions": {
    "target": "ES2018",
    "module": "esnext",
    "lib": [
      "es6",
      "dom",
      "scripthost",
      "es2018",
      "es2018.promise"
    ],
    "jsx": "react",
    "sourceMap": true,
    "outDir": "./.out/",
    "noImplicitAny": true,
    "strictFunctionTypes": true,
    "alwaysStrict": true,
    "moduleResolution": "node",
    "typeRoots": ["node_modules/@types", "ScriptsApp/@types"]
  },
  "include": ["./ScriptsApp/**/*.tsx", "./ScriptsApp/**/*.ts", "ScriptsApp/@types"],
  "exclude": ["node_modules"],
  "files": ["ScriptsApp/indexApp.tsx"]
}

这是我的webpack配置:

const path = require("path");
const webpack = require("webpack");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin");

module.exports = {
  mode: "development",
  output: {
    filename: "[name].bundle.[hash].js",
    path: path.join(__dirname, ".out/"),
    chunkFilename: "[name].chunk.js",
    publicPath: "/",
    hotUpdateChunkFilename: ".hot/hot-update.js",
    hotUpdateMainFilename: ".hot/hot-update.json"
  },
  optimization: {
    runtimeChunk: {
      name: "manifest"
    },
    splitChunks: {
      cacheGroups: {
        vendor: {
          test: /[\\/]node_modules[\\/]/,
          name: "vendors",
          priority: -20,
          chunks: "all"
        }
      }
    }
  },
  target: "web",
  devServer: {
    contentBase: ".out/",
    hot: true
  },
  plugins: [
    new webpack.NamedModulesPlugin(),
    new webpack.HotModuleReplacementPlugin(),
    new HtmlWebpackPlugin({
      inject: true,
      template: path.join(__dirname, "./index.html")
    }),

    new ForkTsCheckerWebpackPlugin({
      checkSyntacticErrors: true,
      tslint: "./tslint.json",
      tslintAutoFix: true,
      tsconfig: "./tsconfig.json",
      async: false,
      reportFiles: ["ScriptsApp/**/*"]
    })
  ],
  module: {
    rules: [
      {
        test: /\.(png|jpg|ico)$/,
        loader: "file-loader",
        options: {
          name: ".img/[name].[ext]?[hash]",
          publicPath: "/"
        }
      },
      {
        test: /\.(woff(2)?|ttf|eot|svg|otf)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
        loader: "file-loader",
        options: {
          name: ".fonts/[name].[ext]?[hash]",
          publicPath: "/"
        }
      },
      {
        test: /\.(ts|tsx)$/,
        use:"ts-loader"
      },
      {
        test: /\.js$/,
        loader: "source-map-loader"
      },
      {
        test: /\.scss$/,
        use: [
          {
            loader: "style-loader" // creates style nodes from JS strings
          },
          {
            loader: "css-loader",
            options: {
              sourceMap: true
            }
          },
          {
            loader: "resolve-url-loader"
          },
          {
            loader: "sass-loader",
            options: {
              sourceMap: true
            }
          }
        ]
      }
    ]
  },
  resolve: {
    extensions: [".js", ".ts", ".tsx", ".scss", ".css", ".png", ".ico", ".json"]
  },
  devtool: "source-map"
};

现在我的问题是: 我试图在我的React组件之一中使用动态导入,如下所示:

private loadComponentFromPath(path: string) {
    import(`../../ScriptsApp/${path}`).then(component =>
      this.setState({
        component: component.default
      })
    );
}

添加动态导入后,我的构建就开始针对 ScriptsApp / @ types 文件夹中的所有.d.ts文件显示此错误

WARNING in ./ScriptsApp/@types/react-adal.d.ts
Module build failed (from ./node_modules/ts-loader/index.js):
Error: TypeScript emitted no output for C:\code\AzureCXP-Eng\src\Applications\AzureCxpWebSite\WebSite\FeedbackSrc\App\ScriptsApp\@types\react-adal.d.ts.
    at makeSourceMapAndFinish (C:\code\AzureCXP-Eng\src\Applications\AzureCxpWebSite\WebSite\FeedbackSrc\App\node_modules\ts-loader\dist\index.js:78:15)
    at successLoader (C:\code\AzureCXP-Eng\src\Applications\AzureCxpWebSite\WebSite\FeedbackSrc\App\node_modules\ts-loader\dist\index.js:68:9)
    at Object.loader (C:\code\AzureCXP-Eng\src\Applications\AzureCxpWebSite\WebSite\FeedbackSrc\App\node_modules\ts-loader\dist\index.js:22:12)
 @ ./ScriptsApp lazy ^\.\/.*$ namespace object ./@types/react-adal.d.ts
 @ ./ScriptsApp/Routes/AppRoutesList.tsx
 @ ./ScriptsApp/Routes/Routes.tsx
 @ ./ScriptsApp/Components/App.tsx
 @ ./ScriptsApp/indexApp.tsx
 @ ./ScriptsApp/index.tsx
 @ multi webpack-hot-middleware/client?reload=true ./ScriptsApp/index.tsx

我现在如何使错误消失?

  1. 将@types文件夹移动到ScriptsApp外部,或
  2. 不使用动态导入
  3. 将ScriptsApp / @ types下的所有.d.ts文件重命名为.interface.ts->最让我感到困惑的

我不明白为什么。我还是整个技术栈中的新手,如果我遗漏了一些明显的内容,对不起。请解释此行为。此外,任何有关改进配置的建议也将受到赞赏。谢谢。

2 个答案:

答案 0 :(得分:0)

在另一个GitHub问题中,您可以在tsconfig.json文件中执行此操作。

{ "compilerOptions": { "target": "ES6", "jsx": "react", "noEmit": true }, "exclude": [ "node_modules", "dev_server.js" ] }

您能否尝试添加行"noEmit": false.

答案 1 :(得分:0)

tsconfig.json中的以下代码应确保不会报告node_modules内部的错误。

{
  compilerOptions: {
     skipLibCheck: true
  }
}