首页 / Astro 教程 / Vue / Svelte / Preact / Solid 集成

Astro 教程

Vue / Svelte / Preact / Solid 集成

本教程共 56 篇 · 第 30 篇 · 更新于 2026-08-07 · 约 9 分钟阅读

AstroAstro 教程VueSveltePreactSolidJS集成客户端指令

本节目标:掌握除 React 外四个官方框架集成的安装与配置差异,知道 Preact 怎么兼容 React、Svelte 为什么要 svelte.config.js。

共同的安装方式

四个集成都用同一套思路:先 astro add,或手动装包再改 astro.config.mjs。下面每个框架给出各自的命令和最简配置,细节差异单独说。

Vue(@astrojs/vue)

Vue 3 的集成。一键安装:

npx astro add vue
# 或 pnpm astro add vue / yarn astro add vue

手动安装:

npm install @astrojs/vue
# 若启动报 Cannot find package 'vue',再装:npm install vue

配置:

import { defineConfig } from 'astro/config';
import vue from '@astrojs/vue';

export default defineConfig({
  // ...
  integrations: [vue()],
});

Vue 集成支持几个可选配置,比如 appEntrypoint(扩展 Vue 的 app 实例、用自定义插件)、jsx(开启 Vue JSX 渲染)、devtools(开发环境开启 Vue DevTools)。

import { defineConfig } from 'astro/config';
import vue from '@astrojs/vue';

export default defineConfig({
  integrations: [
    vue({
      appEntrypoint: '/src/pages/_app', // 自定义插件入口
      jsx: true,                         // 支持 Vue JSX
      devtools: true,                   // 开发期 DevTools
    }),
  ],
});

appEntrypoint 指向的文件,默认导出一个接收 Vue App 实例的函数,方便你 app.use(插件)

import type { App } from 'vue';
import i18nPlugin from 'my-vue-i18n-plugin';

export default (app: App) => {
  app.use(i18nPlugin);
};

Svelte(@astrojs/svelte)

当前集成面向 Svelte 5。若要用 Svelte 3 / 4,请装 @astrojs/svelte@5

npx astro add svelte
# 或 pnpm astro add svelte / yarn astro add svelte

手动安装后,除了改配置,还要在项目根目录新建 svelte.config.js

import { vitePreprocess } from '@astrojs/svelte';

export default {
  preprocess: vitePreprocess(),
};

配置:

import { defineConfig } from 'astro/config';
import svelte from '@astrojs/svelte';

export default defineConfig({
  // ...
  integrations: [svelte()],
});

如果你在 Svelte 文件里用了 SCSS 或 Stylus,这个 svelte.config.js 里的 vitePreprocess 会负责预处理。跑 astro add svelte 时它会自动帮你建好。

Preact(@astrojs/preact)

Preact 是个轻量库,API 和 React 几乎一样,但包只有约 3kB。如果你用过 React,会非常顺手。甚至能用 compat 选项直接渲染很多 React 组件。

npx astro add preact
# 或 pnpm astro add preact / yarn astro add preact

手动安装后,同样要改 tsconfig.json 的 JSX 设置,不过 jsxImportSource 换成 preact

{
  "extends": "astro/tsconfigs/strict",
  "include": [".astro/types.d.ts", "**/*"],
  "exclude": ["dist"],
  "compilerOptions": {
    "jsx": "react-jsx",
    "jsxImportSource": "preact"
  }
}

配置:

import { defineConfig } from 'astro/config';
import preact from '@astrojs/preact';

export default defineConfig({
  integrations: [preact()],
});

Preact 最有用的选项是 compat:开启后无需安装 React 那套大库,就能渲染 React 组件,也允许在 Preact 组件里 import React 组件。

import { defineConfig } from 'astro/config';
import preact from '@astrojs/preact';

export default defineConfig({
  integrations: [preact({ compat: true })],
});

要是你 import 的是第三方 React 组件库,想把它内部的 react / react-dom 替换成 preact/compat,可以在 package.json 里用 overrides

{
  "overrides": {
    "react": "npm:@preact/compat@latest",
    "react-dom": "npm:@preact/compat@latest"
  }
}

此外还有 babel(给 Preact 的 Vite 插件传额外 Babel 配置)和 devtools(开发期开启 Preact DevTools)两个选项,按需使用。

SolidJS(@astrojs/solid-js)

npx astro add solid
# 或 pnpm astro add solid / yarn astro add solid

手动安装后,tsconfig.json 的 JSX 设置又不一样,jsxpreservejsxImportSourcesolid-js

{
  "extends": "astro/tsconfigs/strict",
  "include": [".astro/types.d.ts", "**/*"],
  "exclude": ["dist"],
  "compilerOptions": {
    "jsx": "preserve",
    "jsxImportSource": "solid-js"
  }
}

配置:

import { defineConfig } from 'astro/config';
import solidJs from '@astrojs/solid-js';

export default defineConfig({
  integrations: [solidJs()],
});

Solid 有个贴心设计:服务端渲染和带水合的组件,会自动被包进顶层的 Suspense 边界,用 renderToStringAsync 渲染。所以用 Solid 的 createResource 在服务端取异步数据,初始 HTML 里就已经包含结果,不用你手动加 Suspense。

function CharacterName() {
  const [name] = createResource(() =>
    fetch('https://swapi.dev/api/people/1')
      .then((r) => r.json())
      .then((d) => d.name)
  );

  return (
    <>
      <h2>Name:</h2>
      <div>{name()}</div>
    </>
  );
}

Solid 也支持 devtools 选项,需在项目依赖里再加 solid-devtools

多 JSX 框架的通用配置

React、Preact、Solid 都是 .jsx / .tsx。多个共存时,靠 include 指明目录,这部分在 React 那章已经演示过,这里不再贴重复代码。一句话:把不同框架组件分目录放,再在各自集成里 include 对应目录即可。

同一个功能,四种写法

为了让差异更直观,下面用「计数器」分别写四个框架的写法。重点看语法风格,不用纠结细节。

Vue(<script setup>):

<script setup>
import { ref } from 'vue';
const count = ref(0);
</script>

<template>
  <button @click="count++">点了 {{ count }} 次</button>
</template>

Svelte:

<script>
  let count = 0;
</script>

<button on:click={() => count++}>点了 {count} 次</button>

Preact(和 React 几乎一致):

import { useState } from 'preact/hooks';

export default function Counter() {
  const [count, setCount] = useState(0);
  return <button onClick={() => setCount(count + 1)}>点了 {count} 次</button>;
}

SolidJS(细粒度响应式):

import { createSignal } from "solid-js";

export default function Counter() {
  const [count, setCount] = createSignal(0);
  return <button onClick={() => setCount(count() + 1)}>点了 {count()} 次</button>;
}

在 Astro 页面里,它们都这样用:import 进来,加 client:* 指令即可。你也可以在同一页同时用这四个,只要它们的文件后缀和 include 配置对得上。

各自的小提醒

  • Vue:若用 JSX 模板或自定义元素,记得在 vue({...}) 里配 jsxtemplate.compilerOptions
  • Svelte:SCSS/Stylus 要写 svelte.config.jsvitePreprocess;Svelte 5 是当前默认。
  • Preactcompat: true 能直接吃 React 组件,体积优势明显。
  • SolidJS:异步数据用 createResource,默认就包了 Suspense,不用手动加。

一张表快速对比

框架集成包关键配置适合谁
Vue@astrojs/vueappEntrypoint / jsx / devtools熟悉 Vue 模板写法
Svelte@astrojs/svelte需 svelte.config.js想要极小运行时
Preact@astrojs/preactcompat 兼容 React想轻量又用 React API
SolidJS@astrojs/solid-jstsconfig 用 preserve复杂响应式交互

先想清楚:真的要四个都装吗

看到四个框架都能接,有人会想一口气全装。但请先问自己:项目里真的会同时用到吗?大多数情况下,一个团队、一个项目只主用一种框架。

只装一个最省心:不用管 include 区分目录,不用怕文件后缀冲突,团队成员也只要懂一种。只有当你的确需要在同一站里混用(比如老代码是 Vue、新模块想用 React)时,才值得同时接多个。

各框架的设计取舍

Vue 走「模板 + 响应式」路线,写起来像在写 HTML,对新手友好,国内社区也很成熟。Svelte 反其道而行,把很多工作放在编译阶段完成,运行时几乎不占地方,最终打包体积很小。

Preact 是 React 的「轻量替身」,API 几乎一模一样,但体积小到只有约 3kB。老 React 项目想瘦身,用 compat 选项基本能无缝切换。SolidJS 则主打细粒度响应式,状态变了只更新相关那一点 DOM,性能在复杂交互里很出色。

选哪个没有绝对答案,看团队熟悉度和项目需求。好消息是,它们在 Astro 里的用法高度一致:装包、改配置、import、加 client:* 指令。学会一个,其余触类旁通。

装好之后怎么验证

集成装完、配置改好,最快的验证方式是建一个最小的框架组件,加 client:load 丢到页面上,跑起开发服务器看它能否交互。能点击、能响应,说明集成生效。

如果浏览器里组件一片空白或报错,先检查两件事:对应框架包是否真的装上了(比如 vuesveltesolid-js);多 JSX 框架时 include 目录是否指对。这两类问题占了新手踩坑的大多数。

各框架常见踩坑

把四个框架最容易翻车的地方列成一张清单,照着查能省不少时间:

  • Vue:组件不渲染,先看 vue 包有没有装;用了 JSX 模板却没在 vue({ jsx: true }) 里开,语法会报错。
  • Svelte:用了 SCSS/Stylus 却没建 svelte.config.js(或里头的 vitePreprocess 没配),样式预处理会失败;Svelte 5 是新默认,老项目要显式装 @astrojs/svelte@5
  • Preact:想直接吃 React 组件却忘了 compat: true,结果 import 的 React 组件跑不起来。
  • SolidJS:tsconfig 的 jsx 必须写 preserve、且 jsxImportSourcesolid-js;写错就编译不过。

还有一个共通坑:忘了加 client:* 指令。不管哪个框架,没有指令就不会发 JS,组件只会是静态 HTML,自然「点了没反应」。

写在最后

四个框架集成的「安装步骤」看着多,其实套路完全一样:跑一条 astro add,或在 astro.config.mjsintegrations 里加一行。真正的差异只在少数配置项:Svelte 多一个 svelte.config.js,Preact 有 compat 兼容 React,Solid 的 tsconfig 写法不同。把这些记住,四个框架你都能轻松接上。

记不住也没关系,官方文档每个集成页都列了完整步骤。本教程只帮你建立「整体图景」,真到用时对着文档抄一遍即可。

版本对应关系

写这篇时各集成版本大致是:Vue v7.0.2、Svelte v9.0.1、Preact v6.0.2、Solid v7.0.2,都能和 Astro 7 配合。版本号会随框架更新而变,但「装包 + 改配置 + 加 client 指令」的主线不会变。真遇到报错,多半是 peer 依赖没装全(比如忘了装 vuesvelte),按终端提示补上即可。

Tip

不确定装没装对?最简单的办法:建一个最小组件、加 client:load,能点就说明通路通了。

小结

四个框架集成步骤大体一致:装包、改 astro.config.mjs、按需改 tsconfig.jsonsvelte.config.js。差异点记住三处:Svelte 要 svelte.config.js;Preact 有 compat 兼容 React;Solid 的 tsconfig 用 preserve