vite中如何更优雅的使用css

简介: 【8月更文挑战第2天】webpack中,我们需要在项目中安装css-loader才能让webpack识别css文件。vue-cli基于webpack,内置了这个loader ,Vite天生就是支持对CSS文件的直接处理的。

webpack中,我们需要在项目中安装css-loader才能让webpack识别css文件。

vue-cli基于webpack,内置了这个loader

Vite天生就是支持对CSS文件的直接处理的。

我们看一个例子:

我们在项目根目录里创建好index.html、main.js、index.css然后安装vite

index.html中我们引入main.js

<!DOCTYPE html>
<html lang="en">
  <head>
    <title></title>
  </head>
  <body>
    <script src="./main.js" type="module"></script>
    <div>Vite天生就是支持对CSS文件的直接处理的。</div>
  </body>
</html>

main.js中我们引入index.css

import "./index.css"

然后,index.css中我们加个全局背景

html,body {
  background: red;
  height: 100%;
  width: 100%;
}

使用vite启动项目,可以发现不用安装任何插件就可以识别.css文件。

vite的样式添加原理

当vite在读取到main.js中引用的index.css时,会使用node的fs模块获取其内容。

首先,将其原内容替换为js脚本(方便热更新或者css模块化),同时设置Content-Type为js ,从而让浏览器以JS脚本的形式来执行该css后缀的文件。

然后,直接创建一个style标签, 将index.css中文件内的原内容直接复制进style标签里。最后,将style标签插入到index.html的head中。

CssModule

上述的样式文件引入方式是有瑕疵的,比如,两个.css文件定义了同一个类名,样式会被覆盖。

//  index.css
.wrap{
 background: yellow;
}
// test.css
.wrap{
 background: yellow;
}
// main.js
import "./moduleA.js";
import "./moduleB.js";
// moduleA.js
import "./index.css";
const div = document.createElement("div")
document.body.appendChild(div)
div.className = "footer"
div.innerText ="别看我只是一只羊"
// moduleB.js
import "./test.css";
const div = document.createElement("div")
document.body.appendChild(div)
div.className = "footer"
div.innerText ="羊儿的聪明难以想象!"

index.html中

<!DOCTYPE html>
<html lang="en">
  <body>
    <script src="./main.js" type="module"></script>
  </body>
</html>

显然,test.css内的样式覆盖了index.css内的样式。

一个项目如果是多人开发,类名重复的情况是很常见的,但是上述问题,显然会给我们的项目开发带来困扰。

因此,vite借助了CssModule解决了这一问题。

什么是CssModule:https://www.ruanyifeng.com/blog/2016/06/css_modules.html

CSS的规则都是全局的,任何一个组件的样式规则,都对整个页面有效。

产生局部作用域的唯一方法,就是使用一个独一无二的class的名字,不会与其他选择器重名。这就是 CSS Modules 的做法。

使用

想借助CssModule解决这一问题,我们只需要xxx.module.css的方式命名文件即可。

我们将index.css改为index.module.css,test.css改为test.module.css

然后,moduleA.js及moduleB.js稍作调整

// moduleA.js
import index from "./index.module.css";
const div = document.createElement("div")
document.body.appendChild(div)
div.className = index.wrap
div.innerText ="别看我只是一只羊"
// moduleB.js
import test from "./test.module.css";
const div = document.createElement("div");
document.body.appendChild(div);
div.className = test.wrap;
div.innerText = "羊儿的聪明难以想象";

注:导入的样式文件,我们可以打印一下 console.log(index):

会发现,css里面被替换成js后,导出的对象里包含一个原类名和修改后的类名对象。

所以,通过div.className = test.wrap的方式我们可以获取到修改后的类名。

修改完毕后,可以看到样式问题已经解决。

vite配置CSS

modules选项

通过vite.config.js的css.modules配置项,我们可以更改CssModule的一些默认内容,比如开启或关闭其功能,更改其哈希名称等。

import { defineConfig } from "vite";
export default defineConfig( {
  // 对css的行为进行配置
  css:{
    // 是对css模块化的默认行为进行覆盖
    modules:{
      
    }
  }
});

modules 的配置其实都会被传递给 postcss,让它来帮忙处理,所以具体配置,可以参考postcss-modules

modules选项的完整配置

modules: {
  // 是否开启模块化
  scopeBehaviour: 'global' | 'local'
  // 代表你不想参与到css模块化的路径
  globalModulePaths: RegExp[]
  // 更改生成的哈希名称,一个字符串模板或者通过函数返回
  generateScopedName:
    | string
    | ((name: string, filename: string, css: string) => string)
  // 生成hash名称的前缀
  hashPrefix: string
  // 修改生成的配置对象的key的展示形式(驼峰还是中划线形式)
  localsConvention:
    | 'camelCase'
    | 'camelCaseOnly'
    | 'dashes'
    | 'dashesOnly'
    | null
}

scopeBehaviour

配置建议:脑子不好了可以改

是否开启模块化功能。

  • 可选参数:'global' | 'local'
  • 默认值: 'local'

我们将默认值更改为 global

import { defineConfig } from "vite";
export default defineConfig({
  css: {
    // 是对css模块化的默认行为进行覆盖
    modules: {
      scopeBehaviour: "global" 
    }
  }
});

可以发现,模块化的功能被关闭了。

localsConvention

返回键值对的格式

默认值:camelCaseOnly

可选参数

  • camelCase
  • camelCaseOnly
  • dashes
  • dashesOnly
  • null

我们配置成camelCase试试

import { defineConfig } from "vite";
export default defineConfig({
  css: {
    // 是对css模块化的默认行为进行覆盖
    modules: {
      localsConvention: "camelCase", 
      scopeBehaviour: "local" 
    }
  }
});
// index.module.css
.table-wrap{
 background: yellow;
}
// moduleA.js
import index from "./index.module.css";
console.log('index: ', index);

可以发现,样式引用时,使用  ele.className = index[驼峰命名],ele.className = index[中划线命名]都可以。

camelCaseOnly

null

dashes

dashesOnly

hashPrefix

相关文章
|
前端开发 开发者
在 Vite 中使用 CSS 预处理器的劣势是什么?
在 Vite 中使用 CSS 预处理器的劣势是什么?
485 156
|
前端开发
在 Vite 中使用 CSS 预处理器的优势是什么?
在 Vite 中使用 CSS 预处理器的优势是什么?
424 155
|
JSON 前端开发 JavaScript
vite中静态资源(css、img、svg等)的加载机制及其相关配置
【8月更文挑战第3天】vite中静态资源(css、img、svg等)的加载机制及其相关配置
1811 1
|
前端开发 JavaScript
vite中css最佳实践:使用postcss完善项目中的css配置
【8月更文挑战第3天】使用postcss完善项目中的css配置
3780 1
|
Rust 资源调度 前端开发
Vite 4.4实验性地支持Lightning CSS,Lightning CSS更快的CSS处理利器
Vite 4.4实验性 从Vite 4.4开始,Vite实验性地支持Lightning CSS。你可以通过在你的配置文件中添加 css.transformer: 'lightningcss' 来选择它,并安装可选的lightningcss依赖: bash
335 0
Vite 4.4实验性地支持Lightning CSS,Lightning CSS更快的CSS处理利器
|
前端开发 JavaScript
vite使用css的各种功能
vite使用css的各种功能
355 0
vite使用css的各种功能
|
前端开发 JavaScript API
Vite 2.0 正式发布!依赖预构建,CSS 分割等众多新特性到来
Vite(法语中“快”的意思,发音为 /vit/)是一种新型 Web 开发构建工具。把它想成一个更轻、更快的预配置开发服务器 + 打包的组合工具。它利用了浏览器 native ES modules[1] 的支持,还有如 esbuild[2] 等编译工具来提供时髦酷炫的本地开发体验。
|
JavaScript 前端开发
Vite+Vue3+Vue-Router+Vuex+CSS预处理器(less/sass) 配置指南 —— 全网最详细系列
Vite+Vue3+Vue-Router+Vuex+CSS预处理器(less/sass) 配置指南 —— 全网最详细系列
Vite+Vue3+Vue-Router+Vuex+CSS预处理器(less/sass) 配置指南 —— 全网最详细系列
|
8月前
|
存储 自然语言处理 前端开发
抖音快手小红书虚拟评论截图生成器,模拟对话制作工具,html+js+css
这是一款纯前端实现的多平台虚拟评论生成器,支持抖音、快手、小红书风格,适用于产品演示与UI设计。采用Vanilla JS与Flexbox布局,利用IndexedDB存储数据,CSS Variables切换主题。
|
8月前
|
存储 前端开发 安全
病历单生成器在线制作,病历单生成器app,HTML+CSS+JS恶搞工具
本项目为医疗病历模拟生成器,旨在为医学教学和软件开发测试提供数据支持,严格遵守《医疗机构病历管理规定》。

热门文章

最新文章

  • 1
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    356
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    274
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    242
  • 4
    (CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
    169
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    351
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    501
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    304
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    165
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    300
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    313