【问题标题】:Html Web Pack Plugin inject hash css into htmlHtml Webpack Plugin 将 hash css 注入 html
【发布时间】:2020-07-27 13:46:37
【问题描述】:

我正在尝试将 css 文件注入到我的 index.html 中。目前我的网络包执行以下操作

  1. 将我的 SASS 转换为 CSS
  2. 用哈希命名 css 文件(例如 optionA-32d6cb.css)
  3. 放入 ./dist 文件夹

文件夹结构的输出:

- Dist
   - OptionA
        - optionA-hash.css

   - OptionB
        - optionB-hash.css

   - index.html //How to inject above css into this file?

我是 HtmlWebpackPlugin 的新手,我的问题是如何将上述动态 css 文件注入 index.html?所以在头部我有以下内容:

<link href="optionA-32d6cb.css" rel="stylesheet">
<link href="optionB-w2d6cb.css" rel="stylesheet">

我的 webpack.config.js 文件:

module.exports ={
entry: ['path_to_scss_file'],// SASSfile which contains import statment with wildcard to get all sass in given directory
output: {
    filename: "[name].min.js",
    path: path.resolve(__dirname, 'dist/'),
},
plugins:[
    new HtmlWebpackPlugin({
        template: './src/index.html'
    })
],
module:{
    rules: [
        {
            test: /\.scss$/,
            use: [
                {
                    loader: 'file-loader',
                    options:{
                        name:'[name]/[name]-[contenthash].css',
                    }
                },
                {
                    loader: 'sass-loader',
                    options: {
                      sassOptions: {
                             importer: globImporter(), 
                     //my sass files uses wildcard to import all sass files
                      },
                     },
                }
            ]
        }
    ]
}

【问题讨论】:

    标签: webpack html-webpack-plugin


    【解决方案1】:

    您可以使用webpack-manifest-plugin 来解决这个问题,这将在 dist/ 文件夹中创建一个 manifest.json 文件。

    manifest.json 文件将包含所有这样的映射

    {
        "app.css": "css/app.dc4d6b6c65b4f5ff351e.css"
    }
    

    然后使用HtmlWebpackPlugin,它会在你每次构建时完成工作,它会通过引用manifest.json将正确的文件注入index.html

    请参阅 https://github.com/anandgupta193/react-enterprise-starter-kit 以获取 webpack/webpack.common.config.js 文件中的确切工作实现。 (使用 node 12.x 在入门工具包中创建构建)

    注意:从 index.html 模板中删除您的脚本和链接标签,它将自动注入。

    【讨论】:

    • 感谢评论,manifest.json文件是如何链接到index.html的。我没有在你的代码那部分看到它?我能够在 dist 上生成清单,其中包含您的答案中显示的参考,但它没有链接到 index.html
    • HtmlWebpackPlugin 使用正确的 HTML 标签自动注入所有资产(例如 bundle.js、main.css)。请从您的模板 HTML 中删除所有脚本和链接标签(请参阅:react-enterprise-starter-kit 中的 public/index.html)另外,尝试在您的 HtmlWebpackPlugin 配置对象中添加 inject: true 选项。
    • 还是不行,你可以看看我的作品吗?我为你创建了一个链接dropbox.com/t/kq47CfdoXAH0yW7G
    • 您处理 SCSS 文件的方式存在问题。 SCSS 文件需要 SCSS 加载器和 CSS 加载器才能最终将其转换为 CSS。此外,我们需要 ExtractCssChunks 插件来正确创建 CSS 块。请参考:dropbox.com/s/3cr4d40z9nkc1km/webpack-demo-solved.zip?dl=0 请看一下代码,如果这个问题解决了,请告诉我。
    • 出色的工作阿南德非常感谢,这好多了,但我希望不要将 css 合并为一个?我怎样才能让每个文件名都有 css,所以它的 app.css 和 legacy.css?它应该根据 sass 文件名匹配?
    【解决方案2】:

    entry 的值应该是 .js 文件的路径:docs

    我建议使用mini-css-extract-plugin。 它会将您的 CSS 提取到单独的文件中

    那么你的 webpack.config 可能如下所示:

    'use strict';
    
    const path = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    const MiniCssExtractPlugin = require('mini-css-extract-plugin');
    
    module.exports = {
      entry: {
        app: './main.js',
      },
      output: {
        path: path.resolve(__dirname, './dist'),
        filename: '[name].[hash].js',
      },
      module: {
        rules: [
          {
            test: /\.(scss|css)$/,
            use: [
              MiniCssExtractPlugin.loader,
              'css-loader',
              'sass-loader',
            ],
          },
        ],
      },
      plugins: [
        new MiniCssExtractPlugin(),
        new HtmlWebpackPlugin({
          template: path.join(__dirname, './index.html'),
        }),
      ],
    };
    
    

    main.js

    import './style.scss';
    

    style.scss

    body {
      background: #fefefe;
    }
    

    如果您希望您的 css 文件位于 /dist 文件夹中的特殊路径中,您可以为插件定义 options

    【讨论】:

    • 这对我不起作用,因为我在我的 sass 文件中使用 globbing 来导入给定目录中的所有 sass。我目前在我的 sass-loader 中使用 GlobImporter,上面会失败,因为它不尊重通配符 (*)
    • 你可以用 webpack 的 require.context 替换你的 glob 导入:webpack.js.org/guides/dependency-management/#requirecontext 然后这个设置就可以了,你不必显式地导入每个文件
    • 你有一个例子来说明如何实现这一点,因为我是 webpack 的新手,不完全确定如何使用这个上下文作为 webpack 配置的一部分
    • 使用 require.context,您可以在脚本中导入所有 .scss 文件,例如:main.js ``` const context = require.context('./styles', false, /\. scss$/); ```
    • 使用require.context,您可以在脚本中导入所有.scss:main.jsconst context = require.context('./styles', false, /\.scss$/); context.keys().map(context); 这里也是一个示例:webpack.js.org/guides/dependency-management/#context-module-api
    猜你喜欢
    • 1970-01-01
    • 2018-02-25
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 2019-02-10
    • 2019-12-18
    相关资源
    最近更新 更多