webpack4 处理CSS的方法示例


Posted in Javascript onSeptember 03, 2018

这节课讲解webpack4中打包css的应用。v4 版本和 v3 版本并没有特别的出入。

1. 准备工作

众所周知,CSS 在 HTML 中的常用引入方法有<link>标签和<style>标签两种,所以这次就是结合webpack特点实现以下功能:

  • 将 css 通过 link 标签引入
  • 将 css 放在 style 标签里
  • 动态卸载和加载 css
  • 页面加载 css 前的transform

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

 webpack4 处理CSS的方法示例

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

{
 "devDependencies": {
  "css-loader": "^1.0.0",
  "file-loader": "^1.1.11",
  "style-loader": "^0.21.0"
 }
}

其中,base.css代码如下:

*,
body {
 margin: 0;
 padding: 0;
}
html {
 background: red;
}

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. CSS通过<link>标签引入

link 标签通过引用 css 文件,所以需要借助file-loader来将 css 处理为文件。

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: /\.css$/, // 针对CSS结尾的文件设置LOADER
    use: [
     {
      loader: "style-loader/url"
     },
     {
      loader: "file-loader"
     }
    ]
   }
  ]
 }
};

为了让效果更显著,编写如下app.js:

let clicked = false;
window.addEventListener("click", function() {
 // 需要手动点击页面才会引入样式!!!
 if (!clicked) {
  import("./css/base.css");
 }
});

3. CSS放在<style>标签里

通常来说,css放在style标签里可以减少网络请求次数,提高响应时间。需要注意的是,在老式 IE 浏览器中,对style标签的数量是有要求的。

app.js和第二部分一样,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: /\.css$/, // 针对CSS结尾的文件设置LOADER
    use: [
     {
      loader: "style-loader",
      options: {
       singleton: true // 处理为单个style标签
      }
     },
     {
      loader: "css-loader",
      options: {
       minimize: true // css代码压缩
      }
     }
    ]
   }
  ]
 }
};

4. 动态卸载和加载CSS

style-loader为 css 对象提供了use()和unuse()两种方法,借助这两种方法,可以方便快捷地加载和卸载 css 样式。

首先,需要配置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: /\.css$/,
    use: [
     {
      loader: "style-loader/useable" // 注意此处的style-loader后面的 useable
     },
     {
      loader: "css-loader"
     }
    ]
   }
  ]
 }
};

然后,我们修改我们的app.js,来实现每 0.5s 换一次背景颜色:

import base from "./css/base.css"; // import cssObj from '...'
var flag = false;
setInterval(function() {
 // unuse和use 是 cssObj上的方法
 if (flag) {
  base.unuse();
 } else {
  base.use();
 }
 flag = !flag;
}, 500);

打包后打开index.html即可看到页面背景颜色闪动的效果。

5. 页面加载css前的transform

对于css的transform,简单来说:在加载 css 样式前,可以更改 css。这样,方便开发者根据业务需要,对 css 进行相关处理。

需要对style-loader增加options.transform属性,值为指定的 js 文件,所以, 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: /\.css$/,
    use: [
     {
      loader: "style-loader",
      options: {
       transform: "./css.transform.js" // transform 文件
      }
     },
     {
      loader: "css-loader"
     }
    ]
   }
  ]
 }
};

下面,我们编写css.transform.js,这个文件导出一个函数,传入的参数就是 css 字符串本身。

module.exports = function(css) {
 console.log(css); // 查看css
 return window.innerWidth < 1000 ? css.replace("red", "green") : css; // 如果屏幕宽度 < 1000, 替换背景颜色
};

在app.js中引入 css 文件即可:

import base from "./css/base.css";

我们打开控制台,如下图所示,当屏幕宽度小于 1000 时候,css 中的red已经被替换为了green。

webpack4 处理CSS的方法示例

需要注意的是:transform是在 css 引入前根据需要修改,所以之后是不会改变的。所以上方代码不是响应式,当把屏幕宽度拉长到大于 1000 时候,依旧是绿色。重新刷新页面,才会是红色。

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

Javascript 相关文章推荐
jqPlot jquery的页面图表绘制工具
Jul 25 Javascript
Javascript Cookie读写删除操作的函数
Mar 02 Javascript
jquery通过select列表选择框对表格数据进行过滤示例
May 07 Javascript
js的image onload事件使用遇到的问题
Jul 15 Javascript
jQuery实现文本展开收缩特效
Jun 03 Javascript
Bootstrap面板使用方法
Jan 16 Javascript
纯jQuery实现前端分页功能
Mar 23 jQuery
PHP7新特性简述
Jun 11 Javascript
浅谈React Native Flexbox布局(小结)
Jan 08 Javascript
vue脚手架搭建项目的兼容性配置详解
Jul 17 Javascript
layui radio性别单选框赋值方法
Aug 15 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
Oct 19 Javascript
webpack4 CSS Tree Shaking的使用
Sep 03 #Javascript
解决Vue+Element ui开发中碰到的IE问题
Sep 03 #Javascript
webpack4 处理SCSS的方法示例
Sep 03 #Javascript
解决vue打包css文件中背景图片的路径问题
Sep 03 #Javascript
解决Vue2.0中使用less给元素添加背景图片出现的问题
Sep 03 #Javascript
vue组件(全局,局部,动态加载组件)
Sep 02 #Javascript
详解jQuery中的easyui
Sep 02 #jQuery
You might like
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
2012/03/27 PHP
php header功能的使用
2013/10/28 PHP
兼容PHP和Java的des加密解密代码分享
2014/06/26 PHP
标准版Eclipse搭建PHP环境的详细步骤
2015/11/18 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
JavaScript 浏览器验证代码(来自discuz)
2010/07/17 Javascript
理解Javascript_01_理解内存分配原理分析
2010/10/11 Javascript
js编码、解码函数介绍及其使用示例
2013/09/05 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
JS实现根据出生年月计算年龄
2014/01/10 Javascript
Enter回车切换输入焦点实现思路与代码兼容各大浏览器
2014/09/01 Javascript
javascript 兼容各个浏览器的事件
2015/02/04 Javascript
Javascript基础教程之比较null和undefined值
2016/05/16 Javascript
Vue项目中设置背景图片方法
2018/02/21 Javascript
vue拖拽排序插件vuedraggable使用方法详解
2020/08/21 Javascript
详解JavaScript的数据类型以及数据类型的转换
2019/04/20 Javascript
vuex实现像调用模板方法一样调用Mutations方法
2019/11/06 Javascript
Python多线程编程(四):使用Lock互斥锁
2015/04/05 Python
python爬虫的工作原理
2017/03/05 Python
caffe binaryproto 与 npy相互转换的实例讲解
2018/07/09 Python
5款Python程序员高频使用开发工具推荐
2019/04/10 Python
Python爬虫学习之翻译小程序
2019/07/30 Python
Python统计文本词汇出现次数的实例代码
2020/02/27 Python
PyCharm中如何直接使用Anaconda已安装的库
2020/05/28 Python
安德玛比利时官网:Under Armour比利时
2019/08/28 全球购物
建筑工程管理专业自荐信范文
2013/12/28 职场文书
培训主管的职业生涯规划
2014/03/06 职场文书
在校实习生求职信
2014/06/18 职场文书
九一八事变演讲稿范文
2014/09/14 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
用Python爬虫破解滑动验证码的案例解析
2021/05/06 Python
go开发alertmanger实现钉钉报警
2021/07/16 Golang
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技
Python线程池与GIL全局锁实现抽奖小案例
2022/04/13 Python
使用python绘制分组对比柱状图
2022/04/21 Python