提交 35041195 编写于 作者: 雪洛's avatar 雪洛

docs: 更新ssr兼容说明

上级 67acb2ca
...@@ -187,7 +187,7 @@ uni相关的异步api在web端不传回调时会返回promise(详情参考:[ ...@@ -187,7 +187,7 @@ uni相关的异步api在web端不传回调时会返回promise(详情参考:[
- [x] 国际化 - [x] 国际化
- [x] 地图 - [x] 地图
- [x] uni-push2.0 - [x] uni-push2.0
- [ ] 服务端渲染 - [x] 服务端渲染 新增于HBuilderX 4.18
- [ ] [接口Promise化](https://uniapp.dcloud.net.cn/api/#api-promise-%E5%8C%96) - [ ] [接口Promise化](https://uniapp.dcloud.net.cn/api/#api-promise-%E5%8C%96)
## 运行与发行 ## 运行与发行
......
## 使用ssr ## 使用ssr
> 新增于 HBuilderX 4.18
uni-app 默认情况下,是在客户端中输出 Vue 组件,进行生成 DOM 和操作 DOM。然而,也可以将同一个组件渲染为服务器端的 HTML 字符串,将它们直接发送到浏览器,最后将这些静态标记"激活"为客户端上完全可交互的应用程序。 uni-app 默认情况下,是在客户端中输出 Vue 组件,进行生成 DOM 和操作 DOM。然而,也可以将同一个组件渲染为服务器端的 HTML 字符串,将它们直接发送到浏览器,最后将这些静态标记"激活"为客户端上完全可交互的应用程序。
服务器渲染的 uni-app 应用程序也可以被认为是"同构"或"通用",因为应用程序的大部分代码都可以在服务器和客户端上运行。 服务器渲染的 uni-app 应用程序也可以被认为是"同构"或"通用",因为应用程序的大部分代码都可以在服务器和客户端上运行。
...@@ -42,33 +44,33 @@ export default defineConfig({ ...@@ -42,33 +44,33 @@ export default defineConfig({
**示例** **示例**
```ts ```ts
<template> <template>
<text v-if="item">{{ item.title }}</text> <text v-if="item">{{ item.title }}</text>
<text v-else>...</text> <text v-else>...</text>
</template> </template>
<script> <script>
const id = 1;// 模拟ID const id = 1;// 模拟ID
export default { export default {
computed: { computed: {
item() { item() {
return this.$store.state.items[id] return this.$store.state.items[id]
} }
}, },
mounted() { // 仅客户端执行的生命周期 mounted() { // 仅客户端执行的生命周期
if (!this.item) { // 判断服务端是否已正常获取,若未获取,重新调用加载数据 if (!this.item) { // 判断服务端是否已正常获取,若未获取,重新调用加载数据
this.fetchItem() this.fetchItem()
} }
}, },
async serverPrefetch() { // 服务端预取数据的生命周期 async serverPrefetch() { // 服务端预取数据的生命周期
await this.fetchItem() await this.fetchItem()
}, },
methods: { methods: {
fetchItem() { fetchItem() {
return this.$store.dispatch('fetchItem', id) return this.$store.dispatch('fetchItem', id)
} }
} }
} }
</script> </script>
``` ```
...@@ -77,7 +79,7 @@ export default defineConfig({ ...@@ -77,7 +79,7 @@ export default defineConfig({
对于简单的需要云端客户端保持一致的数据可以使用uni-app提供的ssrRef及shallowSsrRef实现 对于简单的需要云端客户端保持一致的数据可以使用uni-app提供的ssrRef及shallowSsrRef实现
```ts ```ts
const categories = ssrRef(['c1', 'c2'], 'categories'); const categories = ssrRef(['c1', 'c2'], 'categories');
export default { export default {
data() { data() {
return { return {
...@@ -94,100 +96,100 @@ export default { ...@@ -94,100 +96,100 @@ export default {
**main.uts** **main.uts**
```ts ```ts
import { createSSRApp } from 'vue' import { createSSRApp } from 'vue'
import App from './App.uvue' import App from './App.uvue'
import createStore from './store' import createStore from './store'
export function createApp() { export function createApp() {
const app = createSSRApp(App) const app = createSSRApp(App)
const store = createStore() // 创建 store const store = createStore() // 创建 store
app.use(store) app.use(store)
return { return {
app, app,
store,// 必须返回 store store,// 必须返回 store
} }
} }
``` ```
**store/index.uts** **store/index.uts**
```ts ```ts
import { createStore } from 'vuex' import { createStore } from 'vuex'
// 模拟接口获取数据 // 模拟接口获取数据
function fetchItem(id) { function fetchItem(id) {
return new Promise((resolve) => { return new Promise((resolve) => {
setTimeout(() => { setTimeout(() => {
resolve({ resolve({
id, id,
title: 'title' + id, title: 'title' + id,
}) })
}, 300) }, 300)
}) })
} }
export default () => { export default () => {
return createStore({ return createStore({
state() { state() {
return { return {
items: {}, items: {},
} }
}, },
actions: { actions: {
fetchItem({ commit }, id) { fetchItem({ commit }, id) {
return fetchItem(id).then((item) => { return fetchItem(id).then((item) => {
commit('setItem', { id, item }) commit('setItem', { id, item })
}) })
}, },
}, },
mutations: { mutations: {
setItem(state, { id, item }) { setItem(state, { id, item }) {
state.items[id] = item state.items[id] = item
}, },
}, },
}) })
} }
``` ```
**pages/index/index.uvue** **pages/index/index.uvue**
```vue ```vue
<template> <template>
<text v-if="item">{{ item.title }}</text> <text v-if="item">{{ item.title }}</text>
<text v-else>...</text> <text v-else>...</text>
<text>{{ JSON.stringify(categories) }}</text> <text>{{ JSON.stringify(categories) }}</text>
</template> </template>
<script> <script>
import { ssrRef } from '@dcloudio/uni-app' import { ssrRef } from '@dcloudio/uni-app'
const categories = ssrRef(['c1', 'c2'], 'categories'); const categories = ssrRef(['c1', 'c2'], 'categories');
const id = 1;// 模拟ID const id = 1;// 模拟ID
export default { export default {
data() { data() {
return { return {
categories categories
} }
}, },
computed: { computed: {
item() { item() {
return this.$store.state.items[id] return this.$store.state.items[id]
} }
}, },
mounted() { // 仅客户端执行的生命周期 mounted() { // 仅客户端执行的生命周期
if (!this.item) { // 判断服务端是否已正常获取,若未获取,重新调用加载数据 if (!this.item) { // 判断服务端是否已正常获取,若未获取,重新调用加载数据
this.fetchItem() this.fetchItem()
} }
}, },
async serverPrefetch() { // 服务端预取数据的生命周期 async serverPrefetch() { // 服务端预取数据的生命周期
await this.fetchItem() await this.fetchItem()
}, },
methods: { methods: {
fetchItem() { fetchItem() {
return this.$store.dispatch('fetchItem', id) return this.$store.dispatch('fetchItem', id)
} }
} }
} }
</script> </script>
``` ```
...@@ -201,7 +203,7 @@ uni-app-x内page-meta仅保留了存放head的功能,page-meta内的head节点 ...@@ -201,7 +203,7 @@ uni-app-x内page-meta仅保留了存放head的功能,page-meta内的head节点
<head> <head>
<meta name="keywords" content="uni-app ssr" /> <meta name="keywords" content="uni-app ssr" />
</head> </head>
</page-meta> </page-meta>
</template> </template>
``` ```
...@@ -210,26 +212,26 @@ uni-app-x内page-meta仅保留了存放head的功能,page-meta内的head节点 ...@@ -210,26 +212,26 @@ uni-app-x内page-meta仅保留了存放head的功能,page-meta内的head节点
使用此功能需要确保项目`index.html`内head下有head-meta注释。如下: 使用此功能需要确保项目`index.html`内head下有head-meta注释。如下:
```html ```html
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<script> <script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)')) CSS.supports('top: constant(a)'))
document.write( document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />') (coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script> </script>
<title></title> <title></title>
<!--head-meta--> <!--head-meta-->
<!--preload-links--> <!--preload-links-->
<!--app-context--> <!--app-context-->
</head> </head>
<body> <body>
<div id="app"><!--app-html--></div> <div id="app"><!--app-html--></div>
<script type="module" src="/main"></script> <script type="module" src="/main"></script>
</body> </body>
</html> </html>
``` ```
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册