SFC 语法定义 {#sfc-syntax-specification}

总览 {#overview}

一个 Vue 单文件组件(SFC),使用 *.vue 作为文件后缀名,是一种使用了类似 HTML 语法的自定义文件格式,用于定义 Vue 组件。一个 Vue 单文件组件从语法上是兼容 HTML 的。

每一个 *.vue 文件都由三种类型的顶层块构成: <template><script>,和 <style>,以及一些其他的自定义块:

  1. <template>
  2. <div class="example">{{ msg }}</div>
  3. </template>
  4. <script>
  5. export default {
  6. data() {
  7. return {
  8. msg: 'Hello world!'
  9. }
  10. }
  11. }
  12. </script>
  13. <style>
  14. .example {
  15. color: red;
  16. }
  17. </style>
  18. <custom1>
  19. 例如这个块可以作为组件的文档。
  20. </custom1>

相应语言块 {#language-blocks}

<template> {#template}

  • 每一个 *.vue 文件可以包含至多一个顶层 <template> 块。

  • 内容将会被提取、传递给 @vue/compiler-dom,预编译为 JavaScript 渲染函数,并附在导出的组件上作为其render 选项。

<script> {#script}

  • 每一个 *.vue 文件可以包含至多一个 <script> 块。(使用 <script setup> 的情况除外)

  • 这个脚本代码块将作为 ES 模块执行。

  • 默认导出 应该是 Vue 的组件选项对象,可以是一个对象字面量或是通过 defineComponent 函数定义后返回。

<script setup> {#script-setup}

  • 每一个 *.vue 文件可以包含至多一个 <script setup>。(不包括一般的 <script>

  • 这个脚本块将被预处理为组件的 setup() 函数,这意味着它将 为每一个组件实例 都执行。<script setup> 中的顶层绑定都将自动暴露给模板。要了解更多细节,请看 <script setup> 的专门文档

<style> {#style}

  • 每一个 *.vue 文件可以包含多个 <style> 标签。

  • 一个 <style> 类型可以使用 scopedmodule attribute(查看 SFC 样式功能了解更多细节)来帮助封装当前组件的样式。多个使用了不同封装模式的 <style> 标签可以被混合入同一个组件。

自定义块 {#custom-blocks}

在一个 *.vue 文件中可以为任何项目特定需求使用额外的自定义块。举个例子,一个用作写文档的 <docs> 块。这里是一些自定义块的真实用例:

处理自定义块需要依赖工具链。如果你想要在构建中集成你的自定义块,请参见 相关工具链指南 获取更多细节。

自动名称推导 {#automatic-name-inference}

一个 SFC 会在以下场景中根据文件名自动推导其组件名:

  • 开发警告信息格式
  • DevTools 审阅
  • 递归组件自引用。例如一个名为 FooBar.vue 的组件可以在模板中通过 <FooBar/> 引用自己。(同名情况下)这比明确注册/导入的组件优先级低。

预处理器 {#pre-processors}

代码块可以使用 lang 这个 attribute 来声明预处理器语言,最常见的用例就是对 <script> 块使用 TypeScript:

  1. <script lang="ts">
  2. // use TypeScript
  3. </script>

lang 可以被应用给任意块,比如我们可以在 <style> 标签上使用 SASS 或是 <template> 上使用 Pug

  1. <template lang="pug">
  2. p {{ msg }}
  3. </template>
  4. <style lang="scss">
  5. $primary-color: #333;
  6. body {
  7. color: $primary-color;
  8. }
  9. </style>

注意对各种不同的预处理的集成会导致工具链的不同,你应该查看相应的工具链文档了解细节:

Src 导入 {#src-imports}

如果你更喜欢将你的 *.vue 组件分散到多个文件中,你可以为一个语言区块使用 src 这个 attribute 来导入一个外部文件:

  1. <template src="./template.html"></template>
  2. <style src="./style.css"></style>
  3. <script src="./script.js"></script>

请注意 src 导入和 Webpack 的模块请求遵循相同的路径解析规则,这意味着:

  • 相对路径需要以 ./ 开头
  • 你也可以从 npm 依赖中导入资源
  1. <!-- 从所安装的 "todomvc-app-css" npm 包中导入一个文件 -->
  2. <style src="todomvc-app-css/index.css" />

src 导入对自定义区块也同样适用:

  1. <unit-test src="./unit-test.js">
  2. </unit-test>

注释 {#comments}

在每一个区块中你都可以按照相应语言的语法书写注释。(HTML、CSS、JavaScript 和 Pug 等等)对于顶层注释,请使用 HTML 的注释语法 <!-- comment contents here -->