返回

成为 Vite Contributor 的进阶指南

前端

一步一步进入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 优化