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 相关文章推荐
jQuery 可以拖动的div实现代码 脚本之家修正版
Jun 26 Javascript
jquery 的 $(&quot;#id&quot;).html() 无内容的解决方法
Jun 07 Javascript
JS实现点击按钮自动增加一个单元格的方法
Mar 09 Javascript
jQuery EasyUI 菜单与按钮之创建简单的菜单和链接按钮
Nov 18 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
Mar 19 Javascript
jQuery实现的tab标签切换效果示例
Sep 05 Javascript
JavaScript实现汉字转换为拼音的库文件示例
Dec 22 Javascript
使用OPENLAYERS3实现点选的方法
Sep 24 Javascript
JavaScript适配器模式详解
Oct 19 Javascript
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
Jun 04 Javascript
Vue elementui字体图标显示问题解决方案
Aug 18 Javascript
解决Antd Table表头加Icon和气泡提示的坑
Nov 17 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中防止SQL注入攻击和XSS攻击的两个简单方法
2010/04/15 PHP
PHP面向对象之后期静态绑定功能介绍
2015/05/18 PHP
JavaScript 图像动画的小demo
2012/05/23 Javascript
javascript 星级评分效果(手写)
2012/12/24 Javascript
JS二维数组的定义说明
2014/03/03 Javascript
Jquery uploadify上传插件使用详解
2016/01/13 Javascript
js如何准确获取当前页面url网址信息
2020/09/13 Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
2016/11/29 Javascript
Bootstrap select下拉联动(jQuery cxselect)
2017/01/04 Javascript
js仿微博动态栏功能
2017/02/22 Javascript
让div运动起来 js实现缓动效果
2017/07/06 Javascript
JavaScript函数中的this四种绑定形式
2017/08/15 Javascript
vue+axios+mock.js环境搭建的方法步骤
2018/08/28 Javascript
Vue点击切换颜色的方法
2018/09/13 Javascript
Nodejs中使用puppeteer控制浏览器中视频播放功能
2019/08/26 NodeJs
详解datagrid使用方法(重要)
2020/11/06 Javascript
vue element el-transfer增加拖拽功能
2021/01/15 Vue.js
python实现查找两个字符串中相同字符并输出的方法
2015/07/11 Python
浅谈Python的文件类型
2016/05/30 Python
解决Django模板无法使用perms变量问题的方法
2017/09/10 Python
Python 模拟购物车的实例讲解
2017/09/11 Python
python enumerate内置函数用法总结
2020/01/07 Python
在django中使用post方法时,需要增加csrftoken的例子
2020/03/13 Python
Python多线程threading创建及使用方法解析
2020/06/17 Python
没编程基础可以学python吗
2020/06/17 Python
斯凯奇澳大利亚官网:SKECHERS澳大利亚
2018/03/31 全球购物
Redbubble法国:由独立艺术家设计的独特产品
2019/01/08 全球购物
不用游标的SQL语句有哪些
2012/09/07 面试题
大三学生入党思想汇报
2014/01/02 职场文书
办公室文员自荐书
2014/02/03 职场文书
运动员口号
2014/06/09 职场文书
英语教师求职信
2014/06/16 职场文书
开展批评与自我批评发言材料
2014/10/17 职场文书
奥巴马开学演讲观后感
2015/06/12 职场文书
2016计划生育先进个人事迹材料
2016/02/29 职场文书
五年级作文之劳动作文
2019/11/12 职场文书