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 相关文章推荐
动态加载iframe
Jun 16 Javascript
动态为事件添加js代码示例
Feb 15 Javascript
IE下JS读取xml文件示例代码
Aug 05 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
Dec 10 Javascript
js二维数组排序的简单示例代码
Jan 24 Javascript
jQuery查找节点并获取节点属性的方法
Sep 09 Javascript
如何用Node写页面爬虫的工具集
Oct 26 Javascript
javascript canvas检测小球碰撞
Apr 17 Javascript
javascript利用键盘控制小方块的移动
Apr 20 Javascript
纯js+css实现在线时钟
Aug 18 Javascript
js实现筛选功能
Nov 24 Javascript
vue前端和Django后端如何查询一定时间段内的数据
Feb 28 Vue.js
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
DISCUZ 分页代码
2007/01/02 PHP
file_get_contents(&quot;php://input&quot;, &quot;r&quot;)实例介绍
2013/07/01 PHP
关于IE7 IE8弹出窗口顶上
2008/12/22 Javascript
php对mongodb的扩展(初识如故)
2012/11/11 Javascript
JS图片自动轮换效果实现思路附截图
2014/04/30 Javascript
JS仿Windows开机启动Loading进度条的方法
2015/02/26 Javascript
jquery插件splitScren实现页面分屏切换模板特效
2015/06/16 Javascript
jQuery+canvas实现简单的球体斜抛及颜色动态变换效果
2016/01/28 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
2016/05/05 Javascript
jquery动态切换背景图片的简单实现方法
2016/05/14 Javascript
jQuery+CSS3实现点赞功能
2017/03/13 Javascript
js实现扫雷小程序的示例代码
2017/09/27 Javascript
JavaScript数据结构之双向链表定义与使用方法示例
2017/10/27 Javascript
JavaScript实现新年倒计时效果
2018/11/17 Javascript
JavaScript 中 JSON.parse 函数 和 JSON.stringify 函数
2018/12/05 Javascript
实现一个 Vue 吸顶锚点组件方法
2019/07/10 Javascript
如何通过shell脚本自动生成vue文件详解
2019/09/10 Javascript
基于python的汉字转GBK码实现代码
2012/02/19 Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
2017/12/12 Python
浅谈CSS3中的变形功能-transform功能
2017/12/27 HTML / CSS
约瑟夫·特纳男装:Joseph Turner
2017/10/10 全球购物
Expedia挪威官网:酒店、机票和租车
2018/03/03 全球购物
澳大利亚二手奢侈品网站:Modsie
2019/09/23 全球购物
毕业自荐书
2013/12/09 职场文书
洗煤厂厂长岗位职责
2014/01/03 职场文书
银行员工职业规划范文
2014/01/21 职场文书
2014道德模范事迹材料
2014/02/16 职场文书
社区安全生产月活动总结
2014/07/05 职场文书
2014年教育培训工作总结
2014/12/08 职场文书
运动与健康自我评价
2015/03/09 职场文书
2015年行政人事工作总结
2015/05/21 职场文书
毕业生登记表班级意见
2015/06/05 职场文书
开学第一周总结
2015/07/16 职场文书
2016年“七一建党节”广播稿
2015/12/18 职场文书
交通安全教育心得体会
2016/01/15 职场文书
pytorch model.cuda()花费时间很长的解决
2021/06/01 Python