webpack(7)_CSS_使用style-loader和css-loader
webpack除了编译打包js外,还可以编译处理CSS,本篇文章主要讲述如何使用style-loader和css-loader对css打包,主要从以下几点进行讲述:
- css的引入
- 使用style-loader和css-loader打包css
- 使用style-loader/url
- 使用style-loader/useable
- 使用style-loader的options配置
- 使用css-loader的options配置
css的引入
1、css的引入分为三种情况:
- 通过
<style></style>
标签,在标签内可以写css样式 - 通过
<link></link>
标签引入css文件 - 在html标签元素中以style属性来定义样式
2、在js中导入css样式有:
- import “base.css”
- import Base from “base.css”
使用style-loader和css-loader打包css
1、 style-loader
- 作用
style-loader能够在需要载入的html中创建一个<style></style>
标签,标签里的内容就是CSS内容。 - 安装style-loader
npm install style-loader --save-dev
2、css-loader
- 作用
css-loader是允许在js中import
一个css文件,会将css文件当成一个模块引入到js文件中。 - 安装css-loader
npm install css-loader --save-dev
3、实例
- 进入空目录Test,并初始化,生成package.json文件
npm init
- 创建目录和文件src/css/base.css,并添加如下代码
html{background: red;
}
- 创建src/app.js,并将base.css文件当成模块进行引入
import './css/base.css';
- 创建webpack.config.js,并编写打包脚本
// 引入node的path模块
var path = require('path');
module.exports = {entry: {app: "./src/app.js" // 要打包的入口文件},output: {path: path.resolve(__dirname, "dist"), // 使用绝对路径,dist目录filename: "[name].bundle.js" // 或./dist/[name].[hash:5].js},module: {rules: [ // 定义css规则{test: /\.css$/, // 正则匹配要识别的cssuse: [{loader: 'style-loader' // 使用style-loader进行处理,位置必须在css-loader前面},{loader: 'css-loader' // 使用css-loader进行处理}]//use:['style-loader','css-loader'] // 此处也可以这样写}]}
}
注:上面是webpack2的写法,下面是webpack1的写法,webpack1建议抛弃。
module: {loaders: [{test: /\.css$/,loader: 'style-loaer!css-loader'}]
}
- 执行打包命令
webpack
- 打包结果
在dist目录下生成app.bundle.js
,打开这个文件,会发现已经将css打包成js代码
// module
exports.push([module.i, "html{\r\n background: red;\r\n}", ""]);
4、测试打包文件
- 创建index.html ,并引入打包好的app.bundle.js
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<script src="./dist/app.bundle.js"></script>
</body>
</html>
- 测试结果
页面背景变成红色,说明css生效,打开浏览器,查看页面代码,会发现多了个<style>
标签,并且将base.css中的内容写入到标签里面。
使用style-loader/url
1、 作用
使用style-loader会将js中的css样式打包成<style>
标签,而使用style-loader/url则会将js中引入的css文件样式打包成一个css文件,并通过<link>
标签引入。
2、 安装file-loader
引入文件则需要使用file-loader,npm install file-loader --save-dev
3、 配置webpack.config.js文件
// 引入node的path模块
var path = require('path');
module.exports = {entry: {app: "./src/app.js" // 要打包的入口文件},output: {path: path.resolve(__dirname, "dist"), // 使用绝对路径,dist目录publicPath: './dist/',// todo 指定打包后页面加载的文件路径filename: "[name].bundle.js" // 或./dist/[name].[hash:5].js},module: {rules: [ // 定义css规则{test: /\.css$/, // 正则匹配要识别的sccuse: [{loader: 'style-loader/url' // 使用style-loader进行处理,位置必须在css-loader前面},{loader: 'file-loader' // 使用css-loader进行处理}]// use:['style-loader','css-loader']}]}
}
4、打包测试
执行打包命令webpack
,会在dist目录下生成一个css文件,文件内容就是base.css文件中的样式。
运行index.html,在浏览器上查看源代码,会发现此时css样式是用<link>
引入的:
5、 注意
使用style-loader会将css打包成css文件,并将css文件通过<link>
标签进行引入,当app.js中import
两个css文件时,执行打包时会在dist目录下生成两个css文件,然后html页面也会引入两个css文件。
例如:
- 在src/css/目录下新建common.css文件
- 在app.js中引入
import './css/base.css';
import './css/common.css';
- 执行打包命令
webpack
- 在dist目录下生成两个css文件,在浏览器上查看,会发现有两个css文件。
使用style-loader/useable
1、作用
使用style-loader/useable,会使导入的css模块能够使用use()和unuse()方法,方便我们进行操作。
2、配置webpack.config.js文件
rules: [ // 定义css规则{test: /\.css$/, // 正则匹配要识别的cssuse: [{loader: 'style-loader/useable' // 使用userable},{loader: 'css-loader'}}]
3、在app.js中引入base.css文件,并编写测试代码
import Base from './css/base.css';
var flag = false;
setInterval(function () {if (flag) {Base.use();} else {Base.unuse();}flag = !flag;
}, 500);
4、打包测试
执行打包命令webpack
,运行index.html会发现当前css样式会不断的加载和移除。
使用style-loader的options配置
对style-loader进行操作,可以配置options属性,options属性常用的有:
- attrs
- insertAt
- insertInto
- singleton
- transform
1、attrs
- 作用
给<style></style>
标签设置属性,attrs是个对象,内容以键值对形式呈现。 - 配置webpack.config.js
use: [{loader: 'style-loader',options:{attrs:{id:"index", // 创建id为index,name为index的<style>name:"index"},insertAt :"top", // 插入到id为app的dom元素下singleton:true // 是否只使用一个style,会将页面上的style标签合成一个 }},{loader: 'css-loader'}]
测试结果
2、insertAt和insertInto
- 作用
在指定的位置插入css样式 。insertAt 值为 string 类型,可以是 top 或者 bottom,表示插入某个标签 内 的顶部或者结尾,和该标签是父子关系;insertInto表示插入到某个dom元素内。 - 注意,
两个属性的标签选择器,都是通过 document.querySelector 实现的,所以存在两个问题:
1)属性的值,需要符合 document.querySelector 的语法;
2)低版本浏览器(比如IE)可能不支持这个选择器API; - 实例
1)insertAt属性设置为top,会将css样式插入到<header></header>
标签的首行
配置webpack.config.js
use: [{loader: 'style-loader',options:{insertAt :"top", // 插入到id为app的dom元素下singleton:true // 是否只使用一个style,会将页面上的style标签合成一个 }},{loader: 'css-loader'}]
测试结果
2)insertAt属性设置为bottom,会将css样式插入到<header></header>
标签的末行
配置webpack.config.js
use: [{loader: 'style-loader',options:{insertAt :"bottom", // 插入到id为app的dom元素下singleton:true // 是否只使用一个style,会将页面上的style标签合成一个 }},{loader: 'css-loader'}]
测试结果
3)使用insertInto将style样式插入到id为app的元素内
配置webpack.config.js
use: [{loader: 'style-loader',options:{insertInto:"#app", // 插入到id为app的dom元素下singleton:true // 是否只使用一个style,会将页面上的style标签合成一个 }},{loader: 'css-loader'}]
测试结果
4、singleton
- 作用
是否只使用一个<style>
标签,会将页面上的<style>
标签合成一个。 - 类型
布尔类型,true
或者false
- webpack.config.js配置
use: [{loader: 'style-loader',options:{ singleton:true // 是否只使用一个style,会将页面上的style标签合成一个 }},{loader: 'css-loader'}]
5、transform
- 作用
在js中可以拿到字符串类型的css样式,然后对css样式进行转换处理,然后返回转换后的css样式。 - webpack.config.js配置
use: [{loader: 'style-loader',options:{ // 转化,浏览器环境下,插入页面前,通过这个js能够获取css,并做一些操作 transform:"css.transform.js" }},{loader: 'css-loader'}]
- css.transform.js
在项目根目录下创建 css.transform.js
// 对css进行形变
module.exports = function (css) {console.log(css);console.log(window.innerWidth);// 如果什么都不做,直接return css;if (window.innerWidth >= 768) {return css.replace("red","blue");}else {return css.replace("red","orange");}// 在每个class样式前,添加color属性/* const transformed = css.replace(/}/g, 'color: blue;\n}')return transformed;*/
}
使用css-loader的options配置
对css-loader进行操作,可以配置options属性,options属性常用的有:
- importLoader(@import)
- minimize(是否压缩)
- modules(是否启用css-modules)
1、importLoader(@import)
- 作用
启用/禁用 @import 处理
2、minimize(是否压缩)
- 作用
会将css进行压缩,例如去掉空格等。 - webpack.config.js配置
use: [{loader: 'style-loader',},{loader: 'css-loader',options: {minimize: true // 对style样式进行压缩}}]
3、modules(是否启用css-modules)
- 作用
启用modules属性,会将css分模块导入。 - webpack.config.js配置
use: [{loader: 'style-loader',},{loader: 'css-loader',options: {modules:true // 启用css模块化调用}}]
- 在app.js中调用
import Base from './css/base.css';
import './css/common.css';
var app = document.getElementById("app");
app.innerHTML = `<div class="${Base.box}"></div>`;
- 在base.css中添加代码
.box{composes: bigBox from './common.css'; // 模块化导入common.js中的bigBoxwidth: 300px;height:300px;border-radius: 4px;
}
- 在common.js中添加代码
.bigBox{background: blue;
}
执行打包命令
webpack
查看浏览器代码,会发现class名是一串乱序的字符串
修改生成的class的名称
通过localIdentName来配置修改生成的class的名称,[path][name]
是当前路径名称,[local]
是当前class名称,[hash:base64:5]
指5位的base54编码的hash值。
use: [{loader: 'style-loader',},{loader: 'css-loader',options: {modules:true, // 启用css模块化调用localIdentName:"[path][name]_[local]_[hash:base64:5]" // 修改生成的class的名称}}]
如下图所示:
参考:
https://www.npmjs.com/package/css-loader
http://www.css88.com/doc/webpack2/loaders/css-loader/
https://yq.aliyun.com/articles/281033
webpack(7)_CSS_使用style-loader和css-loader相关推荐
- css loader的安装
css loader 1.通过require的方式来引入css,我们来看具体的方法,首先需要安装css-loader, style-loader(安装style-loader的目的是为了在html中以 ...
- webpack css loader
我们新建一个login.js文件,作为一个组件. 这里定义了一个函数,函数中创建了h2标签,然后给标签中添加文字.还有类名className,最后把这个dom返回.最后通过document.body. ...
- webpack使用css-loader跟style-loader加载css报错
webpack使用css-loader跟style-loader加载css报错 webpack使用css-loader跟style-loader加载css报错 webpack.config.js 配置 ...
- webpack编译出错You may need an appropriate loader to handle this file type.
引用css时var footerCss = require("../../css/footer.css");运行报错You may need an appropriate load ...
- nextjs 写 css loader 处理多地区不同基础变量的方法
由于项目在多地区进行发布,为了复用,主工程使用同一个,但是这样会带来一个问题,由于地区的设备分布不同,以及当地的字体选择不一样,从而导致了 global 中的一些熟悉无法复用,而且必须配置两套,那么如 ...
- 什么是loader、项目中安装loader、使用loader管理css格式文件
1.什么是loader? 可以加载和使用项目中的css文件 https://www.webpackjs.com/concepts/loaders/ 1.1.css文件处理-准备工作 1.2.css文件 ...
- style type=text/css中的type=text/css到底是什么意思
最佳答案 type="text/css"是指定MIME类型,其中: text是指对象为网页中的文本 css或是javascript是指当前指定的文本类型... 如果要在HTML文件 ...
- root cause java.lang.LinkageError: loader constraint violation: loader (instanc
用Jstl开发,遇到问题: root cause java.lang.LinkageError: loader constraint violation: loader (instance of or ...
- Caused by: java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/catal
主要因素: Caused by: java.lang.LinkageError: loader constraint violation: loader (instance of org/apache ...
最新文章
- 2020个人Flag已立,欢迎监督!
- 任务——μ/COS-II读书笔记
- django mysql debug_部署前准备--使用Mysql之Django Debug Toolbar安装以及配置
- 在win7环境下使用网络无线共享把电脑变成一台无线路由器
- logback slf4j_强制Tomcat通过SLF4J / Logback登录
- OAuth2.0授权码模式原理与实战
- java数组中重复_数组中重复的数字 java
- linux spi flash id,SPI Flash(W25Q16DV) 基本操作
- java注释html警告,Javadoc中允许的HTML标记
- 简单了解Java语言
- ulipad.4.1.zip linux,UliPad 使用介绍
- sql分页查询与offset的使用
- 如何用计算机计算微积分,高数从此不用怕?一键计算微积分的神App
- 数据结构顺序表基本操作(C/C++实现)
- python reportlab
- FTP服务器的搭建及测试
- 抖音原创视频如何制作?鹰迪电子商务
- 【jzoj2220】【二分】愤怒的奶牛2(angry)
- JAVA毕业设计服装连锁店后台管理系统计算机源码+lw文档+系统+调试部署+数据库
- ionic+vue+capacitor系列笔记--02项目中集成Capacitor,添加android,ios平台,真机运行项目
热门文章
- Arduino控制TM1637共阳四位数码管
- STM32 | C语言对寄存器的封装
- Veeam Availability Suite 9.5安装和配置
- MySQL - SUM() OVER() 函数用法详解
- vb.net操作数据库之ACCESS(一)
- 基于Linux下 Oracle 备份策略(RMAN)---转自沙弥的世界
- GIS开发:分享NASA火灾地图(FIRMS Fire Map)
- “胜兵先胜而后求战,败兵先战而后求胜”—系统分析师考试经验谈
- 7-1 用格里高利公式求给定精度的PI值 (15分)
- A股-进阶-1分钟get的选股八大技巧