webpack4 mini-css-extract-plugin-程序员宅基地

技术标签: ViewUI  webpack  javascript  

在使用webpack的extract-text-webpack-plugin插件提取单独打包css文件时,报错,说是这个插件要依赖webpack3的版本。
webpack4得使用mini-css-extract-plugin这个插件来单独打包css。下面是使用方法:


将CSS提取为独立的文件的插件,对每个包含css的js文件都会创建一个CSS文件,支持按需加载css和sourceMap

只能用在webpack4中,对比另一个插件 extract-text-webpack-plugin有点:

  • 异步加载
  • 不重复编译,性能更好
  • 更容易使用
  • 只针对CSS

目前缺失功能,HMR。

安装:

npm install --save-dev mini-css-extract-plugin

使用:

const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
  plugins: [
    new MiniCssExtractPlugin({
      // 类似 webpackOptions.output里面的配置 可以忽略
      filename: '[name].css',
      chunkFilename: '[id].css',
    }),
  ],
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              // 这里可以指定一个 publicPath
              // 默认使用 webpackOptions.output中的publicPath
              publicPath: '../'
            },
          },
          'css-loader',
        ],
      }
    ]
  }
}

高级配置示例:

这个插件应该只用在 production 配置中,并且在loaders链中不使用 style-loader, 特别是在开发中使用HMR,因为这个插件暂时不支持HMR

const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const devMode = process.env.NODE_ENV !== 'production';

module.exports = {
  plugins: [
    new MiniCssExtractPlugin({
      filename: devMode ? '[name].css' : '[name].[hash].css',
      chunkFilename: devMode ? '[id].css' : '[id].[hash].css',
    })
  ],
  module: {
    rules: [
      {
        test: /\.(sa|sc|c)ss$/,
        use: [
          devMode ? 'style-loader' : MiniCssExtractPlugin.loader,
          'css-loader',
          'postcss-loader',
          'sass-loader',
        ],
      }
    ]
  }
}

production 阶段进行压缩

webpack5可能会内置CSS 压缩器,webpack4需要自己使用压缩器,可以使用 optimize-css-assets-webpack-plugin 插件。 设置 optimization.minimizer 覆盖webpack默认提供的,确保也指定一个JS压缩器

const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');

module.exports = {
  optimization: {
    minimizer: [
      new UglifyJsPlugin({
        cache: true,
        parallel: true,
        sourcMap: true
      }),
      new OptimizeCSSAssetsPlugin({}),
    ],
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: "[name].css",
      chunkFilename: "[id].css"
    }),
  ],
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader'
        ]
      }
    ]
  }
}

将所有的CSS提取到一个文件中

和 extract-text-webpack-plugin 类似,可以使用 optimization.splitChunks.cacheGroups 将css提取到一个CSS中

const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
  optimization: {
    splitChunks: {
      cacheGroups: {
        styles: {
          name: 'styles',
          test: /\.css$/,
          chunks: 'all',
          enforce: true,
        },
      },
    },
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: '[name].css',
    }),
  ],
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader'
        ]
      }
    ]
  }
}

根据entry提取CSS

可以根据webpack 的entry name来提取CSS,这对你动态引入路由,却想依据entry保存打包的CSS的情况十分有用。这也解决了ExtractTextPlugin中CSS重复的问题

const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

function recursiveIssuer(m) {
  if (m.issuer) {
    return recursiveIssuer(m.issuer);
  } else if (m.name) {
    return m.name;
  } else {
    return false;
  }
}

module.exports = {
  entry: {
    foo: path.resolve(__dirname, 'src/foo'),
    bar: path.resolve(__dirname, 'src/bar')
  },
  optimization: {
    splitChunks: {
      cacheGroups: {
        fooStyles: {
          name: 'foo',
          test: (m,c,entry = 'foo') => m.constructor.name === 'CssModule' && recursiveIssuer(m) === entry,
          chunks: 'all',
          enforce: true
        },
        barStyles: {
          name: 'bar',
          test: (m,c,entry = 'bar') => m.constructor.name === 'CssModule' && recursiveIssuer(m) === entry,
          chunks: 'all',
          enforce: true
        }
      }
    }
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: "[name].css",
    })
  ],
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          MiniCssExtractPlugin.loader,
          "css-loader"
        ]
      }
    ]
  }
}

转载于:https://www.cnblogs.com/ysk123/p/9990082.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30808693/article/details/99108802

智能推荐

基于统计对齐的域适应方法(MMD,CMMD,CORAL,Wasserstein distance )_mmd[93](maximum mean discrepancy)-程序员宅基地

文章浏览阅读4.1k次,点赞6次,收藏63次。一:Maximum mean discrepancy (MMD)def mmd_rbf_noaccelerate(source, target, kernel_mul=2.0, kernel_num=5, fix_sigma=None): batch_size = int(source.size()[0]) kernels = guassian_kernel(source, target, kernel_mul=kernel_mu_mmd[93](maximum mean discrepancy)

探索React Native日历组件:一个强大且灵活的工具-程序员宅基地

文章浏览阅读393次,点赞5次,收藏6次。探索React Native日历组件:一个强大且灵活的工具项目地址:https://gitcode.com/christopherdro/react-native-calendarReact Native社区中的开发者们,你们是否在寻找一款功能丰富、易于定制的日历组件?如果你的答案是肯定的,那么你已经找到了你的目的地!本文将向您介绍Christopher Dro开发的react-native...

【数据分析】单个csv文件导入与输出,多个csv文件按顺序批量导入和输出(Python)_python批量导入10个csv-程序员宅基地

文章浏览阅读1.7k次。csv文件是常见的数据存储格式,经常用它来保存大量的实验数据。为了便于分析,需要将其导入Python中进行进一步的处理,并在处理之后重新输出为csv文件。下面就来介绍利用Python对单个csv文件进行导入与输出操作,以及对多个csv文件按顺序进行批量的导入和输出操作。单个csv文件的导入import pandas as pddata = pd.read_csv(data_path)data_lists = data.values.tolist()这样就可以将csv导入并转化为list的形_python批量导入10个csv

用ffmpeg把gif动图分离成多张图片和ffmpeg多张图片合成gif动图_gif 如何截取多张图-程序员宅基地

文章浏览阅读5.4k次,点赞2次,收藏16次。用ffmpeg把gif动图分离成多张图片和ffmpeg多张图片合成gif动图(20190214)文章目录:一、ffmpeg把gif动图分离成多张图片二、ffmpeg多张图片合成gif动图一、ffmpeg把gif动图分离成多张图片https://blog.csdn.net/baidu_31093133/article/details/73504185二、ffmpeg多张图片合成gif动图ht..._gif 如何截取多张图

化学人学python有前途吗-课堂上老师不讲的有趣物理知识,才是孩子最感兴趣的!...-程序员宅基地

文章浏览阅读51次。"现在的孩子上学学的东西比我们那时候难多了,上小学时我和孩子爸辅导功课就已经很吃力了,孩子下半年就要上初(高)中了,尤其物理、化学更是难上加难,可怎么办啊……”>>>>这是好多家长的无奈与无助,暑期过后,又有一批孩子升入初中、高中。面对增多的学科、难度增加的知识,很多家长自知已经无力辅导,只能寻求辅导班的帮助,然而往往钱没少花,效果却是收效甚微,家长只能一声叹息。想学好理科,物理可是一..._python 化学老师

Flex中使用三角函数sin() cos()进行圆形排列-程序员宅基地

文章浏览阅读160次。private const CENTRE:Point = new Point(0, 0); //圆心private const RADIUS:Number = 100; //半径private const START_ANGLE:Number = 15; //起初角度private const Tile_TOTAL:Number = 9; //组件个数private..._sin求圆形

随便推点

Python3 网络爬虫(请求库的安装)-程序员宅基地

文章浏览阅读207次。Python3 网络爬虫(请求库的安装)爬虫可以简单分为几步:抓取页面,分析页面和存储数据在页面爬取的过程中我们需要模拟浏览器向服务器发送请求,所以需要用到一些python库来实现HTTP的请求操作,我们用到的第三方库有requests Selenium 和aiohttprequests 的安装相关链接:GitHub :https://github.com/requests..._pip安装爬取网络信息的安装包

小程序向webview传参_h5与小程序互相跳转,传参和获取参数-程序员宅基地

文章浏览阅读3.1k次。1、h5跳转到小程序首先引入js文件跳转方法①跳转到小程序内页wx.miniProgram.navigateTo({url: '/pages/content/content',//url: '/pages/content/content?id=1', 传参});②跳转到小程序tabbar页面wx.miniProgram.switchTab({url: "/pages/index/index"})2..._wx.miniprogram.switchtab传参

连接数据库时,出现报错pymysql.err.OperationalError: (2003,“Can‘t connect to MySQL server_pymysql.err.operationalerror: (2003, "can't connec-程序员宅基地

文章浏览阅读4.2k次。问题:连接数据库时,出现报错pymysql.err.OperationalError: (2003,“Can’t connect to MySQL server on ‘mtisp-m.dbsit.sfcloud.local’ ([Errno 10109] getaddrinfo failed)”)错误原因:db=pymysql.connect(host,port,user,password,database,charset=‘utf8’,cursorclass=pymysql.cursors.Dic_pymysql.err.operationalerror: (2003, "can't connect to mysql server on 'loca

[jzoj 6087] [GDOI2019模拟2019.3.26] 获取名额 解题报告 (泰勒展开+RMQ+精度)-程序员宅基地

文章浏览阅读130次。题目链接:https://jzoj.net/senior/#main/show/6087题目:题解:只需要统计$\prod_{i=l}^r (1-\frac{a_i}{x})$=$exp(\sum_{i=l}^r ln(1-\frac{a_i}{x}))(x>a_i)$我们可以把$ln(1-x)|x<1|$泰勒展开,得到$-\sum_{i=1}^..._[jzoj 6087] [gdoi2019模拟2019.3.26] 获取名额 解题报告 (泰勒展开…

Math.round()和Math.ceil()和Math.floor()的区别_math.round和math.floor-程序员宅基地

文章浏览阅读6.8k次,点赞7次,收藏8次。Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应。例如,ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;floor的英文意义是地板,该方法就表示向下取整,Math.floor(11.6)的结果为11,Math.fl..._math.round和math.floor

Linux系统裸金属环境下部署prometheus监控_prometheus能监控裸机吗-程序员宅基地

文章浏览阅读279次。Linux系统裸金属环境下部署prometheus监控文章目录Linux系统裸金属环境下部署prometheus监控一、下载软件安装包部署环境二、配置启动三、测试访问一、下载软件安装包部署环境实验环境:prometheus监控服务端:server1——172.25.33.1客户端:server2——172.25.33.21、下载并发送prometheus监控压缩包和go环境压缩包到服务端server1上,发送节点信息采集node_exporter压缩包到客户端serevr2上wget ht_prometheus能监控裸机吗

推荐文章

热门文章

相关标签