成为 Vite Contributor 的进阶指南
2024-01-08 01:13:50
一步一步进入vite社区,成为contributor
今天,我得到了一个朋友的求助信息,是关于Vite的问题。作为一个有着多年前端经验的我,自然乐于伸出援手。问题是关于 Vite 中模块如何处理的。起初,我给出了一个简短的回答,但朋友显然还没有完全理解。于是,我决定以更加详细的方式给他讲解一遍。
从问题开始
朋友的代码如下所示:
import { ref } from 'vue'
export default {
setup() {
const count = ref(0)
return {
count
}
}
}
朋友想要做的很简单,就是将这个组件导入到一个新的组件中,但是却遇到了问题。
解决之道
首先,我们需要导入组件:
import MyComponent from './MyComponent.vue'
然后,我们需要在模板中使用组件:
<template>
<MyComponent />
</template>
但是,当我们这么做的时候,会遇到一个错误:
[Vue warn]: Failed to resolve component: MyComponent
为什么会这样呢?因为 Vite 默认使用按需加载的策略,这意味着只有当组件被实际使用时才会加载。
为了解决这个问题,我们需要在 Vite 配置文件中启用预加载:
// vite.config.js
export default {
// ...
build: {
rollupOptions: {
output: {
manualChunks: {
'my-component': ['MyComponent.vue']
}
}
}
}
}
启用预加载后,组件就会在应用程序启动时被加载,这样就可以避免错误了。
意外的收获
在帮助朋友解决这个问题的过程中,我发现 Vite 的文档中并没有详细解释如何预加载组件。于是我决定提交一个 PR 来改善文档。
经过一番努力,我的 PR 被接受了,这也意味着我成为了 Vite 的 contributor。
总结
这是一个真实的故事,分享了我是如何通过解决一个问题成为 Vite 的 contributor 的。我希望这个故事能激励你做出贡献,无论你的技能水平如何。
进一步阅读
Vite preloading深层含义
标记为预加载
我们可以通过在Vite中手动添加配置来实现特定代码被标记为预加载,使之被webpack打包时自动包含在入口文件之中。具体步骤如下:
- 需要一个vite.config.js的配置文件,如果还没有则先创建它。
- 在vite.config.js中添加如下的代码片段:
import { defineConfig } from 'vite'
export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks: {
// 键:用户自定义预加载包的名字
// 值:预加载包包含的js模块
'my-component': ['MyComponent.vue']
}
}
}
}
})
- 重启开发环境或重新构建项目,加载好的部分会包含所有你配置的部分。
Vite预加载与webpack预加载的对比
目前,Vite与webpack在这方面有许多共同之处,都有着官方文档与现成的案例可供我们使用。但同时,也有许多的差异值得我们注意。
-
预加载方式不同
- Vite:添加单独的配置文件来实现。
- Webpack:可以在项目的配置文件中配置,也可以在代码中使用
webpackPrefetch()
函数实现。
-
预加载范围不同
- Vite:仅支持模块预加载。
- Webpack:支持模块预加载和资源预加载。
-
异步加载处理不同
- Vite:默认使用按需加载,只有在组件被实际使用时才会加载。
- Webpack:默认使用同步加载,所有模块都会在应用程序启动时加载。
希望这篇小教程能够帮助您更好的理解Vite中的预加载,并能够在项目中熟练运用这项技术。
相关代码
export default {
setup() {
const count = ref(0)
return {
count
}
}
}
import MyComponent from './MyComponent.vue'
<template>
<MyComponent />
</template>
// vite.config.js
export default {
// ...
build: {
rollupOptions: {
output: {
manualChunks: {
'my-component': ['MyComponent.vue']
}
}
}
}
}
import { defineConfig } from 'vite'
export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks: {
// 键:用户自定义预加载包的名字
// 值:预加载包包含的js模块
'my-component': ['MyComponent.vue']
}
}
}
}
})
SEO 优化