【问题标题】:file-loader for webpack is not moving the src folder image files to dist folderwebpack 的文件加载器没有将 src 文件夹图像文件移动到 dist 文件夹
【发布时间】:2026-02-16 00:00:01
【问题描述】:
{
        test: /\.(png|jpg|gif)$/,
        loader: 'file-loader?name=img/img-[hash:6].[ext]',
      },

我将此配置添加到webpack.config.js 以利用file-loader 通过将上述规则添加到

module: {
    rules: [

部分,但没有图像文件移动到dist/ 文件夹,即使我将图像文件放入src/images/。有什么我错过的东西需要添加到 webpack 配置中吗?

我正在学习https://julienrenaux.fr/2015/03/30/introduction-to-webpack-with-practical-examples/的例子

顺便说一句,我正在使用 webpack 2... 现在有不同的方式来配置文件加载器吗?

这是整个 webpack 配置文件

const { resolve } = require('path');

const webpack = require('webpack');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const OpenBrowserPlugin = require('open-browser-webpack-plugin');

const config = {
  devtool: 'cheap-module-eval-source-map',

  entry: [
    'react-hot-loader/patch',
    'webpack-dev-server/client?http://localhost:8080',
    'webpack/hot/only-dev-server',
    './main.js',
    './assets/scss/main.scss',
  ],

  output: {
    filename: 'bundle.js',
    path: resolve(__dirname, 'dist'),
    publicPath: '/',
  },

  context: resolve(__dirname, 'app'),

  devServer: {
    hot: true,
    contentBase: resolve(__dirname, 'dist'),
    publicPath: '/',
  },

  module: {
    rules: [
      {
        test: /\.js$/,
        loaders: [
          'babel-loader',
        ],
        exclude: /node_modules/,
      },
      {
        test: /\.scss$/,
        exclude: /node_modules/,
        use: ExtractTextPlugin.extract({
          fallback: 'style-loader',
          use: [
            'css-loader',
            {
              loader: 'sass-loader',
              query: {
                sourceMap: false,
              },
            },
          ],
        }),
      },
      { test: /\.(png|jpg)$/, use: 'url-loader?limit=15000' },
      { test: /\.eot(\?v=\d+.\d+.\d+)?$/, use: 'file-loader' },
      { test: /\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/, use: 'url-loader?limit=10000&mimetype=application/font-woff' },
      { test: /\.[ot]tf(\?v=\d+.\d+.\d+)?$/, use: 'url-loader?limit=10000&mimetype=application/octet-stream' },
      { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, use: 'url-loader?limit=10000&mimetype=image/svg+xml' },
      {
        test: /\.(png|jpg|gif)$/,
        loader: 'file-loader?name=img/img-[hash:6].[ext]',
      },
    ],
  },

  plugins: [
    new ExtractTextPlugin({ filename: 'style.css', disable: false, allChunks: true }),
    new CopyWebpackPlugin([{ from: 'vendors', to: 'vendors' }]),
    new OpenBrowserPlugin({ url: 'http://localhost:8080' }),
    new webpack.HotModuleReplacementPlugin(),
  ],
};

module.exports = config;

【问题讨论】:

    标签: webpack webpack-2 webpack-file-loader


    【解决方案1】:

    它在您所遵循的示例中显示:

    您现在可以使用require('./src/image_big.jpg') 获取任何图像文件;

    如果你不在某处导入图像,webpack 不会复制它们,因为它只会将 file-loader 应用于它看到的导入并匹配你的规则。您也可以使用url 在 Sass 中导入它们,例如:

    background-image: url('./src/image.jpg');
    

    .png.jpg 也有两条规则:

    { test: /\.(png|jpg)$/, use: 'url-loader?limit=15000' },
    {
      test: /\.(png|jpg|gif)$/,
      loader: 'file-loader?name=img/img-[hash:6].[ext]',
    },
    

    选择其中之一。因为现在它会同时应用两者,但只有其中一个真正被使用,所以当图像大于 15kb 时,您最终会得到两个图像,因为当文件大于配置的限制时,url-loader 将回退到file-loader .

    【讨论】:

      【解决方案2】:

      使用以下 sn-p 要求 src/images/(或您的图像所在的任何位置)下的所有文件在 main.js 内:

      // load assets
      function requireAll(r) { r.keys().forEach(r); }
      requireAll(require.context('src/images/', true));
      

      这将使 Webpack 处理位于该文件夹内的所有文件。

      【讨论】:

      • 哥们,你救了我的命!我跑遍了整个互联网,发现了所有的 webpack.config.js 设置,这个简单的功能就足够了!非常感谢
      【解决方案3】:

      参考:https://angular.io/docs/ts/latest/guide/webpack.html

      我建议尝试上面引用的指南。请注意,您需要运行以下命令才能使其正常工作:

      npm install --save-dev karma-jasmine-html-reporter
      

      关于您的问题,上述示例指南中的图片是通过 html 文件的 <img> 标签引用的。这个<img> 引用被 webpack 拾取,图像文件被放置在一个资产目录中,该目录已在输出“dist/”文件夹中创建:

      “app.component.html”:

      <main>
          <h1>Hello from Angular App with Webpack</h1>
          <img src="../assets/images/angular.png">
      </main>
      

      这是他们的 webpack 配置文件和他们的加载器:

      “webpack.conf.js”:

      var webpack = require('webpack');
      var HtmlWebpackPlugin = require('html-webpack-plugin');
      var ExtractTextPlugin = require('extract-text-webpack-plugin');
      var helpers = require('./helpers');
      
      module.exports = {
          entry: {
              'polyfills': './src/polyfills.ts',
              'vendor': './src/vendor.ts',
              'app': './src/main.ts'
          },
      
          resolve: {
              extensions: ['.ts', '.js']
          },
      
          module: {
              rules: [
                  {
                      test: /\.ts$/,
                      loaders: [
                          {
                              loader: 'awesome-typescript-loader',
                              options: { configFileName: helpers.root('src', 'tsconfig.json') }
                          } , 'angular2-template-loader'
                      ]
                  },
                  {
                      test: /\.html$/,
                      loader: 'html-loader'
                  },
                  {
                      test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)$/,
                      loader: 'file-loader?name=assets/[name].[hash].[ext]'
                  },
                  {
                      test: /\.css$/,
                      exclude: helpers.root('src', 'app'),
                      loader: ExtractTextPlugin.extract({ fallbackLoader: 'style-loader', loader: 'css-loader?sourceMap' })
                  },
                  {
                      test: /\.css$/,
                      include: helpers.root('src', 'app'),
                      loader: 'raw-loader'
                  }
              ]
          },
      
          plugins: [
              // Workaround for angular/angular#11580
              new webpack.ContextReplacementPlugin(
                  // The (\\|\/) piece accounts for path separators in *nix and Windows
                  /angular(\\|\/)core(\\|\/)(esm(\\|\/)src|src)(\\|\/)linker/,
                  helpers.root('./src'), // location of your src
                  {} // a map of your routes
              ),
      
              new webpack.optimize.CommonsChunkPlugin({
                  name: ['app', 'vendor', 'polyfills']
              }),
      
              new HtmlWebpackPlugin({
                  template: 'src/index.html'
              })
          ]
      };
      

      【讨论】: