Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DCloud
unidocs-uni-app-x-zh
提交
35041195
U
unidocs-uni-app-x-zh
项目概览
DCloud
/
unidocs-uni-app-x-zh
通知
144
Star
2
Fork
33
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
9
列表
看板
标记
里程碑
合并请求
11
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
unidocs-uni-app-x-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
9
Issue
9
列表
看板
标记
里程碑
合并请求
11
合并请求
11
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
35041195
编写于
5月 31, 2024
作者:
雪洛
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
docs: 更新ssr兼容说明
上级
67acb2ca
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
126 addition
and
124 deletion
+126
-124
docs/web/README.md
docs/web/README.md
+1
-1
docs/web/ssr.md
docs/web/ssr.md
+125
-123
未找到文件。
docs/web/README.md
浏览文件 @
35041195
...
...
@@ -187,7 +187,7 @@ uni相关的异步api在web端不传回调时会返回promise(详情参考:[
-
[x] 国际化
-
[x] 地图
-
[x] uni-push2.0
-
[
] 服务端渲染
-
[
x] 服务端渲染 新增于HBuilderX 4.18
-
[
] [接口Promise化
](
https://uniapp.dcloud.net.cn/api/#api-promise-%E5%8C%96
)
## 运行与发行
...
...
docs/web/ssr.md
浏览文件 @
35041195
## 使用ssr
> 新增于 HBuilderX 4.18
uni-app 默认情况下,是在客户端中输出 Vue 组件,进行生成 DOM 和操作 DOM。然而,也可以将同一个组件渲染为服务器端的 HTML 字符串,将它们直接发送到浏览器,最后将这些静态标记"激活"为客户端上完全可交互的应用程序。
服务器渲染的 uni-app 应用程序也可以被认为是"同构"或"通用",因为应用程序的大部分代码都可以在服务器和客户端上运行。
...
...
@@ -42,33 +44,33 @@ export default defineConfig({
**示例**
```
ts
<
template
>
<
text
v
-
if
=
"
item
"
>
{{
item
.
title
}}
<
/text>
<
text
v
-
else
>
...
<
/text>
<
/template>
<
script
>
const
id
=
1
;
// 模拟ID
export
default
{
computed
:
{
item
()
{
return
this
.
$store
.
state
.
items
[
id
]
}
},
mounted
()
{
// 仅客户端执行的生命周期
if
(
!
this
.
item
)
{
// 判断服务端是否已正常获取,若未获取,重新调用加载数据
this
.
fetchItem
()
}
},
async
serverPrefetch
()
{
// 服务端预取数据的生命周期
await
this
.
fetchItem
()
},
methods
:
{
fetchItem
()
{
return
this
.
$store
.
dispatch
(
'
fetchItem
'
,
id
)
}
}
}
<
template
>
<
text
v
-
if
=
"
item
"
>
{{
item
.
title
}}
<
/text
>
<
text
v
-
else
>
...
<
/text
>
<
/template
>
<
script
>
const
id
=
1
;
// 模拟ID
export
default
{
computed
:
{
item
()
{
return
this
.
$store
.
state
.
items
[
id
]
}
},
mounted
()
{
// 仅客户端执行的生命周期
if
(
!
this
.
item
)
{
// 判断服务端是否已正常获取,若未获取,重新调用加载数据
this
.
fetchItem
()
}
},
async
serverPrefetch
()
{
// 服务端预取数据的生命周期
await
this
.
fetchItem
()
},
methods
:
{
fetchItem
()
{
return
this
.
$store
.
dispatch
(
'
fetchItem
'
,
id
)
}
}
}
<
/script>
```
...
...
@@ -77,7 +79,7 @@ export default defineConfig({
对于简单的需要云端客户端保持一致的数据可以使用uni-app提供的ssrRef及shallowSsrRef实现
```
ts
const
categories
=
ssrRef
([
'
c1
'
,
'
c2
'
],
'
categories
'
);
const
categories
=
ssrRef
([
'
c1
'
,
'
c2
'
],
'
categories
'
);
export
default
{
data
()
{
return
{
...
...
@@ -94,100 +96,100 @@ export default {
**main.uts**
```
ts
import
{
createSSRApp
}
from
'
vue
'
import
App
from
'
./App.uvue
'
import
createStore
from
'
./store
'
export
function
createApp
()
{
const
app
=
createSSRApp
(
App
)
const
store
=
createStore
()
// 创建 store
app
.
use
(
store
)
return
{
app
,
store
,
// 必须返回 store
}
import
{
createSSRApp
}
from
'
vue
'
import
App
from
'
./App.uvue
'
import
createStore
from
'
./store
'
export
function
createApp
()
{
const
app
=
createSSRApp
(
App
)
const
store
=
createStore
()
// 创建 store
app
.
use
(
store
)
return
{
app
,
store
,
// 必须返回 store
}
}
```
**store/index.uts**
```
ts
import
{
createStore
}
from
'
vuex
'
// 模拟接口获取数据
function
fetchItem
(
id
)
{
return
new
Promise
((
resolve
)
=>
{
setTimeout
(()
=>
{
resolve
({
id
,
title
:
'
title
'
+
id
,
})
},
300
)
})
}
export
default
()
=>
{
return
createStore
({
state
()
{
return
{
items
:
{},
}
},
actions
:
{
fetchItem
({
commit
},
id
)
{
return
fetchItem
(
id
).
then
((
item
)
=>
{
commit
(
'
setItem
'
,
{
id
,
item
})
})
},
},
mutations
:
{
setItem
(
state
,
{
id
,
item
})
{
state
.
items
[
id
]
=
item
},
},
})
import
{
createStore
}
from
'
vuex
'
// 模拟接口获取数据
function
fetchItem
(
id
)
{
return
new
Promise
((
resolve
)
=>
{
setTimeout
(()
=>
{
resolve
({
id
,
title
:
'
title
'
+
id
,
})
},
300
)
})
}
export
default
()
=>
{
return
createStore
({
state
()
{
return
{
items
:
{},
}
},
actions
:
{
fetchItem
({
commit
},
id
)
{
return
fetchItem
(
id
).
then
((
item
)
=>
{
commit
(
'
setItem
'
,
{
id
,
item
})
})
},
},
mutations
:
{
setItem
(
state
,
{
id
,
item
})
{
state
.
items
[
id
]
=
item
},
},
})
}
```
**pages/index/index.uvue**
```
vue
<
template
>
<text
v-if=
"item"
>
{{
item
.
title
}}
</text>
<
template
>
<text
v-if=
"item"
>
{{
item
.
title
}}
</text>
<text
v-else
>
...
</text>
<text>
{{
JSON
.
stringify
(
categories
)
}}
</text>
</
template
>
<text>
{{
JSON
.
stringify
(
categories
)
}}
</text>
</
template
>
<
script
>
import
{
ssrRef
}
from
'
@dcloudio/uni-app
'
const
categories
=
ssrRef
([
'
c1
'
,
'
c2
'
],
'
categories
'
);
const
id
=
1
;
// 模拟ID
const
categories
=
ssrRef
([
'
c1
'
,
'
c2
'
],
'
categories
'
);
const
id
=
1
;
// 模拟ID
export
default
{
data
()
{
return
{
categories
}
},
computed
:
{
item
()
{
return
this
.
$store
.
state
.
items
[
id
]
}
},
mounted
()
{
// 仅客户端执行的生命周期
if
(
!
this
.
item
)
{
// 判断服务端是否已正常获取,若未获取,重新调用加载数据
this
.
fetchItem
()
}
},
async
serverPrefetch
()
{
// 服务端预取数据的生命周期
await
this
.
fetchItem
()
},
methods
:
{
fetchItem
()
{
return
this
.
$store
.
dispatch
(
'
fetchItem
'
,
id
)
}
}
}
},
computed
:
{
item
()
{
return
this
.
$store
.
state
.
items
[
id
]
}
},
mounted
()
{
// 仅客户端执行的生命周期
if
(
!
this
.
item
)
{
// 判断服务端是否已正常获取,若未获取,重新调用加载数据
this
.
fetchItem
()
}
},
async
serverPrefetch
()
{
// 服务端预取数据的生命周期
await
this
.
fetchItem
()
},
methods
:
{
fetchItem
()
{
return
this
.
$store
.
dispatch
(
'
fetchItem
'
,
id
)
}
}
}
</
script
>
```
...
...
@@ -201,7 +203,7 @@ uni-app-x内page-meta仅保留了存放head的功能,page-meta内的head节点
<head>
<meta
name=
"keywords"
content=
"uni-app ssr"
/>
</head>
</page-meta>
</page-meta>
</
template
>
```
...
...
@@ -210,26 +212,26 @@ uni-app-x内page-meta仅保留了存放head的功能,page-meta内的head节点
使用此功能需要确保项目
`index.html`
内head下有head-meta注释。如下:
```
html
<!DOCTYPE html>
<html
lang=
"en"
>
<head>
<meta
charset=
"UTF-8"
/>
<script>
var
coverSupport
=
'
CSS
'
in
window
&&
typeof
CSS
.
supports
===
'
function
'
&&
(
CSS
.
supports
(
'
top: env(a)
'
)
||
CSS
.
supports
(
'
top: constant(a)
'
))
document
.
write
(
'
<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
'
:
''
)
+
'
" />
'
)
</script>
<title></title>
<!--head-meta-->
<!--preload-links-->
<!--app-context-->
</head>
<body>
<div
id=
"app"
>
<!--app-html-->
</div>
<script
type=
"module"
src=
"/main"
></script>
</body>
<!DOCTYPE html>
<html
lang=
"en"
>
<head>
<meta
charset=
"UTF-8"
/>
<script>
var
coverSupport
=
'
CSS
'
in
window
&&
typeof
CSS
.
supports
===
'
function
'
&&
(
CSS
.
supports
(
'
top: env(a)
'
)
||
CSS
.
supports
(
'
top: constant(a)
'
))
document
.
write
(
'
<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
'
:
''
)
+
'
" />
'
)
</script>
<title></title>
<!--head-meta-->
<!--preload-links-->
<!--app-context-->
</head>
<body>
<div
id=
"app"
>
<!--app-html-->
</div>
<script
type=
"module"
src=
"/main"
></script>
</body>
</html>
```
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录