webpack4 处理SCSS的方法示例


Posted in Javascript onSeptember 03, 2018

这节课讲解webpack4中处理scss。只需要在处理css的配置上增加编译scss的 LOADER 即可。

1. 准备工作

为了方便叙述,这次代码目录的样式文件只有一个scss文件,以帮助我们了解核心 LOADER 的使用。

下图展示了这次的目录代码结构: 目录结构

webpack4 处理SCSS的方法示例

这次我们需要用到node-sass,sass-loader等 LOADER,package.json如下:

{
 "devDependencies": {
  "css-loader": "^1.0.0",
  "extract-text-webpack-plugin": "^4.0.0-beta.0",
  "node-sass": "^4.9.2",
  "sass-loader": "^7.0.3",
  "style-loader": "^0.21.0",
  "webpack": "^4.16.0"
 }
}

其中,base.scss代码如下:

$bgColor: red !default;
*,
body {
 margin: 0;
 padding: 0;
}
html {
 background-color: $bgColor;
}

index.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Document</title>
</head>
<body>
 <script src="./dist/app.bundle.js"></script>
</body>
</html>

2. 编译打包scss

首先,在入口文件app.js中引入我们的 scss 样式文件:

import "./scss/base.scss";

下面,开始编写webpack.config.js文件:

const path = require("path");

module.exports = {
 entry: {
  app: "./src/app.js"
 },
 output: {
  publicPath: __dirname + "/dist/",
  path: path.resolve(__dirname, "dist"),
  filename: "[name].bundle.js"
 },
 module: {
  rules: [
   {
    test: /\.scss$/,
    use: [
     {
      loader: "style-loader" // 将 JS 字符串生成为 style 节点
     },
     {
      loader: "css-loader" // 将 CSS 转化成 CommonJS 模块
     },
     {
      loader: "sass-loader" // 将 Sass 编译成 CSS
     }
    ]
   }
  ]
 }
};

需要注意的是,module.rules.use数组中,loader 的位置。根据 webpack 规则:放在最后的 loader 首先被执行。所以,首先应该利用sass-loader将 scss 编译为 css,剩下的配置和处理 css 文件相同。

3. 检查打包结果

因为 scss 是 css 预处理语言,所以我们要检查下打包后的结果,打开控制台,如下图所示:

webpack4 处理SCSS的方法示例

同时,对于其他的 css 预处理语言,处理方式一样,首先应该编译成 css,然后交给 css 的相关 loader 进行处理。

处理sass文件

1.安装sass和sass-loader

cnpm i node-sass sass-loader -D

创建一个src/sass/a.sass文件

$color:green;

#div2{
color: $color;
}
module:{ //我写一个module
//配置一个rules(规则),rules是一个数组,里面包含一条一条的规则
rules:[
{
// test 表示测试什么文件类型
test:/\.css$/,
// 使用 'style-loader','css-loader'
use:ExtractTextPlugin.extract({
fallback:'style-loader', // 回滚
use:'css-loader',
publicPath:'../' //解决css背景图的路径问题
})
},
{
test:/\.less$/,
use:ExtractTextPlugin.extract({ //分离less编译后的css文件
fallback:'style-loader',
use:['css-loader','less-loader']
})
},
{
test:/\.(sass|scss)$/,
use:['style-loader','css-loader','sass-loader']
},
{
test:/\.(png|jpg|gif)$/,
use:[{
loader:'url-loader',
options:{ // 这里的options选项参数可以定义多大的图片转换为base64
limit:50000, // 表示小于50kb的图片转为base64,大于50kb的是路径
outputPath:'images' //定义输出的图片文件夹
}
}]
}
]
},

自动添加css前缀

postCss 预处理器

专门处理css平台

1.下载

cnpm i postcss-loader autoprefixer -D

2.准备建一个 postcss.config.js文件 配置postcss的

module.exports = {
plugins:[
require('autoprefixer') // 自动添加css前缀
]
}

3.配置postcss-loader,自动添加css前缀

module:{ //我写一个module
//配置一个rules(规则),rules是一个数组,里面包含一条一条的规则
rules:[
{
// test 表示测试什么文件类型
test:/\.css$/,
// 使用 'style-loader','css-loader'
use:ExtractTextPlugin.extract({
fallback:'style-loader', // 回滚
use:[
{loader:'css-loader'},
{loader:'postcss-loader'} //利用postcss-loader自动添加css前缀
],
publicPath:'../' //解决css背景图的路径问题
})
},
{
test:/\.less$/,
use:ExtractTextPlugin.extract({ //分离less编译后的css文件
fallback:'style-loader',
use:['css-loader','less-loader']
})
},
{
test:/\.(sass|scss)$/,
use:['style-loader','css-loader','sass-loader']
},
{
test:/\.(png|jpg|gif)$/,
use:[{
loader:'url-loader',
options:{ // 这里的options选项参数可以定义多大的图片转换为base64
limit:50000, // 表示小于50kb的图片转为base64,大于50kb的是路径
outputPath:'images' //定义输出的图片文件夹
}
}]
}
]
},

自动消除冗余的css代码

使用Purifycss

1.下载

cnpm i purifycss-webpack purify-css -D

2.引入插件

const PurifyCssWebpack = require('purifycss-webpack');

3.需要引入一个额外模块,glob扫描路径

cnpm i glob -D

4.引入glob

const glob = require('glob');

5.在plugins里面配置

plugins:[
// Uglify是压缩js,现在已经不需要了,只需要在script里面写成
// "build": "webpack --mode production", 就自动压缩额
//new Uglify(), 
new Webpack.HotModuleReplacementPlugin(),
new HtmlWebpackPlugin({
title:'Hello World',
template: './src/index.html' //模板地址
}),
new ExtractTextPlugin('css/index.css'), //都提到dist目录下的css目录中,文件名是index.css里面
new PurifyCssWebpack({ //消除冗余代码
// 首先保证找路径不是异步的,所以这里用同步的方法
// path.join()也是path里面的方法,主要用来合并路径的
// 'src/*.html' 表示扫描每个html的css
paths:glob.sync(path.join(__dirname,'src/*.html')) 
})
]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
身份证号码前六位所代表的省,市,区, 以及地区编码下载
Apr 12 Javascript
ie与ff下的event事件使用介绍
Nov 25 Javascript
Javascript连接多个数组不用concat来解决
Mar 24 Javascript
js 获取元素下面所有li的两种方法
Apr 14 Javascript
jQuery事件用法实例汇总
Aug 29 Javascript
JavaScript实现在数组中查找不同顺序排列的字符串
Sep 26 Javascript
5个书写JavaScript代码的坏习惯,看看你中枪了没?
Nov 06 Javascript
javascript实现图片跟随鼠标移动效果的方法
May 13 Javascript
js实现Select头像选择实时预览代码
Aug 17 Javascript
node.js用fs.rename强制重命名或移动文件夹的方法
Dec 27 Javascript
vue自定义switch开关组件,实现样式可自行更改
Nov 01 Javascript
js点击事件的执行过程实例分析【冒泡与捕获】
Apr 11 Javascript
解决vue打包css文件中背景图片的路径问题
Sep 03 #Javascript
解决Vue2.0中使用less给元素添加背景图片出现的问题
Sep 03 #Javascript
vue组件(全局,局部,动态加载组件)
Sep 02 #Javascript
详解jQuery中的easyui
Sep 02 #jQuery
vue-cli脚手架的安装教程图解
Sep 02 #Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
Sep 02 #Javascript
全面解析vue router 基本使用(动态路由,嵌套路由)
Sep 02 #Javascript
You might like
php中比较简单的导入phpmyadmin生成的sql文件的方法
2011/06/28 PHP
解析PHP中一些可能会被忽略的问题
2013/06/21 PHP
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
jQuery制作的别致导航有阴影背景高亮模式窗口
2014/04/15 Javascript
windows8.1+iis8.5下安装node.js开发环境
2014/12/12 Javascript
js实现的彩色方块飞舞奇幻效果
2016/01/27 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
2017/04/01 jQuery
JavaScript实现前端分页控件
2017/04/19 Javascript
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
react配置antd按需加载的使用
2019/02/11 Javascript
React+Antd+Redux实现待办事件的方法
2019/03/14 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
详解js创建对象的几种方式和对象方法
2021/03/01 Javascript
解决pyqt中ui编译成窗体.py中文乱码的问题
2016/12/23 Python
Django基础之Model操作步骤(介绍)
2017/05/27 Python
pandas 两列时间相减换算为秒的方法
2018/04/20 Python
Python中pip更新和三方插件安装说明
2018/07/08 Python
python3 flask实现文件上传功能
2020/03/20 Python
python的schedule定时任务模块二次封装方法
2019/02/19 Python
numpy数组广播的机制
2019/07/12 Python
python3使用GUI统计代码量
2019/09/18 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
2019/12/10 Python
python 解决Fatal error in launcher:错误问题
2020/05/21 Python
Python如何实现线程间通信
2020/07/30 Python
一些高难度的SQL面试题
2016/11/29 面试题
建筑工程管理专业自荐信范文
2013/12/28 职场文书
外企办公室竞聘演讲稿
2013/12/29 职场文书
工程开工庆典邀请函
2014/02/01 职场文书
圣诞节活动策划方案
2014/06/09 职场文书
学生不参加考试检讨书
2015/02/19 职场文书
画展观后感
2015/06/17 职场文书
《灰雀》教学反思
2016/02/19 职场文书
诉讼和解协议书
2016/03/23 职场文书
六种css3实现的边框过渡效果
2021/04/22 HTML / CSS
Python实现批量自动整理文件
2022/03/16 Python