Webpack 后端配置,用于在视图模板 HTML 页面中注入 bundle

Webpack backend configuration to inject the bundles in a view template HTML page

提问人:mercury 提问时间:11/12/2023 最后编辑:mercury 更新时间:11/12/2023 访问量:43

问:

我正在尝试将所有 js 文件捆绑到一个文件中,CSS 和资产也是如此。有些东西和 .[name][hash].jslaravel-mix

我看到所有打包器都生成了他们的文件。index.html

而我所需要的只是将生成的 css/JS 文件注入我的 rust askama 文件中。 但是这个想法适用于任何后端视图引擎,没有插件意味着很多痛苦。index.html

这是我的一个例子,它不会产生我需要的结果,即使它生成了自己的结果。webpack.config.jshtml-webpack-pluginindex.html/dist

import HtmlWebpackPlugin from 'html-webpack-plugin';

export default {
  mode: 'production',
  entry: '/assets/main.js',
  output: {
    filename: '[name].[contenthash].js',
  },
  module: {
    rules: [
      {
        test: /\.css$/i,
        use: ['style-loader', 'css-loader'],
      },
    ],
  },
  plugins: [new HtmlWebpackPlugin({ template: '/templates/index.html' })],
};

这是我的后端文件templates/index.html

<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>{% block title %}
    {{ title }}{% endblock %}
  </title>
  {% block head %}{% endblock %}
</head>

<body>
  <div id="app"></div>
  <div id="content">
    {% block content %}
    <p>Dashboard</p>
    {% endblock %}
  </div>
</body>

</html>

我搜索了 rollup 和 vite,但这个想法很困难,我看到所有这些打包器都以不容易配置的方式工作。

Webpack Rust Vite 汇总

评论


答:

1赞 biodiscus 11/12/2023 #1

您可以使用现代的“html-bundler-webpack-plugin”。 该插件解析任何 HTML 模板中的图像、字体、样式、脚本等的所有源文件。 解析的引用可以替换为其输出文件名或注入到 HTML 模板中。

例如,直接添加样式和脚本源文件是您的 HTML 模板:

<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>{% block title %}
    {{ title }}{% endblock %}
  </title>

  <!-- specify source files directly in HTML, relative to this file 
       or use webpack alias -->
  <link href="../assets/styles.scss" rel="stylesheet">
  <script src="../assets/main.js" defer="defer"></script>

  {% block head %}{% endblock %}
</head>

<body>
  <div id="app"></div>
  <div id="content">
    {% block content %}
    <p>Dashboard</p>
    {% endblock %}
  </div>

  <!-- source image file relative to this HTML file -->
  <img src="../assets/images/picture.png">
</body>

</html>

webpack.config.js

import HtmlBundlerPlugin from 'html-bundler-webpack-plugin';

export default {
  mode: 'production',
  output: {
    // define the `path` as output directory of processed templates, defaults is `dist/`
  },
  plugins: [
    new HtmlBundlerPlugin({
      entry: {
        // define templates here
        // the key is output file path w/o extension, e.g.:
        index: 'templates/index.html', // => dist/index.html
        // - OR -
        'templates/index': 'templates/index.html', // => dist/templates/index.html
      },
      js: {
        // output filename of JavaScript, when inline is false (defaults)
        // filename: '[name].[contenthash:8].js',
        inline: true, // <= inject JS into HTML template
      },
      css: {
        // output filename of CSS, when inline is false (defaults)
        // filename: '[name].[contenthash:8].css',
        inline: true, // <= inject CSS into HTML template
      },
      // defaults used Eta (ESJ like) template engine to render into HTML
      preprocessor: false, // <= disable rendering into HTML to keep original template content
    }),
  ],
  module: {
    rules: [
      {
        test: /\.s?css$/i,
        use: ['css-loader', 'sass-loader'], // <= use SCSS to create one bundle file from many (S)CSS files
      },
      {
        test: /\.(ico|png|jp?g|webp|svg)$/,
        type: 'asset/inline', // <= inline images in their issuers (HTML, CSS)
      },
    ],
  },
};

如果要保留原始模板内容并且仅保留内联 JS/CSS/图像,请使用插件选项禁用渲染。preprocessor: false

如果您要将任何模板渲染为 HTML,则可以使用“开箱即用”支持的模板引擎之一:EtaEJSHandlebarsNunjucksLiquidJS

处理后的模板将如下所示:

<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>{% block title %}
    {{ title }}{% endblock %}
  </title>

  <style>
    /* inlined CSS */
  </style>

  <script>
    /* inlined JS */
  </script>

  {% block head %}{% endblock %}
</head>

<body>
  <div id="app"></div>
  <div id="content">
    {% block content %}
    <p>Dashboard</p>
    {% endblock %}
  </div>

  <!-- inlined image (can be PNG, JPG, SVG, etc.) -->
  <img src="data:image/png;base64,iVBORw...">
</body>

</html>

看:

P.S. 您可以使用您的基本项目文件创建一个小型存储库,我可以帮助您配置它。