本篇专门针对 Next.js 的 SSR 方案进行了探索和优化,一步一步带大家了解,如何基于 Serverless 架构部署一个实际的线上业务 。
文章插图
本文主要内容:
- 如何快速部署 Serverless Next.js
- 如何自定义 API 网关域名
- 如何通过 COS 托管静态资源
- 静态资源配置 CDN
- 基于 Layer 部署 node_modules
我们先快速初始化一个 Serverless Next.js 项目:
$ serverless create -u https://github.com/serverless-components/tencent-nextjs/tree/master/example -p serverless-nextjs$ cd serverless-nextjs
该项目模板已经默认配置好 serverless.yml,可以直接执行部署命令:$ serverless deploy
大概 30s 左右就可以部署成功了,之后访问生成的 apigw.url 链接 https://service-xxx-xxx.gz.apigw.tencentcs.com/release/ 就可以看到首页了 。Next.js 组件,会默认帮助我们创建一个 云函数 和 API 网关,并且将它们关联,实际我们访问的 是 API 网关,然后触发云函数,来获得请求返回结果,流程图如下:
文章插图
解释:我们在执行部署命令时,由于一个简单的 Next.js 应用除了业务代码,还包括庞大的 node_modules 文件夹,这就导致打包压缩的代码体积大概 20M 左右,所以大部分时间消耗在代码上传上 。这里的速度也跟开发环境的网络环境有关,而实际上我们云端部署是很快的,这也是为什么需要 30s 左右的部署时间,而且网络差时会更久,当然后面也会提到如何提高部署速度 。相信你已经体会到,借助 Serverless Components 解决方案的便利,它确实可以帮助我们的应用高效的部署到云端 。而且这里使用的 Next.js 组件,针对代码上传也做了很多优化工作,来保证快速的部署效率 。
接下来将介绍如何基于 Next.js 组件,进一步优化我们的部署体验 。
如何自定义 API 网关域名使用过 API 网关的小伙伴,应该都知道它可以配置自定义域名,如下图所示:
文章插图
但是这个手动配置还是不够方便,为此 Next.js 组件也提供了 customDomains 来帮助开发者快速配置自定义域名,于是我们可以在项目的 serverless.yml 中新增如下配置:
org: orgDemoApp: appDemostage: devcomponent: nextjsname: nextjsDemoinputs:src:dist: ./hook: npm run buildexclude:- .envregion: ap-guangzhouruntime: Nodejs10.15apigatewayConf:protocols:- httpsenvironment: releaseenableCORS: true# 自定义域名相关配置customDomains:- domain: test.yuga.chatcertificateId: abcdefg # 证书 ID# 这里将 API 网关的 release 环境映射到根路径pathMappingSet:- path: /environment: releaseprotocols:- https
由于这里使用的是 https 协议,所以需要配置托管在腾讯云服务的证书 ID,可以到 SSL 证书控制台 查看 。腾讯云已经提供了申请免费证书的功能,当然你也可以上传自己的证书进行托管 。之后我们再次执行部署命令,会得到如下输出结果:
文章插图
这里由于自定义域名时通过 CNAME 映射到 API 网关服务,所以还需要手动添加输出结果中红框部分的 CNAME 解析记录 。等待自定义域名解析成功,就可以正常访问了 。
如何通过 COS 托管静态资源Next.js 应用,有两种静态资源:
- 项目中通过资源引入的方式使用,这种会经过 Webpack 打包处理输出到 .next/static 目录,比如 .next/static/css 样式文件目录 。
- 直接放到项目根目录的 public 文件夹,通过静态文件服务返回,然后项目中可以直接通过 url 的方式引入(官方介绍) 。
// next.config.jsconst isProd = process.env.NODE_ENV === "production";const STATIC_URL ="https://serverless-nextjs-xxx.cos.ap-guangzhou.myqcloud.com";module.exports = {assetPrefix: isProd ? STATIC_URL : "",};
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 一款 App 基于 mPaaS 小程序如何进行改造?
- 企业数据泄漏事件频发,如何保障安全?
- 世界上最多的动物牙齿最多的动物是什么 世界上最多牙齿的动物是
- 时空位面的旅行者 时空旅行者真的存在吗
- 在Apache Spark中执行聚合的五种方法
- 暗网最恐怖的真实事件 暗网恐怖事件贴吧
- 受伤的白狐 被救下的白狐变成女人回来报恩
- 从病毒到“基础软件污染”,Linux 真的安全吗?
- 基于 Serverless Framework 的人工智能小程序开发
- 罗布泊探险失踪的人 罗布泊失踪的人