前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【serverless实战】腾讯云·云开发+nextjs(SSR or 静态导出)实现官网动态化

【serverless实战】腾讯云·云开发+nextjs(SSR or 静态导出)实现官网动态化

作者头像
心谭博客
发布于 2020-05-06 15:36:16
发布于 2020-05-06 15:36:16
4.3K00
代码可运行
举报
文章被收录于专栏:YuanXinYuanXin
运行总次数:0
代码可运行

背景

www.cloudbase.net 云开发网站是基于 nextjs 开发,里面的内容是写在 js 配置文件。每当更新网站内容,都需要提交 git,并且本地进行静态导出,再借助腾讯云云开发的 cli 工具,部署到云开发控制台的「静态网站」服务。

但是内容的更新,不应该涉及到 git 记录(只包括代码或者配置的改动),而且每次改动都要手动 pull/push/deploy 一遍,属实麻烦。因此,需要进行动态化。

系统设计

动态化获取数据

利用 nextjs 提供的 getInitialProps 钩子,从 cms 系统对应的云数据库中拉取动态内容。并将最新的内容,结合模板代码导出为静态 html 文件。

在 getInitialProps 钩子中,环境既不是 browser,也不是 nodejs,而是 ssr 的环境。所以无法使用 tcb-js-sdk 以及 tcb-admin-node 这两个库来获取云开发的数据。

这里使用了 axios.js 来进行网络请求,理由如下:

  • 完美支持 ssr、node、browser 环境:直接用于 getInitialProps 钩子
  • 支持一级代理转发:可以在内网环境下获取外部数据

http 触发调用云函数

由于无法使用 tcb-js-sdk 和 tcb-admin-node,所以没办法通过 sdk 提供的 api 来读取云数据库的数据。

所以只能“曲线救国”,借助云函数 + http 触发功能来获取云数据库的数据:

  • 在 cloudbase 控制台编写用于读取数据库的云函数
  • 开启云函数的 http 触发:调用者可以通过 http url 的方式调用云函数,传入参数,获取云函数运行结果
  • 在 getInitialProps 钩子中,使用 axios 调用远程云函数,获取最新数据

部分代码实现

在需要动态化内容的页面组件中,添加 getInitialProps 钩子,里面通过 axios 触发云函数,获取云函数数据,并将其挂入组件的 props 中。

组件内部根据 props 的内容,生成对应的 jsx 结构。

代码实现如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const MainPage = ({activities, courses, articles}) => {
    // ...
    return ()
}

Main.getInitialProps = async () => {
    const promises = [
        getActivities(),
        getCourses(),
        getArticles()
    ]

    const [
        activities,
        courses,
        articles
    ] = await Promise.all(promises)

    return {
        activities,
        courses,
        articles
    }
}

Q:为什么不选择 SSR,而是使用静态导出?静态导出怎么保证实效性?

理论上来说,SSR 是 SEO+获取最新数据的理论最优方案。但是考虑到云函数搭配 ssr 存在冷热启动问题,而静态导出后的文件直接部署到云开发静态网站服务上,本质上是对象存储,访问速度更快,并且节省费用。

除此之外,借助 CI 工具,设置了定时构建,以获取最新数据进行更新。如果有紧急情况,开发人员也可以在平台手动触发 CI,获取实时最新数据。

一句话,最合适的方案不一定是最优的

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊聊nacos-sdk-go的NamingProxy
nacos-sdk-go-v0.3.2/clients/naming_client/naming_proxy.go
code4it
2020/06/27
3290
聊聊nacos-sdk-go的NamingProxy
聊聊nacos-sdk-go的ConfigProxy
nacos-sdk-go-v0.3.2/clients/config_client/config_proxy.go
code4it
2020/06/30
7930
聊聊nacos-sdk-go的ConfigProxy
聊聊nacos client的MetricsMonitor
nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/monitor/MetricsMonitor.java
code4it
2019/09/03
6710
聊聊nacos client的MetricsMonitor
聊聊nacos-sdk-go的PushReceiver
nacos-sdk-go-v0.3.2/clients/naming_client/push_receiver.go
code4it
2020/06/29
4600
聊聊nacos-sdk-go的PushReceiver
聊聊nacos-sdk-go的HostReactor
nacos-sdk-go-v0.3.2/clients/naming_client/host_reator.go
code4it
2020/06/25
5810
聊聊nacos-sdk-go的HostReactor
聊聊nacos NamingProxy的getServiceList
nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/naming/net/NamingProxy.java
code4it
2019/10/05
9250
聊聊nacos NamingProxy的getServiceList
聊聊nacos-sdk-go的NamingClient
nacos-sdk-go-v0.3.2/clients/naming_client/naming_client.go
code4it
2020/06/24
7090
聊聊nacos-sdk-go的NamingClient
聊聊nacos-sdk-go的BeatReactor
nacos-sdk-go-v0.3.2/clients/naming_client/beat_reactor.go
code4it
2020/06/26
5080
聊聊nacos-sdk-go的BeatReactor
聊聊dubbo-go的nacosRegistry
dubbo-go-v1.4.2/registry/nacos/registry.go
code4it
2020/07/29
4180
聊聊dubbo-go的nacosRegistry
聊聊NacosNamingService的selectInstances
本文主要研究一下NacosNamingService的selectInstances
code4it
2019/10/09
6170
聊聊NacosNamingService的getServicesOfServer
本文主要研究一下NacosNamingService的getServicesOfServer
code4it
2019/10/10
5580
聊聊NacosNamingService的getServicesOfServer
golang 源码分析:nacos服务发现
https://github.com/alibaba/nacos 是阿里开源的服务发现和配置同步组件,上手非常容易,我们介绍下如何部署,然后看下nacos提供的golang sdk:https://github.com/nacos-group/nacos-sdk-go如何使用,分析下具体的源码实现。
golangLeetcode
2022/12/17
8340
golang 源码分析:nacos服务发现
【Nacos源码分析】- 02 获取配置流程
ConfigService是提供给开发者使用的,用来对配置文件进行相关操作的核心接口,比如获取/监听/发布/删除配置项等,这一节我们来分析下获取配置内容的流程,对应的是ConfigService#getConfig()方法。
Reactor2020
2023/03/22
6970
【Nacos源码分析】- 02 获取配置流程
聊聊nacos的RaftProxy
nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/consistency/persistent/raft/RaftProxy.java
code4it
2019/10/04
5250
聊聊nacos的RaftProxy
扩展Ribbon支持Nacos权重的三种方式
•把性能差的机器权重设低,性能好的机器权重设高,让请求优先打到性能高的机器上去;•某个实例出现异常时,把权重设低,排查问题,问题排查完再把权重恢复;•想要下线某个实例时,可先将该实例的权重设为0,这样流量就不会打到该实例上了——此时再去关停该实例,这样就能实现优雅下线啦。当然这是为Nacos量身定制的优雅下线方案——Spring Cloud中,要想实现优雅下线还有很多姿势,详见:《实用技巧:Spring Cloud中,如何优雅下线微服务?》[1] ,里面笔者总结了四种优雅下线的方式。
用户1516716
2019/07/10
4.5K0
Nacos服务发现原理分析
ribbon依赖包含spring-cloud-commons依赖,而在spring-cloud-commons包中spring.factories自动配置LoadBalancerAutoConfiguration类:
用户10384376
2023/02/26
1.2K0
Nacos服务发现原理分析
聊聊nacos client的ServerListManager的start
本文主要研究一下nacos client的ServerListManager的start
code4it
2019/10/15
1K0
聊聊nacos client的ServerListManager的start
聊聊NacosRibbonClientConfiguration
spring-cloud-alibaba-0.9.0.RELEASE/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/ribbon/NacosRibbonClientConfiguration.java
code4it
2019/07/30
1.6K0
聊聊NacosRibbonClientConfiguration
nacos-client实例注册源码分析
spring-cloud-starter-alibaba-nacos-discoveryjar包下找到MATE-INF/spring.factories 文件;可以看到 自动装配类NacosServiceRegistryAutoConfiguration
BUG弄潮儿
2022/12/05
5040
聊聊NacosNamingService的registerInstance
本文主要研究一下NacosNamingService的registerInstance
code4it
2019/10/06
9070
聊聊NacosNamingService的registerInstance
相关推荐
聊聊nacos-sdk-go的NamingProxy
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验