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 相关文章推荐
textarea焦点的用法实现获取焦点清空失去焦点提示效果
May 19 Javascript
防止登录页面出现在frame中js代码
Jul 22 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
Aug 01 Javascript
js解决select下拉选不中问题
Oct 14 Javascript
Bootstrap基本样式学习笔记之标签(5)
Dec 07 Javascript
JS声明式函数与赋值式函数实例分析
Dec 13 Javascript
Vue通过input筛选数据
Oct 26 Javascript
基于JS实现前端压缩上传图片的实例代码
May 14 Javascript
微信小程序动态显示项目倒计时
Jun 20 Javascript
vue计算属性无法监听到数组内部变化的解决方案
Nov 06 Javascript
vue引入Excel表格插件的方法
Apr 28 Vue.js
JavaScript分页组件使用方法详解
Jul 26 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.ini实现Mysql导入数据库文件最大限制的修改方法
2007/12/11 PHP
Yii框架登录流程分析
2014/12/03 PHP
从性能方面考虑PHP下载远程文件的3种方法
2015/12/29 PHP
PHP微信开发之微信录音临时转永久存储
2018/01/26 PHP
JavaScript 编程引入命名空间的方法
2007/06/29 Javascript
用javascript实现点击链接弹出&quot;图片另存为&quot;而不是直接打开
2007/08/15 Javascript
jQuery 入门讲解1
2009/04/15 Javascript
在Windows上安装Node.js模块的方法
2011/09/25 Javascript
js之事件冒泡和事件捕获详细介绍
2013/10/28 Javascript
jQuery内容过滤选择器用法分析
2015/02/10 Javascript
AngularJS 入门教程之事件处理器详解
2016/08/19 Javascript
Javascript中作用域的详细介绍
2016/10/06 Javascript
JavaScript实现焦点进入文本框内关闭输入法的核心代码
2017/09/20 Javascript
vue嵌套路由与404重定向实现方法分析
2018/05/04 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
[37:22]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第一局
2016/02/28 DOTA
python单链表实现代码实例
2013/11/21 Python
Python实现PS滤镜功能之波浪特效示例
2018/01/26 Python
Java实现的执行python脚本工具类示例【使用jython.jar】
2018/03/29 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
使用Django搭建一个基金模拟交易系统教程
2019/11/18 Python
python 爬虫请求模块requests详解
2020/12/04 Python
弄清Pytorch显存的分配机制
2020/12/10 Python
CSS3实现缺角矩形,折角矩形以及缺角边框
2019/12/20 HTML / CSS
为娇小女性量身打造:Petite Studio
2018/11/01 全球购物
int和Integer有什么区别
2013/05/25 面试题
艺术专业大学生自我评价
2013/09/22 职场文书
试用期转正鉴定评语
2014/01/27 职场文书
教师敬业奉献模范事迹材料
2014/05/18 职场文书
信用卡逾期证明示例
2014/09/13 职场文书
工作失职检讨书范文
2015/05/05 职场文书
工地食品安全责任书
2015/05/09 职场文书
初中班主任心得体会
2016/01/07 职场文书
【海涛教你打DOTA】死灵飞龙第一视角解说
2022/04/01 DOTA
python和C/C++混合编程之使用ctypes调用 C/C++的dll
2022/04/29 Python
python自动获取微信公众号最新文章的实现代码
2022/07/15 Python