- 快速开始
- 1. 安装依赖
- 安装 Node.js 依赖(用于 SSR)
- 2. 启动 SSR 服务(如果使用 SSR)
- 开发环境
- 生产环境(使用 PM2)
- 3. 配置视图引擎
- 4. 创建第一个 Vue 模板
- 5. 在控制器中使用
- Vue3 基础
- 使用 Vue3 模板引擎
- 渲染完整页面
- Vue3 SPA
- 渲染 SPA 入口
- 基本用法
- 传递初始数据
- 在 Vue 应用中使用
- Vue3 SSR
- 概述
- 启用 SSR
- 安装依赖
- 进入 SSR 资源目录
- 安装依赖
- 启动 SSR 服务
- 使用 SSR
- SSR 工作原理
- 客户端激活(Hydration)
- HTTP 模式 vs 进程模式
- .vue 单文件组件
- 支持的功能
- 基本结构
- 使用 Props
- 选项式 API
- 组合式 API(部分支持)
- 模板语法
- 插值表达式
- 条件渲染
- 列表渲染
- 属性绑定
- 事件处理
- 双向绑定
- 过滤器
- 内置过滤器
- 使用过滤器
- 自定义过滤器
- 资源管理
- VueResourceManager
- 下载资源
- 自动使用本地资源
- 手动指定资源
- 配置说明
- 视图配置
- Node.js 路径
- SSR 服务地址
- 最佳实践
- 1. 数据传递
- 2. 错误处理
- 3. 性能优化
- 4. 开发环境
- 5. 组件组织
- 6. 使用 .vue 文件
- 故障排查
- SSR 服务无法启动
- PHP 无法连接 SSR 服务
- 渲染结果为空或错误
- 性能问题
- 客户端激活失败
- 常见问题
- Q: SSR 需要 Node.js 吗?
- Q: 如何调试 SSR?
- Q: SSR 性能如何?
- Q: 如何优化 SSR 性能?
- Q: 支持哪些 Vue3 特性?
- Q: 可以同时运行多个 SSR 服务实例吗?
- Q: HTTP 模式支持 HTTPS 吗?
- 相关文档
Vue3 集成
最后更新: 2026-01-27 11:02:47Vue3 集成
Unicode Framework 提供了完整的 Vue3 集成支持,包括服务端渲染(SSR)和单页应用(SPA)支持。
快速开始
1. 安装依赖
<h1 id="安装-nodejs-依赖用于-ssr">安装 Node.js 依赖(用于 SSR)</h1>
cd resources/vue3-ssr
npm install vue@3 @vue/server-renderer
2. 启动 SSR 服务(如果使用 SSR)
<h1 id="开发环境">开发环境</h1>
node resources/vue3-ssr/ssr-server.js
<h1 id="生产环境使用-pm2">生产环境(使用 PM2)</h1>
pm2 start resources/vue3-ssr/ssr-server.js --name vue-ssr
3. 配置视图引擎
在 config/view.php 中配置:
return [
'default_engine' => 'vue', // 设置 Vue3 为默认引擎
'engines' => [
'vue' => [
'vue3_ssr' => [
'enabled' => true,
'mode' => 'http', // 使用 HTTP 模式(推荐)
'ssr_server_url' => 'http://127.0.0.1:3000',
],
],
],
];
4. 创建第一个 Vue 模板
创建 app/{app_name}/view/index/index.vue:
<template>
<div class="welcome">
<h1>{{ title }}</h1>
<p>{{ message }}</p>
</div>
</template>
<script>
export default {
props: {
title: String,
message: String,
},
};
</script>
<style>
.welcome {
padding: 20px;
}
</style>
5. 在控制器中使用
use function view;
$html = view('index/index', [
'title' => '欢迎',
'message' => 'Hello Vue3!',
], 'vue');
Vue3 基础
使用 Vue3 模板引擎
框架支持两种使用方式:
方式一:使用view() 辅助函数
use function view;
// 使用 Vue3 引擎渲染模板
$html = view('user/profile', ['user' => $user], 'vue');
方式二:直接使用引擎
use Unicode\Framework\View\VueViewEngine;
$engine = new VueViewEngine($config);
$html = $engine->render('user/profile', ['user' => $user]);
渲染完整页面
使用 renderFullPage() 方法可以自动生成完整的 HTML 文档结构:
use function viewFullPage;
$html = viewFullPage('user/profile', ['user' => $user], 'vue', [
'title' => '用户资料',
'cdn_resources' => [
'css' => ['/vendor/element-plus@latest/index.css'],
'js' => ['/vendor/vue@3/vue.global.prod.js'],
],
]);
Vue3 SPA
渲染 SPA 入口
使用 vue_spa() 辅助函数渲染 Vue3 单页应用入口:
use function vue_spa;
use Unicode\Framework\Http\Response;
return Response::html(vue_spa(
initialData: ['user' => $user],
appId: 'app',
entryFile: 'js/main.js',
options: [
'title' => '我的应用',
'meta' => [
'description' => '应用描述',
],
]
));
基本用法
namespace App\Index\Controller;
use Unicode\Framework\Http\Response;
use function vue_spa;
class IndexController
{
public function index(): Response
{
$html = vue_spa(
initialData: [
'user' => $user,
'config' => [
'apiUrl' => '/api',
],
],
appId: 'app',
entryFile: 'js/main.js',
options: [
'title' => '我的应用',
'meta' => [
'description' => '应用描述',
],
]
);
return Response::html($html);
}
}
传递初始数据
$html = vue_spa([
'user' => [
'id' => 1,
'name' => 'John Doe',
'email' => 'john@example.com',
],
'settings' => [
'theme' => 'dark',
'language' => 'zh-CN',
],
], 'app', 'js/main.js');
在 Vue 应用中使用
// public/js/main.js
import { createApp } from "vue";
// 获取初始数据
const initialDataElement = document.getElementById("__INITIAL_DATA__");
const __INITIAL_DATA__ = initialDataElement
? JSON.parse(initialDataElement.textContent)
: {};
initialDataElement?.remove();
// 创建 Vue 应用
const app = createApp({
data() {
return __INITIAL_DATA__;
},
mounted() {
console.log(this.user); // 访问初始数据
},
});
app.mount("#app");
Vue3 SSR
概述
Vue3 SSR(服务端渲染)支持两种模式:
- HTTP 模式(推荐):通过 HTTP 请求调用常驻的 Node.js SSR 服务,性能更好
- 进程模式(已废弃):每次渲染启动新的 Node.js 进程,性能较差
启用 SSR
在 config/view.php 中配置:
return [
'engines' => [
'vue' => [
'vue3_ssr' => [
'enabled' => true,
'mode' => 'http', // 使用 HTTP 模式(推荐)
'ssr_server_url' => 'http://127.0.0.1:3000',
'http_timeout' => 10,
'enable_hydration' => true,
'vue_cdn' => 'https://unpkg.com/vue@3/dist/vue.esm-browser.js',
],
],
],
];
安装依赖
<h1 id="进入-ssr-资源目录">进入 SSR 资源目录</h1>
cd resources/vue3-ssr
<h1 id="安装依赖">安装依赖</h1>
npm install vue@3 @vue/server-renderer
启动 SSR 服务
开发环境:node resources/vue3-ssr/ssr-server.js
生产环境(使用 PM2):
pm2 start resources/vue3-ssr/ssr-server.js --name vue-ssr
pm2 save
使用环境变量:
PORT=3000 HOST=127.0.0.1 node resources/vue3-ssr/ssr-server.js
使用 SSR
use function view;
// 使用 Vue3 SSR 渲染
$html = view('user/profile', ['user' => $user], 'vue');
SSR 工作原理
客户端激活(Hydration)
启用客户端激活后,Vue3 会在客户端接管服务端渲染的 HTML:
// 配置中启用
'enable_hydration' => true,
// 使用 renderWithHydration 方法
use Unicode\Framework\View\VueViewEngine;
$engine = new VueViewEngine($config);
$html = $engine->renderWithHydration('user/profile', ['user' => $user], 'app');
// 客户端代码
import { createApp } from "vue";
const app = createApp({
// 组件定义
});
// 激活服务端渲染的 HTML
app.mount("#app");
HTTP 模式 vs 进程模式
| 特性 | HTTP 模式 | 进程模式 | | -------- | ------------- | ----------- | | 性能 | 5-20ms | 100-300ms | | 吞吐量 | 100-500 req/s | 10-30 req/s | | 内存占用 | 中 | 高 | | 推荐场景 | 生产环境 | 不推荐 |
> 注意:进程模式已废弃,建议使用 HTTP 模式。详细说明请参考 Vue3 SSR HTTP 模式指南。
.vue 单文件组件
支持的功能
框架完全支持 .vue 单文件组件格式:
、、 三个部分export default)基本结构
<template>
<div class="user-profile">
<h1>{{ user.name }}</h1>
<p>{{ user.email }}</p>
</div>
</template>
<script>
export default {
props: {
user: {
type: Object,
required: true,
},
},
};
</script>
<style>
.user-profile {
padding: 20px;
}
</style>
使用 Props
<template>
<div>
<h1>{{ title }}</h1>
<ul>
<li v-for="item in items" :key="item.id">
{{ item.name }}
</li>
</ul>
</div>
</template>
<script>
export default {
props: {
title: {
type: String,
required: true,
},
items: {
type: Array,
default: () => [],
},
},
};
</script>
选项式 API
<script>
export default {
props: {
user: Object,
},
data() {
return {
count: 0,
};
},
computed: {
displayName() {
return this.user?.name || "Guest";
},
},
methods: {
increment() {
this.count++;
},
},
};
</script>
组合式 API(部分支持)
<script>
import { ref, computed } from "vue";
export default {
setup(props) {
const count = ref(0);
const doubleCount = computed(() => count.value * 2);
return {
count,
doubleCount,
};
},
};
</script>
模板语法
插值表达式
<template>
<div>
<h1>{{ user.name }}</h1>
<p>{{ user.email }}</p>
<p>{{ message | upper }}</p>
</div>
</template>
条件渲染
<template>
<div v-if="user.status === 'active'">用户已激活</div>
<div v-else-if="user.status === 'pending'">待激活</div>
<div v-else>用户未激活</div>
</template>
列表渲染
<template>
<ul>
<li v-for="user in users" :key="user.id">
{{ user.name }}
</li>
</ul>
<!-- 带索引 -->
<ul>
<li v-for="(user, index) in users" :key="user.id">
{{ index + 1 }}. {{ user.name }}
</li>
</ul>
</template>
属性绑定
<template>
<img :src="user.avatar" :alt="user.name" />
<a :href="user.profileUrl">查看资料</a>
<div :class="{ active: isActive }">内容</div>
</template>
事件处理
<template>
<button @click="handleClick">点击</button>
<form @submit.prevent="handleSubmit">
<input v-model="form.name" />
<button type="submit">提交</button>
</form>
</template>
双向绑定
<template>
<input v-model="user.name" />
<textarea v-model="user.bio"></textarea>
<select v-model="user.role">
<option value="admin">管理员</option>
<option value="user">用户</option>
</select>
</template>
过滤器
内置过滤器
框架提供了以下内置过滤器:
upper:转换为大写lower:转换为小写capitalize:首字母大写json:JSON 编码date:日期格式化default:默认值escape:HTML 转义使用过滤器
<template>
<div>
<p>{{ message | upper }}</p>
<p>{{ user.created_at | date:'Y-m-d H:i:s' }}</p>
<p>{{ user.bio | default:'暂无简介' }}</p>
</div>
</template>
自定义过滤器
在 config/view.php 中注册自定义过滤器:
return [
'engines' => [
'vue' => [
'filters' => [
'truncate' => function($value, $length = 100) {
if (strlen($value) <= $length) {
return $value;
}
return substr($value, 0, $length) . '...';
},
'currency' => function($value, $symbol = '¥') {
return $symbol . number_format($value, 2);
},
],
],
],
];
使用自定义过滤器:
<template>
<div>
<p>{{ description | truncate:50 }}</p>
<p>{{ price | currency:'$' }}</p>
</div>
</template>
资源管理
VueResourceManager
框架提供了 VueResourceManager 来管理 Vue、Element Plus 等 CDN 资源,支持自动下载到本地。
下载资源
使用命令行工具下载资源:
php console vue:download-resources
自动使用本地资源
当使用 renderFullPage() 时,框架会自动检测并使用本地资源(如果已下载):
$html = viewFullPage('template', $data, 'vue');
// 框架会自动使用 public/vendor/ 下的本地资源
手动指定资源
$html = viewFullPage('template', $data, 'vue', [
'cdn_resources' => [
'css' => [
'/vendor/element-plus@latest/index.css',
],
'js' => [
'/vendor/vue@3/vue.global.prod.js',
'/vendor/element-plus@latest/index.full.js',
],
],
]);
配置说明
视图配置
config/view.php:
return [
'default_engine' => 'vue', // 设置 Vue3 为默认引擎
'engines' => [
'vue' => [
// Vue3 SPA 入口文件路径(相对于 public 目录)
'spa_entry_file' => 'js/main.js',
// 自定义过滤器(可选)
'filters' => [
// 'custom_filter' => function($value, $param = '') {
// return $value . $param;
// },
],
// Vue3 SSR 配置
'vue3_ssr' => [
// 是否启用 SSR
'enabled' => true,
// 渲染模式:'http'(推荐)或 'process'(已废弃)
'mode' => 'http',
// HTTP 模式配置
'ssr_server_url' => 'http://127.0.0.1:3000',
'http_timeout' => 10,
// 进程模式配置(仅在 mode='process' 时使用)
'node_path' => 'node',
'ssr_script_path' => null,
// 是否启用客户端激活(hydration)
'enable_hydration' => true,
// 客户端 Vue3 CDN(用于 hydration)
'vue_cdn' => 'https://unpkg.com/vue@3/dist/vue.esm-browser.js',
],
],
],
];
Node.js 路径
// 自动检测(在 PATH 中)
'node_path' => 'node',
// 指定完整路径
'node_path' => '/usr/bin/node',
'node_path' => 'C:\\Program Files\\nodejs\\node.exe',
SSR 服务地址
// 本地服务
'ssr_server_url' => 'http://127.0.0.1:3000',
// 远程服务(需要配置防火墙)
'ssr_server_url' => 'http://192.168.1.100:3000',
// HTTPS 服务(需要配置 SSL 证书)
'ssr_server_url' => 'https://ssr.example.com',
最佳实践
1. 数据传递
// ✅ 推荐:只传递必要的数据
$html = vue_spa([
'user' => [
'id' => $user->id,
'name' => $user->name,
'email' => $user->email,
],
], 'app', 'js/main.js');
// ❌ 错误:传递过多数据
$html = vue_spa([
'user' => $user, // 可能包含敏感信息
], 'app', 'js/main.js');
2. 错误处理
// ✅ 推荐:处理 SSR 错误
try {
$html = view('template', $data, 'vue');
} catch (\Exception $e) {
// 降级到客户端渲染
$html = vue_spa($data, 'app', 'js/main.js');
}
3. 性能优化
// ✅ 推荐:缓存 SSR 结果
$cacheKey = 'vue:ssr:' . md5($template . serialize($data));
$html = $cache->get($cacheKey, function() use ($template, $data) {
return view($template, $data, 'vue');
});
4. 开发环境
// 开发环境:禁用 SSR,使用客户端渲染
if (getenv('APP_ENV') === 'development') {
return vue_spa($data, 'app', 'js/main.js');
}
// 生产环境:使用 SSR
return view('template', $data, 'vue');
5. 组件组织
resources/
├── js/
│ ├── main.js # 入口文件
│ ├── components/ # 组件
│ │ ├── UserCard.vue
│ │ └── UserList.vue
│ └── views/ # 视图
│ ├── Profile.vue
│ └── Settings.vue
└── css/
└── app.css
app/{app_name}/view/
├── index/
│ ├── index.vue # 首页模板
│ └── show.vue # 详情页模板
└── user/
└── profile.vue # 用户资料模板
6. 使用 .vue 文件
推荐使用 .vue 文件而不是 .html 文件:
故障排查
SSR 服务无法启动
症状: 运行node ssr-server.js 时报错
解决方案:
node --versioncd resources/vue3-ssr && npm installlsof -i :3000(Linux/Mac)或 netstat -ano | findstr :3000(Windows)PHP 无法连接 SSR 服务
症状: PHP 报错 "Failed to connect to SSR server" 解决方案:http://127.0.0.1:3000/healthssr_server_url 配置是否正确渲染结果为空或错误
症状: 返回的 HTML 为空或格式不正确 解决方案:性能问题
症状: 渲染速度慢 解决方案:客户端激活失败
症状: 客户端无法激活服务端渲染的 HTML 解决方案:enable_hydration 是否启用常见问题
Q: SSR 需要 Node.js 吗?
A: 是的,Vue3 SSR 需要 Node.js 环境。如果不需要 SSR,可以使用 SPA 模式。
Q: 如何调试 SSR?
A: 在开发环境中禁用 SSR,使用客户端渲染进行调试。或者查看 SSR 服务日志。
Q: SSR 性能如何?
A: HTTP 模式性能很好(5-20ms),进程模式性能较差(100-300ms)。建议使用 HTTP 模式。
Q: 如何优化 SSR 性能?
A:
Q: 支持哪些 Vue3 特性?
A: 支持 Vue3 的核心特性,包括:
Q: 可以同时运行多个 SSR 服务实例吗?
A: 可以,但需要配置不同的端口,并使用负载均衡器分发请求。
Q: HTTP 模式支持 HTTPS 吗?
A: 支持,只需将 ssr_server_url 配置为 https:// 开头即可。但需要配置 SSL 证书。