一、css代码分割

  1. const { merge } = require('webpack-merge');
  2. const commBase = require('./webpack.base');
  3. const autoprefixer = require('autoprefixer');
  4. const MiniCssExtractPlugin = require('mini-css-extract-plugin')
  5. const webpack_prod = {
  6. mode: 'production',
  7. // 开启tree shaking
  8. devtool: 'cheap-module-source-map',
  9. module: {
  10. rules: [
  11. {
  12. test: /\.css$/,
  13. use: [
  14. // 将css代码通过loader处理放入一个css文件中
  15. MiniCssExtractPlugin.loader,
  16. 'css-loader',
  17. {
  18. loader: 'postcss-loader',
  19. options: {
  20. postcssOptions: {
  21. plugins: [autoprefixer]
  22. }
  23. }
  24. }
  25. ]
  26. }
  27. ]
  28. },
  29. // 引入插件
  30. plugins: [new MiniCssExtractPlugin()]
  31. };
  32. module.exports = merge(commBase, webpack_prod);
  1. const { merge } = require('webpack-merge');
  2. const commBase = require('./webpack.base');
  3. const autoprefixer = require('autoprefixer');
  4. //分割css代码
  5. const MiniCssExtractPlugin = require('mini-css-extract-plugin');
  6. const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
  7. const webpack_prod = {
  8. mode: 'production',
  9. // 开启tree shaking
  10. devtool: 'cheap-module-source-map',
  11. module: {
  12. rules: [
  13. {
  14. test: /\.css$/,
  15. use: [
  16. MiniCssExtractPlugin.loader,
  17. 'css-loader',
  18. {
  19. loader: 'postcss-loader',
  20. options: {
  21. postcssOptions: {
  22. plugins: [autoprefixer]
  23. }
  24. }
  25. }
  26. ]
  27. }
  28. ]
  29. },
  30. optimization: {
  31. splitChunks: {
  32. cacheGroups: {
  33. styles: {
  34. name: 'styles',
  35. test: /\.css$/,
  36. chunks: 'all',
  37. enforce: true
  38. }
  39. }
  40. },
  41. minimize: true,
  42. minimizer: [new CssMinimizerPlugin()]
  43. },
  44. plugins: [
  45. new MiniCssExtractPlugin({
  46. filename: '[name].css'
  47. })
  48. ]
  49. };
  50. module.exports = merge(commBase, webpack_prod);
  1. {
  2. "name": "01.test",
  3. "version": "1.0.0",
  4. "description": "",
  5. "sideEffects": [
  6. "*.css"
  7. ],
  8. "main": "index.js",
  9. "scripts": {
  10. "build": "webpack --config ./build/webpack.prod.js",
  11. "dev": "webpack-dev-server --config ./build/webpack.dev.js",
  12. "dev:build": "webpack --config ./build/webpack.dev.js"
  13. },
  14. "keywords": [],
  15. "author": "",
  16. "license": "ISC",
  17. "devDependencies": {
  18. "@babel/cli": "^7.18.6",
  19. "@babel/core": "^7.18.6",
  20. "@babel/preset-env": "^7.18.6",
  21. "@babel/preset-react": "^7.18.6",
  22. "autoprefixer": "^7.0.0",
  23. "babel-loader": "^8.2.5",
  24. "clean-webpack-plugin": "^3.0.0",
  25. "core-js": "^3.23.3",
  26. "css-loader": "^5.2.7",
  27. "css-minimizer-webpack-plugin": "^1.3.0",
  28. "file-loader": "^6.2.0",
  29. "html-webpack-plugin": "^4.5.2",
  30. "mini-css-extract-plugin": "^1.6.2",
  31. "node-sass": "^5.0.0",
  32. "postcss-loader": "^4.3.0",
  33. "react": "^18.2.0",
  34. "react-dom": "^18.2.0",
  35. "sass-loader": "^10.3.0",
  36. "style-loader": "^2.0.0",
  37. "url-loader": "^3.0.0",
  38. "vue-loader": "^15.6.0",
  39. "webpack": "^4.46.0",
  40. "webpack-cli": "^3.3.12",
  41. "webpack-dev-server": "^3.11.3",
  42. "webpack-merge": "^5.0.0"
  43. },
  44. "dependencies": {
  45. "@babel/polyfill": "^7.12.1",
  46. "lodash": "^4.17.21"
  47. }
  48. }

使用两个插件:

:::info

  1. mini-css-extract-plugin: 将css代码提取出来,放入一个文件中,通过link标签引入
  2. css-minimizer-webpack-plugin: 将代码压缩,合并相同 css 选择器的配置 :::

    1.1 MiniCssExtractPlugin插件:

    缺点:main.js引入的两个css文件:
    image.png
    image.png
    image.png :::info 打包生成的**dist**文件夹下的 css 代码(**production**

  3. 没有进行合并,

  4. 也没有进行压缩,增大产出代码体积 ::: image.png :::info 通过CssMinimizerPlugin插件可以解决代码合并,压缩代码: ::: 将css代码放入一个文件中:
    将模块中的 import 'index.css' 引入的css文件代码,打包到一个css文件中,通过在index.html 中 通过 <link href='xx'> 的方式,进行引入
    "css-minimizer-webpack-plugin": "^1.3.0",
    "mini-css-extract-plugin": "^1.6.2",
    // 将css代码在production环境中,打包到一个文件中
    optimization: {
    splitChunks: {
      cacheGroups: {
        styles: {
          name: 'styles',
            test: /\.css$/,
              chunks: 'all',
                enforce: true
        }
      }
    },
    
    image.png
    使用插件在production环境打包之后,css引入方式为:<link href="xxx"/>,方式,将css代码打包到一个.css 文件中,在引入页面
    image.png
    image.png

    1.2 打包后压缩css代码:(CssMinimizerPlugin)

    1.2.1 css-minimizer-webpack-plugin

    打包时,压缩代码的同时,还会对**css**代码中相同的配置,进行合并
    image.pngimage.png
    image.png
    将所有的css文件提取到一个css文件中,改变默认名称的配置image.png

1.2 合并css代码如下:

image.png
image.png
打包后的css代码如下:
image.png

注意:

  1. **production**生产环境下打包

在webpack打包时:如果import xx from xx时未使用,会被tree-shaking掉,不进行打包,出现如下情况:
image.pngimage.png
页面中并未生效:引入的css文件被tree-shaking掉了
image.png

解决:

package.json中告诉webpack哪些文件在打包时不需要:tree-shaking
image.png