【问题标题】:How can I stop HTML being output to the compiled app.js?如何停止将 HTML 输出到已编译的 app.js?
【发布时间】:2026-02-11 10:50:01
【问题描述】:

我将 Webpack 2 用于我的投资组合网站,但它不是 SPA - 因此,目的不是将所有内容输出到我捆绑的 JS 中。

我有几个 .pug.scss.js 文件的入口点。像这样:

entry: {
  app: [
    path.resolve(__dirname, 'src/pug/app.pug'),
    path.resolve(__dirname, 'src/js/app.js'),
    path.resolve(__dirname, 'src/scss/app.scss')
  ]
},
output: {
  path: path.resolve(__dirname, 'dist'),
  filename: 'js/[name].js'
}

但是,在查看 app.js 的源代码时,我会从我的 .pug 文件中看到呈现的 HTML。

对于.pug 编译,我使用的是HtmlWebpackPlugin。我想我解释发生了什么的最简单方法是向您展示webpack.config.babel.js 文件:

import webpack from 'webpack';
import path from 'path';
import autoprefixer from 'autoprefixer';
import HtmlWebpackPlugin from 'html-webpack-plugin';
import ExtractTextPlugin from 'extract-text-webpack-plugin';
import SvgStorePlugin from 'external-svg-sprite-loader/lib/SvgStorePlugin';
import bourbon from 'bourbon';
import neat from 'bourbon-neat';

const extractScss = new ExtractTextPlugin({
  filename: 'css/[name].css',
  allChunks: true
});

const config = {
  entry: {
    app: [
      path.resolve(__dirname, 'src/pug/app.pug'),
      path.resolve(__dirname, 'src/js/app.js'),
      path.resolve(__dirname, 'src/scss/app.scss')
    ]
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'js/[name].js'
  },
  module: {
    rules: [
      {
        test: /\.pug$/,
        use: [
          {
            loader: 'html-loader'
          },
          {
            loader: 'pug-html-loader',
            options: {
              pretty: false,
              exports: false
            }
          }
        ]
      },
      {
        test: /\.js$/,
        exclude: /(node_modules|bower_components)/,
        use: [
          {
            loader: 'babel-loader',
            options: {
              presets: [
                ['es2015']
              ]
            }
          }
        ]
      },
      {
        test: /\.(jpe?g|png|gif)$/i,
        use: [
          {
            loader: 'file-loader',
            options: {
              name: '/images/[name].[ext]'
            }
          },
          {
            loader: 'image-webpack-loader',
            options: {
              progressive: false,
              optipng: {
                optimizationLevel: 7,
                quality: '90',
                speed: 5
              },
              mozjpeg: {
                quality: 90
              },
              gifsicle: {
                interlaced: false
              }
            }
          }
        ]
      },
      {
        test: /\.svg$/,
        use: [
          {
            loader: 'external-svg-sprite-loader',
            query: {
              name: 'svg/sprite.svg',
              iconName: '[name]'
            }
          }
        ]
      },
      {
        test: /\.scss$/,
        use: extractScss.extract([
          {
            loader: 'css-loader'
          },
          {
            loader: 'postcss-loader',
            options: {
              plugins() {
                return [
                  autoprefixer({
                    browsers: ['last 2 versions', 'Explorer >= 9', 'Android >= 4']
                  })
                ];
              }
            }
          },
          {
            loader: 'sass-loader',
            options: {
              includePaths: [
                bourbon.includePaths,
                neat.includePaths
              ]
            }
          }
        ])
      }
    ]
  },
  devServer: {
    contentBase: path.join(__dirname, 'dist'),
    compress: true,
    stats: 'errors-only',
    open: false
  },
  plugins: [
    new SvgStorePlugin(),
    new HtmlWebpackPlugin({
      title: 'Portfolio',
      minify: {
        collapseWhitespace: true
      },
      hash: true,
      template: 'src/pug/app.pug',
      filetype: 'pug',
      filename: 'index.html'
    }),
    extractScss
  ]
}

process.traceDeprecation = false;

export default config;

我在app.js 捆绑包中看不到任何CSS,并且入口点设置相同,所以它可能与HtmlWebpackPlugin 本身有关吗?也许我不明白这是如何正常工作的,我的配置是错误的。

我是 Webpack 的新手(来自 Gulp),所以如果我的问题的答案似乎很明显,请多多包涵。

感谢您的帮助。

更新: 供参考,我的项目结构如下:

我会从/pug/components/example.pug 中的.pug 文件中调用一个图像,其路径类似于img(src="../images/example.jpg")。正如用户 Tatsuyuki 在下面建议的那样,这在删除 .pug 作为 Webpack 配置中的入口点之前有效。

【问题讨论】:

    标签: javascript webpack pug webpack-2 html-webpack-plugin


    【解决方案1】:

    不要将模板添加为源:

    app: [
      // path.resolve(__dirname, 'src/pug/app.pug'),
      path.resolve(__dirname, 'src/js/app.js'),
      path.resolve(__dirname, 'src/scss/app.scss')
    ]
    

    改为指定 HtmlWebpackPlugin 的模板选项:

    new HtmlWebpackPlugin({
      template: 'src/index.pug'
    })
    

    Reference

    【讨论】:

    • 虽然确实将其从 app.js 中删除,但现在 .pug 文件中的任何图像引用都不会通过。即图像标签中的 src 等。那里有什么想法吗?谢谢。
    • 请说明资产的放置位置以及引用方式。
    • 谢谢 - 我已经在底部更新了我的问题,其中包含项目结构的屏幕截图和我使用的路径的说明。如果我运行 dist 或 dev server,这些图像将不再被拾取。也没有错误或警告。
    • 请尝试删除pug-html-loader 的冗余选项块。我不知道它是否能解决你的问题。
    • 恐怕删除它只会让事情变得更糟!呈现的 HTML 以纯文本形式输出到屏幕。