Vue 项目之 Webpack 打包 Vue 代码(3)

325 阅读2分钟

「这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

1. Webpack 中对 SFC 文件的处理

前面我们在 src/main.js 文件中,把想要展示的内容直接通过字符串的格式传给了 template 选项:

...

const app = createApp({
  template: '<h2>我是 Vue 渲染出来的</h2>', // 直接以字符串格式传递模板内容
  ...
});
app.mount('#app');

但是,如果所有模板内容都通过字符串形式直接传给 template 选项肯定不可取。

因此,我们可以把模板内容抽离出来,然后再做绑定,比如将模板内容抽取到 public/index.html 这一模板文件中,同时还可以添加使用了 data 中数据的代码:

<!DOCTYPE html>
<html lang="">
  <head>
    ...
  </head>
  <body>
    ...

    <div id="app"></div>
		
    <!-- src/main.js 中绑定的模板内容 -->
    <template id="my-app">
      <h2>我是 Vue 渲染出来的</h2>
      <h2>{{ title }}</h2>
    </template>

    <!-- built files will be auto injected -->
  </body>
</html>

同时修改 src/main.js 文件中的代码:

...

const app = createApp({
  template: '#my-app', // 通过元素的 id 绑定相应的模板内容
  ...
});
app.mount('#app');

修改完后,我们再来打包看下效果:

image-20211121221207306

可以看到,页面中也能成功显示相应的内容。

但是,这种把模板内容抽离出来,然后再做绑定的方式有一个弊端:Vue 的代码的编写(这里是在 main.js 中)和 template 内容的编写(这里是在 index.html 中)是分开的,它们不在同一个文件中,这就意味着我们编写代码时势必要在这两个文件之间来回切换,而且,真实开发中组件会有很多,直接在 index.html 中写一大堆的 template 肯定也不现实。

所以,我们希望把组件的模板、数据(以及其它逻辑代码)甚至样式相关的代码都放在一个文件中来编写。那 Vue 有没有给我们提供这样一种文件呢?有,这个文件就是 SFCSingle File Components,单文件组件,也就是 .vue 文件)文件。我们的模板、逻辑和样式代码都可以在这个 SFC 文件中进行编写。

在编写这个 SFC 文件(.vue 文件)之前,我们先来讲下如何在我们使用的 VS Code 编辑器中对 SFC 文件做支持。

1.1 VS CodeSFC 文件的支持

默认情况下,VS Code 编辑器是不认识 SFC 文件(.vue 文件)的,因此在 .vue 文件中的代码是没有高亮显示的,也没有很好的提示等功能。

为了对 SFC 文件做较好的支持,我们在 VS Code 中可以选择使用两个扩展来获得对 SFC 文件的支持:

  • Vetur:从 Vue2 开发开始就一直在使用的支持 VueVS Code 的插件,但它对 Vue3 的支持不太好(比如当我们在一个根下写多个元素时它会报错等等);
  • Volar:目前官方推荐(尤雨溪亲推)的插件(后续会基于 Volar 开发官方的 VS Code 插件),对 Vue3TypeScript 的支持更好;

我们这里选择安装并启用 Volar 插件:

image-20211122232342520