我正在尝试让服务器端渲染在VueJS中工作。
我一直在关注官方文档,我正在尝试使用axios来实现这个示例。endpoint是正确的,数据确实显示在突变中。
https://ssr.vuejs.org/guide/data.html
我还找到了这个页面,并尝试了其中的大多数示例,包括使用getters、vuex mapState、mapGetter等:
vue。js 2如何从vuex查看存储值
这里是
存储/索引。js
:
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
import { fetchPage } from './api'
export function createStore () {
return new Vuex.Store({
strict: true,
state: () => ({
res: {}
}),
actions: {
actXY ({ commit }, page) {
fetchPage('homepage').then((item) => {
commit('mutXY', { page, item });
}).catch(error => {
throw new Error(`Store ${error}`);
})
}
},
mutations: {
mutXY (state, { page, item }) {
Vue.set(state.res, page, item);
console.log(state.res.homepage.data)
}
},
getters: {
getXY (state) {
return state.res
}
}
})
}
控制台日志显示了正确的信息,这意味着axiosendpoint正在工作并更新状态对象。最初,我试图调用
变异
,但后来我尝试调用getter
。不幸的是,getter
中没有更新新数据,因此当然,组件中没有显示任何新数据。
这是
主页。vue
:
<template>
<div v-if="htmlData">{{ JSON.stringify(htmlData) }}</div>
<div v-else>loading?</div>
</template>
<script>
export default ({
name: 'homepage',
computed: {
htmlData () {
console.log("computed = " + JSON.stringify(this.$store.state.res));
console.log(this.$store.getters.getXY);
return this.$store.getters
// return this.getQuery()
}
},
serverPrefetch () {
return this.getData()
},
mounted () {
console.log("in mounted")
if (!this.item) {
this.getData()
}
},
methods: {
getData () {
return this.$store.dispatch('actXY', 'homepage')
}
}
})
</script>
如前所述,
htmlData
将显示:
{"getXY":{}}
是的,我在
getter中尝试了许多其他的方法来返回store项,
,但是没有任何效果。
除了上面链接中的内容外,我还查看了配置文件的变化,我尝试添加
async
来存储/actions、getData()等。
我还试图在组件中直接调用axios,但没有成功。
由于这个项目已经在VueJS中或多或少地完成了,我正在转换为SSR,所以我删除了package.json的所有内容,并重新安装了每个包,希望可能是某个旧的vue包引起了冲突。
我还尝试了从官方文档中分离存储代码,并尝试了路由编写方式的变化。什么都不管用。
我想我应该添加运行当前代码时打印语句显示的内容:
computed = undefined
computed mm = undefined
getter = {}
computed get = {"getXY":{}}
{
title: 'Home'...}
组件中的计算属性在设置突变之前运行。这导致在更新突变之前调用getter。同样,如果我试图直接从组件调用对
res
的更改,则在调用和呈现存储时没有任何突变。
这是我试图运行的代码的一个副本:https://github.com/dt1/vue-ssr-attempt
(我找到了答案。我已经用对我有效的方法更新了回购协议,下面对我的解决方案进行了解释)
我的问题是为什么调用this.getData()挂载?
如果我正确理解了这个过程,当您调用服务器端渲染时,您正试图在安装vue组件之前渲染超文本标记语言。如果你调用this.getData()
创建而不是挂载,它会工作吗?
我会尝试的其他事情:
开箱即用的Vue.js没有SSR。在您的示例中,您可以获取客户端上的数据。
请尝试以下商店示例:
export default new Vuex.Store({
strict: true,
state: {
res: null
},
getters: {
getXY(state) {
return state.res;
}
},
mutations: {
mutXY(state, payload) {
state.res = payload;
}
},
actions: {
actXY: function(store) {
fetchPage("homepage")
.then(res => {
store.commit("mutXY", res);
})
.catch(error => {
throw new Error(`Store ${error}`);
});
}
}
});
您可以在组件中获取如下数据:
computed: {
htmlData() {
return this.$store.getters.getXY;
}
},
created() {
this.getData();
},
methods: {
getData() {
return this.$store.dispatch("actXY", "homepage");
}
}
首先storeData()
=
然后返回这个$百货商店状态项目。主页数据
=
info 如果您能了解下面这些技术,能加快您对本文的了解 vuex - Vue.js 应用程序开发的状态管理模式 Vue.js SSR - Vue.js 服务器端渲染 webpack - 编译构建工具 Lavas 服务器端渲染模板参考了 vue-hackernews 的渲染和开发机制,并且结合了 Lavas 的 App Shell 模板,导出的工程中会有 App Shell 等 如果您不了解 vu
React 提供了两个方法 renderToString 和 renderToStaticMarkup 用来将组件(Virtual DOM)输出成 HTML 字符串,这是 React 服务器端渲染的基础,它移除了服务器端对于浏览器环境的依赖,所以让服务器端渲染变成了一件有吸引力的事情。 服务器端渲染除了要解决对浏览器环境的依赖,还要解决两个问题: 前后端可以共享代码 前后端路由可以统一处理 Rea
如果你调研服务器端渲染(SSR)只是用来改善少数营销页面(例如/,/about,/contact等)的 SEO,那么你可能需要预渲染。无需使用 web 服务器实时动态编译 HTML,而是使用预渲染方式,在构建时(build time)简单地生成针对特定路由的静态 HTML 文件。优点是设置预渲染更简单,并可以将你的前端作为一个完全静态的站点。 如果你使用 webpack,你可以使用prerende
问题内容: 我刚刚开始研究ReactJS,发现它为您提供了两种渲染页面的方法:服务器端和客户端。但是,我不知道如何一起使用。是使用两种单独的方法来构建应用程序,还是可以将它们一起使用? 如果可以一起使用,该如何做- 我们是否需要在服务器端和客户端重复相同的元素?或者,我们是否可以仅在服务器上构建应用程序的静态部分,而在客户端构建动态部分,而无需与已经预先渲染的服务器端建立任何连接? 问题答案: 对
我刚刚开始研究ReactJS,发现它提供了两种呈现页面的方法:服务器端和客户端。但是,我不明白如何一起使用它。构建应用程序有两种不同的方法,还是可以一起使用? 如果我们可以一起使用它,如何做到这一点——我们需要在服务器端和客户端复制相同的元素吗?或者,我们可以只在服务器上构建应用程序的静态部分,在客户端构建动态部分,而不与已经预渲染的服务器端建立任何连接吗?
服务端渲染一个很常见的场景是当用户(或搜索引擎爬虫)第一次请求页面时,用它来做初始渲染。当服务器接收到请求后,它把需要的组件渲染成 HTML 字符串,然后把它返回给客户端(这里统指浏览器)。之后,客户端会接手渲染控制权。 下面我们使用 React 来做示例,对于支持服务端渲染的其它 view 框架,做法也是类似的。 服务端使用 Redux 当在服务器使用 Redux 渲染时,一定要在响应中包含应用
准备动作 1、安装nodejs与安装express 安装nodejs教程:http://www.cnblogs.com/pigtail/archive/2013/01/08/2850486.html 安装 express 教程:https://www.wenjiangs.com/doc/f5jxm7ii 2、安装node-jsx(使nodejs支持jsx语法) $ npm install node
实验性 SSR 支持还处于试验阶段,你可能会遇到 bug 和不受支持的用例。请考虑你可能承担的风险。 注意 SSR 特别指支持在 Node.js 中运行相同应用程序的前端框架(例如 React、Preact、Vue 和 Svelte),将其预渲染成 HTML,最后在客户端进行脱水化处理。如果你正在寻找与传统服务器端框架的集成,请查看 后端集成指南。 下面的指南还假定你在选择的框架中有使用 SSR