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 相关文章推荐
ext 代码生成器
Aug 07 Javascript
jQuery实现自定义事件的方法
Apr 17 Javascript
javascript实现dom元素可拖动
Mar 21 Javascript
jQuery Plupload上传插件的使用
Apr 19 jQuery
详解angularjs中如何实现控制器和指令之间交互
May 31 Javascript
详解基于vue-cli配置移动端自适应
Jan 13 Javascript
详解如何创建并发布一个 vue 组件
Nov 08 Javascript
ES6知识点整理之模块化的应用详解
Apr 15 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
May 09 Javascript
layer提示框添加多个按钮选择的实例
Sep 12 Javascript
jQuery实现滑动星星评分效果(每日分享)
Nov 13 jQuery
微信小程序实现页面浮动导航
Jan 08 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 cli换行示例
2014/04/22 PHP
PHP获取MySql新增记录ID值的3种方法
2014/06/24 PHP
PHP中把有符号整型转换为无符号整型方法
2015/05/27 PHP
PHP根据key删除数组中指定的元素
2019/02/28 PHP
非常不错的一个javascript 类
2006/11/07 Javascript
javaScript(JS)替换节点实现思路介绍
2013/04/17 Javascript
如何使用Javascript正则表达式来格式化XML内容
2013/07/04 Javascript
JS判定是否原生方法
2013/07/22 Javascript
JavaScript创建对象的写法
2013/08/29 Javascript
javascript中parseInt()函数的定义和用法分析
2014/12/20 Javascript
jQuery中odd选择器的定义和用法
2014/12/23 Javascript
jQuery基于ajax实现星星评论代码
2015/08/07 Javascript
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
JS将网址url转化为JSON格式的方法
2018/07/02 Javascript
Vue使用lodop实现打印小结
2019/07/06 Javascript
jqGrid表格底部汇总、合计行footerrow处理
2019/08/21 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
javascript实现打砖块小游戏(附完整源码)
2020/09/18 Javascript
js实现电灯开关效果
2021/01/19 Javascript
python计算时间差的方法
2015/05/20 Python
python中redis的安装和使用
2016/12/04 Python
Python图像处理之简单画板实现方法示例
2018/08/30 Python
解决Python 使用h5py加载文件,看不到keys()的问题
2019/02/08 Python
Python学习笔记之集合的概念和简单使用示例
2019/08/22 Python
pytorch 状态字典:state_dict使用详解
2020/01/17 Python
python多进程使用函数封装实例
2020/05/02 Python
HTML5 File API改善网页上传功能
2009/08/19 HTML / CSS
墨西哥运动服饰和鞋网上商店:Netshoes墨西哥
2016/07/28 全球购物
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
采购助理岗位职责
2014/02/16 职场文书
庆元旦迎新年广播稿
2014/02/18 职场文书
学习张林森心得体会
2014/09/10 职场文书
幼师辞职信范文
2015/02/27 职场文书
2015年组织部工作总结
2015/04/03 职场文书
导游词之贵州百里杜鹃
2019/10/29 职场文书
详解Apache SkyWalking 告警配置指南
2021/04/22 Servers