webpack5_使用webpack编译scss文件为css文件并实现css文件的兼容性和压缩处理
webpack5_使用webpack编译scss文件为css文件并实现css文件的兼容性和压缩处理
- 现实问题: 为了编写博客园的博客样式, 我写了一个scss文件, 但是因为博客园的样式编辑里只接受css样式, 所以乘此机会顺便复习一下webpack5实现对scss(sass)文件的处理
下载最新版webpack
npm i webpack webpack-cli -g
步骤1: 编写webpack.config.js文件基本配置
-
webpack.config.js基本配置编写如下
-
const { resolve } = require('path') module.exports = { entry: { // 入口文件 main: './index.js' }, output: { // 出口 filename: 'bundle.js', // 输出文件名 path: resolve(__dirname, 'dist') // 输出文件路径配置 }, mode: 'development' }
-
entry对象的main属性值是入口文件, 所有的外部需要处理的文件都需要在这个文件里引入; 上面代码的入口文件是在webpack.config.js同目录下的index.js文件
-
output对象的path值是编译出来的文件需要存放的目录, 上面代码的意思是存放在webpack.config.js所在目录下的dist目录中, 如果没有这个目录, webpack会自动创建该目录.
-
output对象的filename值是编译出来的js文件的命名, 如果只是对scss文件进行编译的话, 编译后的css文件就会被混入这个js文件中进行输出
-
步骤2: 编译scss文件
-
因为webapck自带功能只能处理js与json文件, 因此处理css文件需要css-loader, sass-loader是编译sass/scss文件用的
-
下载css-loader, sass-loader文件
-
sass-loader自带dart-sass, 所以不需要额外再安装dart-sass
-
npm i css-loader sass-loader -d
-
需要注意必须安装在当前项目中
-
-
webpack.config.js编译sass/scss文件配置如下
-
const { resolve } = require('path') module.exports = { entry: { // 入口文件 main: './index.js' }, output: { // 出口 filename: 'bundle.js', // 输出文件名 path: resolve(__dirname, 'dist') // 输出文件路径配置 }, module: { rules: [ { test: /\.s[ac]ss$/i, use: [ 'css-loader', 'sass-loader', ], }, ], }, mode: 'development' }
-
当然此时还必须在index.js文件中引入我们要编译的scss文件
-
import './style/main.scss'
-
-
执行webpack命令, 会看到dist目录下的bundle.js文件, 被编译后的scss文件被混入了这个文件里
-
步骤3: 与编译文件分离独立成单独的css文件
-
npm i mini-css-extract-plugin -g
- 被引入的插件可以安装在全局目录中, 但loader必须安装在当前目录下
-
webpack.config.js分离css文件配置
-
const { resolve } = require('path') const MiniCssExtractPlugin = require('mini-css-extract-plugin') module.exports = { entry: { // 入口文件 main: './index.js' }, output: { // 出口 filename: 'bundle.js', // 输出文件名 path: resolve(__dirname, 'dist') // 输出文件路径配置 }, module: { rules: [ { test: /\.s[ac]ss$/i, use: [ MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader', ], }, ], }, mode: 'development', plugins: [ new MiniCssExtractPlugin({ filename: '[contenthash:10].css' // 生成的文件以10位hash值为文件名 }) ] }
-
如上代码所示, 引入插件后, 在plugins中注册插件, 并配置分离后的css文件名, 同时在rules中插件被调用在css-loader之后.
-
执行编译命令, css文件会被分离放置在出口目录下
-
步骤4: 处理编译好的css文件的兼容性
-
除非特别要求, 我一般都会在项目里添加user-select属性, 它是一个很特殊的属性, 因为针对不同的浏览器要对它做不同的适配
-
下载
-
npm install postcss-loader postcss-flexbugs-fixes postcss-preset-env postcss-normalize autoprefixer postcss-nested --save-dev
-
-
在webpack.config.js同级目录中添加一个postcss.config.js文件中
-
postcss.config.js
-
module.exports = { ident: 'postcss', plugins: [ require('postcss-flexbugs-fixes'), require('postcss-preset-env')({ autoprefixer: { flexbox: 'no-2009', }, stage: 3, }), require('postcss-normalize')(), require('postcss-nested') ], sourceMap: true }
-
-
-
在package.json文件中添加以下属性
-
"browserslist": [ "last 1 version", "> 1%", "IE 10" ]
-
-
webpack.config.js兼容处理css文件
-
const { resolve } = require('path') const MiniCssExtractPlugin = require('mini-css-extract-plugin') module.exports = { entry: { // 入口文件 main: './index.js' }, output: { // 出口 filename: 'bundle.js', // 输出文件名 path: resolve(__dirname, 'dist') // 输出文件路径配置 }, module: { rules: [ { test: /\.s[ac]ss$/i, use: [ MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', 'sass-loader', ], }, ], }, mode: 'development', plugins: [ new MiniCssExtractPlugin({ filename: '[contenthash:10].css' // 生成的文件以10位hash值为文件名 }) ] }
-
如上代码: 只需要在rules中添加一个postcss-laoder字符串即可, 执行编译代码, 如果文件里写有user-select属性的话, 就可以看到编译出来的文件里这个属性发生了明显的变化.
-
步骤5: 压缩css代码
-
下载
-
npm install css-minimizer-webpack-plugin -g
-
-
webpack.config.js压缩css代码配置
-
const { resolve } = require('path') const MiniCssExtractPlugin = require('mini-css-extract-plugin') const cssMinimizerPlugin = require("css-minimizer-webpack-plugin") module.exports = { entry: { // 入口文件 main: './index.js' }, output: { // 出口 filename: 'bundle.js', // 输出文件名 path: resolve(__dirname, 'dist') // 输出文件路径配置 }, module: { rules: [ { test: /\.s[ac]ss$/i, use: [ MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', 'sass-loader', ], }, ], }, optimization: { minimize: true, minimizer: [ new cssMinimizerPlugin() ], }, mode: 'development', plugins: [ new MiniCssExtractPlugin({ filename: '[contenthash:10].css' // 生成的文件以10位hash值为文件名 }) ] }
-
如上代码所示, 执行引入, 和optimization配置后, 再执行编译, 就可以看到被压缩的css代码了
-