2

我计划将 Webpack 用于一个项目,并且我正在使用 Html-loader + file-loader 设置我的工作流程,以获取带有动态 src 的生产 html 文件,正如 Colt Steele 在此视频中所教的那样。这是我的 src/ 文件:

索引.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Popular on Letterboxd</title>
</head>
<body>
  <img src="./assets/chira.jpg" />
</body>
</html>

index.js:

import img from './assets/chira.jpg';
import "./main.css";

和 main.css

body {
  background-color: darkblue;
}

这些是我的配置文件(我有一个用于开发和生产的个人以及两者的共同点):

webpack.common.js:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: './src/index.js',

  devtool: "none",
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html'
    })
  ],
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          'style-loader',
          'css-loader'
        ],
      },
      {
        test: /\.html$/,
        use: ["html-loader"]
      },
      {
        test: /\.(png|jpe?g|gif|svg)$/i,
        use: [
          {
            loader: 'file-loader',
            options: {
              name: '[name].[hash].[ext]',
              publicPath: 'assets',
              outputPath: 'assets/img'
            }
          }
        ]
      }
    ],
  },
};

webpack.dev.js:

const path = require('path');
const common = require("./webpack.common");
const merge = require('webpack-merge');

module.exports = merge(common, {
  mode: "development",
  devServer: {
    contentBase: path.join(__dirname, 'src'),
  },
  output: {
    filename: "main.js",
    path: path.resolve(__dirname, "dist")
  },
});

和 webpack.prod.js:

const path = require('path');
const common = require("./webpack.common");
const merge = require('webpack-merge');


module.exports = merge(common, {
  mode: "production",
  output: {
    filename: "main.[contentHash].js",
    path: path.resolve(__dirname, "dist")
  },
});

但是,当我运行 npm run build 时,它会执行以下命令:

"build": "webpack --config webpack.prod.js"

我得到了带有 assets/img/[name].[hash].[ext] 的预期 dist 文件夹,但是在我的 index.html 中我没有得到预期的 src 标签:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Popular on Letterboxd</title>
</head>
<body>
  <img src="[object Module]" />
<script type="text/javascript" src="main.e55bd4ff82bf2f5cec90.js"></script></body>
</html>

我一直在尝试解决这个问题一段时间,但我似乎无法在任何地方得到正确的答案,到目前为止我尝试过的任何方法都没有奏效。如果遇到此问题的任何人都可以解决他们如何解决它,或者如果有人知道问题可能是什么以及我能做什么,我将不胜感激。提前致谢!

4

2 回答 2

2

如果文件加载器版本是 5.0,那么。在文件加载器上添加另一个选项为“esModule:false”将解决此问题。

{
    test: /\.(png|jpe?g|gif|svg)$/i,
    use: [
      {
        loader: 'file-loader',
        options: {
          name: '[name].[hash].[ext]',
          publicPath: 'assets',
          outputPath: 'assets/img',
          esModule: false
        }
      }
    ]
  }
于 2019-11-27T09:15:51.497 回答
0

如果您使用的是 webpack 5 或更高版本,则不推荐使用file-loader文件加载器文档 您可以改用该模块asset/resource。删除您的file-loader规则并将以下规则添加到 webpack.common.js 中的模块

module: {
    rules: [
        {
            test: /\.(png|jpe?g|gif|svg)$/i,
            type: 'asset/resource'
        }
    ]
},

然后assetModuleFilenameoutput你的 webpack.prod.js 中添加

output: {
    assetModuleFilename: "assets/img/[name].[hash][ext]"
}

并保持你的html-loader规则在 webpack.common.js 中。

参考资产模块

于 2021-10-15T13:28:23.727 回答