将css单独打包成一个文件的插件,它为每一个包含css的js文件都建立一个css文件。它支持css和sourceMaps的按需加载。css
目前只有在webpack V4版本才支持使用该插件webpack
和extract-text-webpack-plugin相比:web
例子:npm
npm install --save-dev mini-css-extract-plugin
webpack.config.jssass
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); module.exports={ plugins:[ new MiniCssExtractPlugin({ // Options similar to the same options in webpackOptions.output // both options are optional filename: "[name].css", chunkFilename: "[id].css" }) ], module: { rules: [ { test: /\.css$/, use: [ { loader: MiniCssExtractPlugin.loader, options: { // you can specify a publicPath here // by default it use publicPath in webpackOptions.output publicPath: '../' } }, "css-loader" ] } ] } }
这个插件应该只在生产环境构建中使用,而且在loader链中不该该有style-loader,特别是咱们在开发模式中使用HMR时。异步
下面是一个在开发模式中使用HMR并在生产环境构建的文件中提出出css样式的示例。post
(各个loader的配置根据你的需求进行自定义修改)性能
webpack.config.jsui
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const devMode = process.env.NODE_ENV !== 'production' module.exports = { plugins: [ new MiniCssExtractPlugin({ // Options similar to the same options in webpackOptions.output // both options are optional 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', ], } ] } }
等到webpack V5时,有可能会将css压缩功能进行集成,可是在webpack V4,咱们还须要手动使用optimize-css-assets-webpack-plugin来进行css的压缩。配置wepack的optimization.minimizer选项来覆盖webpack的默认配置。同时也要指定一个js压缩器。插件
wepack.config.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, sourceMap: true // set to true if you want JS source maps }), new OptimizeCSSAssetsPlugin({}) ] }, plugins: [ new MiniCssExtractPlugin({ filename: "[name].css", chunkFilename: "[id].css" }) ], module: { rules: [ { test: /\.css$/, use: [ MiniCssExtractPlugin.loader, "css-loader" ] } ] } } }
运行时代码经过link 或 style标签检测已经添加的css,当在服务端注入css为了在服务端进行渲染时是很是有用的。link标签的href属性用来匹配被加载的css块的URL,data-href属性也能够在link和style标签上使用,当使用内联样式的时候必须使用href.
相似于 extract-text-webpack-plugin的做用,可使用optimization.splitChunks.cacheGroups来将css提取到一个文件中
webpack.config.js
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" ] } ] } }
还能够根据webpack entry提取CSS。若是动态导入路由,但但愿根据条目将CSS绑定在一块儿,那么这一点尤为有用。这也防止了使用ExtractTextPlugin时出现的CSS复制问题。
webpack.config.js
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') }, plugins: [ new MiniCssExtractPlugin({ filename: "[name].css", }) ], module: { rules: [ { test: /\.css$/, use: [ MiniCssExtractPlugin.loader, "css-loader" ] } ] }, optimization:{ splitChunks:{ cacheGroups:{ fooStyles:{ fooStyles: { name: 'foo', test: (m,c,entry = 'foo') => m.constructor.name === 'CssModule' && recursiveIssuer(m) === entry, chunks: 'all', enforce: true } } } } } }