【问题标题】:Webpack - Bundle multiple/different versions of .css filesWebpack - 捆绑多个/不同版本的 .css 文件
【发布时间】:2019-12-01 17:11:20
【问题描述】:

我想让 Webpack 生成的捆绑的 .css 文件更具可配置性,这样我就可以输出不同的“版本”——基于同一个 .css 文件——让开发人员在未来从事我的项目的生活更加美好更轻松。

我希望有以下步骤:

  1. 将所有 SCSS 连接到 CSS (bundle.css)
  2. 最小化步骤 1 的输出 (bundle.min.css)
  3. 嵌入第 2 步中的所有图像 (bundle.b64.min.css)
  4. 嵌入第 3 步中的所有字体 (bundle.bs64.fonts.min.css)

最后 - 在我的构建过程之后 - 我的 dist 文件夹中有 4 个不同的文件。那我可以吗?

按照我目前的做法,我为每个步骤运行不同的脚本 - 删除 dist 文件夹,遍历项目,生成输出。我希望有一个脚本可以一次完成所有操作,而不必遍历我的项目 4 次。

我在这里找到了解决方案:

Webpack Extract-Text-Plugin Output Multiple CSS Files (Both Minified and Not Minified)

但是,对于我的具体情况,我必须在一个数组中返回 4 个不同的配置,而不是单个对象。

【问题讨论】:

  • 您希望将资产(图像等)捆绑到单个捆绑 css 文件中吗? (我不知道这是否可能)。我使用文件加载器来加载文件。
  • also: :warning: Since webpack v4 the extract-text-webpack-plugin should not be used for css. Use mini-css-extract-plugin instead. 来自文档,所以不要使用它。
  • 您提到的内容在webpackjs 文档中得到了相当详尽的介绍,包括指南和插件参考。对于步骤 1 和 2,您需要插件 mini-css-extract-plugin 对于步骤 3 和 4,您需要使用 file-loader 处理资产。 webpackjs 文档中的这两个插件。
  • 对于您的第一个问题:是的,我希望发生这种情况(这甚至可能吗?)。我也在为我当前的代码使用文件加载器。第二:谢谢你告诉我! (我正在使用 mini-css-extract-plugin)。我明白你在说什么。我可以通过运行不同的脚本来生成这些步骤。但我希望能够一口气完成所有 4 个步骤。 您能对此发表评论吗?
  • 首先:我不知道是否可以将资产编译成一个捆绑的 css 文件(也许可以,但我没听说过)。秒:您使用的是config.webpack.js 文件吗?

标签: javascript webpack mini-css-extract-plugin


【解决方案1】:

好的,根据我们的评论对话,我将为您提供步骤 1-4 的工作流程,但使用常规资产处理,而不是资产捆绑(我没听说过,但也许其他人可以在那里详细说明)。

那么步骤:

  1. 将所有 scss 文件打包成 1 个 bundle.css
  2. 确保此捆绑包已缩小
  3. 添加资产管理以构建图像
  4. 添加资产管理以构建字体

重要的事情:

此工作流程基本上是通过配置构建的。用package.json 文件配置npm 脚本,用config.webpack.js 配置webpack。这将允许您简单地运行 1 个命令来构建您的项目:npm run build注意:为简单起见,我将忽略生产/开发/等环境并专注于单一环境。

package.json:

这用于设置当您在终端中输入npm run build 时实际运行的命令(当然来自项目dir)。

因为我们现在避免使用不同的环境,而且你没有使用 Typescript,所以这是一个非常简单的配置:

"scripts": {
    "build": "webpack",
  },

这就是您必须添加的全部内容。现在听起来很愚蠢,但是当项目变得更加复杂时,您会喜欢这些脚本,所以最好开始制作它们。

webpack.config.js: 主要提升将在此配置文件中进行。这基本上告诉 webpack 当你运行它时要做什么(这就是 npm run build 正在做的事情)。

首先让我们安装一些插件:

  • npm install --save-dev file-loader
  • npm install --save-dev html-webpack-plugin
  • npm install --save-dev mini-css-extract-plugin
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  mode: 'production',
  devtool: 'source-map'
  entry: './client/src/app.jsx',
  output: {
    path: path.join(__dirname, 'client/dist/public'),
    filename: 'bundle.[hash].js'
  },
  module: {
    rules: [
      {
        test: /\.s?css$/,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              hmr: false
            }
          },
          'css-loader',
          'sass-loader'
        ]
      },
      {
        test: /\.(png|svg|jpg|gif)$/,
        use: ['file-loader']
      },
      {
        test: /\.(woff|woff2|eot|ttf|otf)$/,
        use: [
          'file-loader'
        ]
      }
    ]
  },
  resolve: {
    extensions: ['.js', '.json', '.jsx']
  },
  plugins: [
    new HtmlWebpackPlugin({
      filename: 'index.html',
      template: './client/src/index_template.html'
    }),
    new MiniCssExtractPlugin({
      filename: 'style.[hash].css',
      chunkFilename: '[id].[hash].css'
    }),
  ]
};

请注意,我添加了 htmlWebpackPlugin,因为它可以更轻松地自动引用正确的散列包。此外,我假设该应用程序是一个反应应用程序,但您可以将入口点更改为您的应用程序加载的位置。

如果不进行测试,这是很难做到的,但我希望这可以为您提供足够的参考,让您了解应该改变什么以及如何去做。

我再次强烈推荐webpack.js guides and documentation,它们非常彻底,一旦你开始掌握它,事情就会开始顺利进行。

【讨论】:

  • 感谢您的帮助,尽管它仍然不能帮助我解决我提出的问题,因为这不是我在帖子中所问的......我已经阅读了文档并清理了论坛寻求解决方案,并且只找到了一个解决方案(我已经在上面发布),这是不切实际的,因为我需要一个具有 4 个不同配置的数组。最初我认为这是不可能的,因为我不知道 Webpack 是否应该以这种方式工作......但问一下也无妨,对吧?
  • @yagosansz 您能否分享一些代码,尤其是两个配置文件?也许我会更好地理解你的问题。您提到了 4 个脚本,但没有共享它们。这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2018-08-23
  • 2017-09-19
  • 2020-01-10
  • 2017-02-27
  • 1970-01-01
  • 2018-05-12
  • 2018-11-22
相关资源
最近更新 更多