96SEO 2026-06-07 07:18 13
嘿,老铁们!今天咱们聊聊 Vue 3.5 的 SFC 样式到底是怎么被编译成浏览器Neng跑的 CSS 的。你想想,SFC 就像一盒子,里面装着 template、script 和 style,Zui后变成三份代码,然后一起跑起来。别担心,我这就给你拆开来kankan。
Vue SFC 的基本结构一个典型的 .vue 文件kan起来像:

Hello Vue
这三块内容会先被解析成一个叫Zuo SFCDescriptor 的对象,然后再分层编译:先是 script,再是 template,Zui后是 style。你Ke以想象它像Zuo饭一样:先切菜,然后炒菜,Zui后撒盐。
解析阶段:parseComponentVue 在内部用 parseComponent 把 .vue 文件拆成小块。这个过程会读取文件头部和尾部的注释,判断是否有 lang 属性,还有是否启用了 scoped 或 module。说实话,这一步其实挺直白的,只要把字符串拆开即可。
为什么要先解析?因为后面每一步dou需要知道哪块是哪个,而且还得知道属性信息,比如 style 是否带 scoped,要给它加上 data-v-xxx 标识。
脚本编译:compileScript脚本编译主要处理两种写法:
传统 script
script setup
两者Zui终dou变成一个可执行的 JS 模块,并把导出的变量收集到 render 函数里。这里面还有自动暴露顶层变量给模板、自动注册组件等特性——这些dou是 Vue 为了让我们写得geng爽而加上的糖衣炮弹。
模板编译:compileTemplate模板经过 transform 后会变成渲染函数。例如 "compileStyle" 就是整个样式转换的大脑袋。” 从 SFCDescriptor 中拿到 style 块的原始字符串。Ru果没有 lang 属性,就直接用原生 CSS;Ru果有比如 less 或 scss,就会先交给对应预处理器转为标准 CSS。 "Vite" 或者 "rollup-plugin-vue" dou会把几个 PostCSS 插件串起来例如 autoprefixer、cssnano 等。这些插件负责:
A‑B‑C‑D… 前缀补齐。 Minnify 压缩。 `v-bind` 替换为 CSS 变量引用。 "那里的 `var` 是怎么来的?" "嗯,这里 genVarName 就是生成唯一名字,比如 data-v-12345--color" —— 对啦,对吧?不对不对,我说错了应该叫Zuo _genVarName_。
`scoped`:"只给当前组件加个 data-v-xxxx 标记,让同名类在子组件里不起作用" `module`:"彻底改名,把类名替换为随机哈希,然后通过 `$style.xxx` 来引用" "比如你写 `` 时Zui终在 JS 里就Nengkan到类似 `_title_abc123` 那种名字。"
"然后你在模板里就得写 :class="$style.title"——别忘了哦!"
"哈哈,有时候我差点忘了 $style 前缀,结果页面全黑一片。"
trimPlugin 简述
"它帮你清理多余空格,让Zui终产出的 CSS geng干净。"
`sourceMap` 与依赖追踪
"在开发模式下每个样式块dou会生成 SourceMap,把浏览器调试指向你的 .vue 文件,让排错geng直观。"
"而对于 ` ` 引入外部 css 的情况,它也Neng记录依赖关系,以便热geng新时只重新打包相关文件。"
`deep` 与 `slotted` 深度选择器处理
"当父组件带 scoped 时这个 :deep 就让子组件内部 .inner-dom Neng被覆盖。"
"但Ru果父组件改为 module,那这个深度选择器就失效——因为 class 名Yi经被改名了。”
模块化示例代码
背景颜色演示
"注意这里我们给 module 指定了名字 bgModule,那 Vue 会注入一个叫 bgModule 的对象,你Ke以直接使用 $bgModule.bg 来引用。"
"别搞错了这是和默认 $style 不同的命名空间。" "这里 result.code 就是真正输出给浏览器的 CSS 字符串。"
"当然Ru果你用 rollup 或 webpack,也Ke以用类似 API,只不过配置略有不同。"
渲染前期:SFC 编译阶段Yi经把所有需要添加的数据属性标记好,如 data-v-xxxx. 运行时:Vue 创建虚拟节点时会检查节点是否拥有对应的数据属性,Ru果没有则自动加入。 “真正渲染到 DOM 上的是带属性的标签,而不是纯粹的 HTML”。所以即使你手动删掉 class,也不会影响样式隔离,因为隔离靠的是属性而不是类名本身。 "我说嘛,老友们,我喜欢随性一点,不想kan到那些严肃又死板的编号列表。”
“每次kan到数字,我就觉得自己好像在参加某个正式会议。”
“所以咱们直接用段落和点点线来表达顺序吧。” 哈——也许以后再改造一下但现在先让大家享受这份轻松吧! // 假设原始样式
.title { color: v-bind }
// 编译后会变成
.title { color: var }// pseudo code
function cssVarsPlugin {
return {
Declaration {
if ) {
// 把 v-bind 换成 var
decl.value = decl.value.replace(
/v-bind\]+)\)/g,
=> `var})`
)
}
}
}
}// pseudo code
function trimPlugin {
return {
Once {
root.walk(node => {
if {
node.raws.before = '
'
node.raws.after = '
'
}
})
}
}
}// 父组件深度穿透例子
// Vite 使用 async 编译方式
import { compileStyleAsync } from '@vue/compiler-sfc'
const result = await compileStyleAsync({
source: '.title{color:red}',
filename: 'App.vue',
id: 'data-v-123',
postcssPlugins:
})
console.log
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback