mini-css-extract-plugin插件快速入门

前言

webpack 4.0以前,我们通过extract-text-webpack-plugin插件,把css样式从js文件中提取到单独的css文件中。extract-text-webpack-plugin插件的优缺点:

image.png更多介绍请看移步: webpack.docschina.org/plugins/ext…

 

webpack 4.0以后,官方推荐使用mini-css-extract-plugin插件来打包css文件(从css文件中提取css代码到单独的文件中,对css代码进行代码压缩等)。

使用方法

把所有配置文件放到项目的根目录下,运行package.json中的命令即可。当然,webpack的入口、出口等基础配置还需自行参照官网文档完成配置。

为了更贴近实际应用场景,本次采用三个配置文件,分别讲解它们的配置以及注意事项。

webpack.common.js (公共配置文件)

  • 开发环境和生产环境共用的配置,借助webpack-merge插件,可以merge到开发或生产环境,从而减少重复配置。
  • 引入了Node环境变量process.env.NODE_ENV,可以根据传入的环境参数,动态更改配置,具体请看代码。
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const devMode = process.env.NODE_ENV !== 'production'

module.exports = {
  module: {
    rules: [
      {
        test: /\.(sa|sc|c)ss$/,  // 可以打包后缀为sass/scss/css的文件
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              // 这里可以指定一个 publicPath
              // 默认使用 webpackOptions.output中的publicPath
              // publicPath的配置,和plugins中设置的filename和chunkFilename的名字有关
              // 如果打包后,background属性中的图片显示不出来,请检查publicPath的配置是否有误
              publicPath: './',  
              // publicPath: devMode ? './' : '../',   // 根据不同环境指定不同的publicPath
              hmr: devMode, // 仅dev环境启用HMR功能
            },
          },
          'css-loader',
          'sass-loader'
        ],
      },
    ]
  },
  plugins: [
    new MiniCssExtractPlugin({
      // 这里的配置和webpackOptions.output中的配置相似
      // 即可以通过在名字前加路径,来决定打包后的文件存在的路径
      filename: devMode ? 'css/[name].css' : 'css/[name].[hash].css',
      chunkFilename: devMode ? 'css/[id].css' : 'css/[id].[hash].css',
    })
  ]
}
复制代码

webpack.dev.js(dev环境的配置文件)

  • dev环境的配置,记得把mode设置为development模式,否则webpack4会默认为production模式。
const merge = require('webpack-merge')
const common = require('./webpack.common')
const webpack = require('webpack')

module.exports = merge(common, {
  mode: 'development'
})

复制代码

webpack.prod.js(生产环境的配置文件)

  • 生产环境的配置,默认开启tree-shaking和js代码压缩;
  • 通过optimize-css-assets-webpack-plugin插件可以对css进行压缩,与此同时,必须指定js压缩插件(例子中使用terser-webpack-plugin插件),否则webpack不再对js文件进行压缩;
  • 设置optimization.splitChunks.cacheGroups,可以将css代码块提取到单独的文件中。
const path = require('path')
const merge = require('webpack-merge')
const common = require('./webpack.common')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const TerserJSPlugin = require('terser-webpack-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');

module.exports = merge(common, {
  mode: 'production', 
  optimization: {
    minimizer: [new TerserJSPlugin({}), new OptimizeCSSAssetsPlugin({})],
    splitChunks: {
      cacheGroups: {
        styles: {
          name: 'styles',
          test: /\.css$/,
          chunks: 'all',
          enforce: true,
        },
      }
    },
  }
})
复制代码

package.json配置文件

  • sideEffects: 生产环境打包的时候,会默认开启tree-shaking,如果不设置sideEffects,某些通过import方式引入的css文件可能不会被打包,因为tree-shaking会甩掉没有导出任何东西(即文件中没有export关键字)的文件。所以,不希望被tree-shaking的文件,请在sideEffects中配置与之匹配的正则表达式(如下,在package.json中添加)。
  • NODE_ENV: 由于项目中用到了Node的环境变量,所以打包时需通过NODE_ENV传入环境变量。这里的配置在macOS操作是没有问题的,Windows系统的小伙伴,可以安装一个叫cross-env的npm包,使用方法(安装npm i cross-env -S,在命令前添加"cross-env",例如:"scriipt":{ "dev": "cross-env NODE_ENV=development webpack --config webpack.dev.js --progress" })。
{
  "sideEffects": [
    "*.css",
    "*.scss",
    "*.sass"
  ],
  "scripts": {
    "build": "NODE_ENV=production webpack --config webpack.prod.js --progress", // 生产环境打包
    "dev": "NODE_ENV=development webpack --config webpack.dev.js --progress", // dev环境打包
  },
}
复制代码

总结

  • 不同环境下的打包,如果出现图片显示不了时(特别是css中的图片),请检查publicPath的配置。
  • mode: 'production'会开启tree-shaking和js代码压缩,但配置optimization. minimizer会使默认的压缩功能失效。所以,指定css压缩插件的同时,务必指定js的压缩插件。
  • mini-css-extract-plugin插件,结合optimization.splitChunks.cacheGroups配置,可以把css代码打包到单独的css文件,且可以设置存放路径(通过设置插件的filenamechunkFilename)。

官方文档: webpack.js.org/plugins/min…


作者:linif002
链接:https://juejin.cn/post/6844903826630115335
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`mini-css-extract-plugin` 是一个 Webpack 插件,用于从 JavaScript bundle 中提取 CSS 到单独的文件中。与使用 `style-loader` 将 CSS 插入 `<style>` 标签不同,`mini-css-extract-plugin` 可以帮助您创建一个单独的 CSS 文件,该文件可以在浏览器中缓存,从而提高网站的性能和加载速度。 使用 `mini-css-extract-plugin` 非常简单。首先,您需要在 Webpack 配置文件中安装和导入插件: ```javascript const MiniCssExtractPlugin = require('mini-css-extract-plugin'); ``` 然后,您需要在插件配置中指定输出文件的名称和路径: ```javascript plugins: [ new MiniCssExtractPlugin({ filename: 'css/[name].[contenthash].css', }), ], ``` 在上面的代码中,`filename` 选项指定输出文件的名称和路径。`[name]` 会被替换为入口名称,`[contenthash]` 会被替换为根据文件内容生成的哈希值,这样可以确保每次构建生成的文件都有一个唯一的文件名。 最后,您需要在 Webpack 配置文件的加载器中使用 `mini-css-extract-plugin`,以便在构建期间从 JavaScript bundle 中提取 CSS: ```javascript module: { rules: [ { test: /\.css$/, use: [MiniCssExtractPlugin.loader, 'css-loader'], }, ], }, ``` 在上面的代码中,`MiniCssExtractPlugin.loader` 用于从 JavaScript bundle 中提取 CSS,`css-loader` 用于将 CSS 转换为 JavaScript 可以理解的模块格式。这些加载器可以根据您的需要进行修改,以便处理不同类型的 CSS。 以上是使用 `mini-css-extract-plugin` 的基本步骤。使用此插件可以帮助您提高网站的性能和加载速度,特别是对于大型网站和长时间运行的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值