Webpack文件加载器输出[对象模块]

我使用与的WebPack HtmlWebpackPluginhtml-loaderfile-loader我有一个简单的项目结构,其中不使用框架,只使用TypeScript。因此,我将HTML代码直接写入index.html我还将这个HTML文件用作的模板HtmlWebpackPlugin

就像所有网站一样,我需要在我的素材资源文件夹中放置一个引用PNG的图片。file-loader应该正确加载文件,将新文件名放在src标记中,但这不是正在发生的情况。相反,作为srctag 的值,我有[object Module]我假设file-loaderemission会发出一些对象,并且在其.toString()方法运行时会像这样表示但是,我可以看到file-loader已经成功处理了文件,并以新名称将其发送到输出路径。我没有错误。这是我的webpack配置和index.html

const projectRoot = path.resolve(__dirname, '..');

{
  entry: path.resolve(projectRoot, 'src', 'app.ts'),
  mode: 'production',
  output: {
    path: path.resolve(projectRoot, 'dist'),
    filename: 'app.bundle.js'
  },
  resolve: {
    extensions: ['.ts', '.js']
  },
  module: {
    rules: [
      {
        test: /\.html$/i,
        use: 'html-loader'
      },
      {
        test: /\.(eot|ttf|woff|woff2|svg|png)$/i,
        use: 'file-loader'
      },
      {
        test: /\.scss$/i,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              hmr: false
            }
          },
          {
            loader: 'css-loader',
            options: {
              sourceMap: false
            }
          },
          {
            loader: 'sass-loader',
            options: {
              sourceMap: false
            }
          }
        ]
      },
      {
        exclude: /node_modules/,
        test: /\.ts$/,
        use: 'ts-loader'
      }
    ]
  },
  plugins: [
    new CleanWebpackPlugin(),
    new HtmlWebpackPlugin({
      template: path.resolve(projectRoot, 'src', 'index.html')
    }),
    new MiniCssExtractPlugin({
      filename: '[name].[hash].css',
      chunkFilename: '[id].[hash].css',
      ignoreOrder: false
    })
  ]
};

index.html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title></title>
  </head>
  <body class="dark">
    <header>
      <nav class="navigation">
        <div class="left">
          <img src="assets/logo.png" class="logo"> <!-- This logo is output as [object Module] -->
        </div>
        <div class="right">

        </div>
      </nav>
    </header>
  </body>
</html>

项目结构:

config/
    webpack.config.js
dist/
src/
    styles/
    assets/
        logo.png
    index.html
    app.ts

编辑 我的package.json依赖项:

"clean-webpack-plugin": "^3.0.0",
"css-loader": "^3.2.0",
"file-loader": "^5.0.2",
"html-webpack-plugin": "^3.2.0",
"mini-css-extract-plugin": "^0.8.0",
"node-sass": "^4.13.0",
"sass-loader": "^8.0.0",
"style-loader": "^1.0.0",
"ts-loader": "^6.2.1",
"typescript": "^3.7.2",
"webpack": "^4.41.2",
"webpack-cli": "^3.3.10",
"webpack-dev-server": "^3.9.0"
GO2020/04/03 10:49:24

您能说明您使用的文件加载器的确切版本吗?我知道,因为这是几个小时前发生在我身上的,并且我有^ 5.0.2版本。

古一2020/04/03 10:49:24

这在文件加载器版本5.0.2上发生,早期版本可以正常工作而无需调用default属性

神无2020/04/03 10:49:24

@ stellr42建议esModule: false在您的file-loader配置中进行的修复是当前最佳的解决方法。

但是,这实际上是一个错误,html-loader正在这里进行跟踪:https : //github.com/webpack-contrib/html-loader/issues/203

它看起来像ES模块支持加入file-loadercss-loader和其他朋友,但html-loader被错过了。

修复此错误后,最好删除esModule: false并升级html-loader,因为ES模块提供了一些次要的好处(如docs中所述

或者,如果(像我一样)由于无法从CSS(而不是从HTML)加载图像发现此问题,则此解决方法只是升级而css-loader无需禁用ES模块。