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 相关文章推荐
excel操作之Add Data to a Spreadsheet Cell
Jun 12 Javascript
用JavaScript获取DOM元素位置和尺寸大小的方法
Apr 12 Javascript
jquery 隐藏与显示tr标签示例代码
Jun 06 Javascript
JS实现很酷的水波文字特效实例
Feb 26 Javascript
js和jquery实现监听键盘事件示例代码
Jun 24 Javascript
基于JavaScript实现前端文件的断点续传
Oct 17 Javascript
微信小程序 flex实现导航实例详解
Apr 26 Javascript
angular过滤器实现排序功能
Jun 27 Javascript
JavaScript工具库之Lodash详解
Jun 15 Javascript
微信小程序使用车牌号输入法的示例代码
Aug 20 Javascript
webpack打包优化的几个方法总结
Feb 10 Javascript
JavaScript文档加载模式以及元素获取
Jul 28 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
PHP程序61条面向对象分析设计的经验小结
2008/11/12 PHP
解析php中两种缩放图片的函数,为图片添加水印
2013/06/14 PHP
php实现的mongodb操作类实例
2015/04/03 PHP
PHP 读取文本文件内容并分页显示
2016/01/02 PHP
JavaScript使用二分查找算法在数组中查找数据的方法
2015/04/07 Javascript
Webpack 实现 AngularJS 的延迟加载
2016/03/02 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
2016/11/10 Javascript
jQuery实现字体颜色渐变效果的方法
2017/03/29 jQuery
浅谈es6 javascript的map数据结构
2017/12/14 Javascript
vue轮播图插件vue-concise-slider的使用
2018/03/13 Javascript
JavaScript基于对象方法实现数组去重及排序操作示例
2018/07/10 Javascript
vue实现多级菜单效果
2019/10/19 Javascript
详解基于element的区间选择组件校验(交易金额)
2021/01/07 Javascript
[01:45]绝对公平!DOTA2队长征召模式详解
2014/04/25 DOTA
python中文编码问题小结
2014/09/28 Python
浅析Python中将单词首字母大写的capitalize()方法
2015/05/18 Python
通过实例解析python描述符原理作用
2020/01/22 Python
python如何通过twisted搭建socket服务
2020/02/03 Python
Django --Xadmin 判断登录者身份实例
2020/07/03 Python
Python编写memcached启动脚本代码实例
2020/08/14 Python
采购部岗位职责
2013/11/24 职场文书
工程部经理岗位职责
2013/12/08 职场文书
车间工艺员岗位职责
2013/12/09 职场文书
应用化学专业职业生涯规划书
2014/01/22 职场文书
《蒙娜丽莎之约》教学反思
2014/02/27 职场文书
寄语是什么意思
2014/04/10 职场文书
传播学专业毕业生自荐书
2014/07/01 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
党员民主生活会个人整改措施材料
2014/09/16 职场文书
2014统计局民主生活会对照检查材料思想汇报
2014/10/02 职场文书
公安民警正风肃纪剖析材料
2014/10/10 职场文书
2014年社团工作总结范文
2014/11/27 职场文书
解决springboot druid数据库连接失败后一直重连的方法
2022/04/19 Java/Android
Java Spring读取和存储详细操作
2022/08/05 Java/Android
windows server2012 R2下安装PaddleOCR服务的的详细步骤
2022/09/23 Servers