{"componentChunkName":"component---src-templates-blog-detail-tsx","path":"/blog/2020-04-13-serverless-next.js-ssr","result":{"data":{"currentBlog":{"id":"e218778b-22f8-5931-8475-c0ad8a0165ed","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020523/1590205117399-16201.jpg","authors":["XaDon"],"categories":["user-stories"],"date":"2020-04-13T00:00:00.000Z","title":"在云函数 SCF 里为 Next.js 跑 SSR","description":"很多时候我们都希望首屏速度快，SEO 友好，那么相比于客户端渲染，SSR 渲染将是这方面的优势。","authorslink":["https://cloud.tencent.com/developer/article/1612986"],"translators":null,"translatorslink":null,"tags":["云函数","Serverless SSR"],"keywords":"Serverless,Serverless SSR,Serverless应用","outdated":null},"wordCount":{"words":130,"sentences":49,"paragraphs":49},"fileAbsolutePath":"/opt/build/repo/content/blog/2020-04-13-serverless-next.js-ssr.md","fields":{"slug":"/blog/2020-04-13-serverless-next.js-ssr/","keywords":["java","next.js","node.js","nodejs","serverless","客户端渲染","云函数","serverless","serverlesscloud","初始化","根目录"]},"html":"<p>很多时候我们都希望首屏速度快，SEO 友好，那么相比于客户端渲染，SSR 渲染将是这方面的优势。Next.js、Nuxt.js 都是 SSR 框架。本篇文章将介绍 Next.js。</p>\n<p>通常我们在部署 SSR 的时候，会担心运维等问题，但如果我们把它部署在云开发上就可以不必担心~</p>\n<p>试试看看喽~</p>\n<h2 id=\"环境准备\"><a href=\"#%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87\" aria-label=\"环境准备 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>环境准备</h2>\n<ol>\n<li>安装<a href=\"http://nodejs.cn/download/\">node.js</a></li>\n<li>安装云开发工具 @cloudbase/cli</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">npm i @cloudbase/cli</code></pre></div>\n<h2 id=\"搭建云环境\"><a href=\"#%E6%90%AD%E5%BB%BA%E4%BA%91%E7%8E%AF%E5%A2%83\" aria-label=\"搭建云环境 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>搭建云环境</h2>\n<ol>\n<li>首先在打开<a href=\"https://console.cloud.tencent.com/tcb/env/index\">云开发</a>并新建环境</li>\n<li>创建完成后会自动进入环境初始化阶段，这个阶段大概持续 2~3 分钟。</li>\n</ol>\n<h2 id=\"初始化项目\"><a href=\"#%E5%88%9D%E5%A7%8B%E5%8C%96%E9%A1%B9%E7%9B%AE\" aria-label=\"初始化项目 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>初始化项目</h2>\n<p>当环境初始化完成后我们就可以进行初始化项目啦~</p>\n<ol>\n<li>使用 CLI 工具初始化一个云开发项目 <code class=\"language-text\">$ tcb init</code></li>\n</ol>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"31025564257710346000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`tcb init\n? 选择关联环境 xxx - [xxx-xxx]\n? 请输入项目名称 nextSSR\n? 选择模板语言 Node\n? 选择云开发模板 Hello World\n✔ 创建项目 cloudbase-next 成功！`, `31025564257710346000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">tcb init\n<span class=\"token operator\">?</span> 选择关联环境 xxx <span class=\"token operator\">-</span> <span class=\"token punctuation\">[</span>xxx<span class=\"token operator\">-</span>xxx<span class=\"token punctuation\">]</span>\n<span class=\"token operator\">?</span> 请输入项目名称 nextSSR\n<span class=\"token operator\">?</span> 选择模板语言 Node\n<span class=\"token operator\">?</span> 选择云开发模板 Hello World\n✔ 创建项目 cloudbase<span class=\"token operator\">-</span>next 成功！</code></pre></div>\n<p>初始化结束后的项目目录如下：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"14307534621100392000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`nextSSR\n└─.\n    │  .editorconfig\n    │  .gitignorev1\n    │  a.txt\n    │  cloudbaserc.js\n    │  README.md\n    │\n    └─functions\n        └─app\n                index.js`, `14307534621100392000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">nextSSR\n└─<span class=\"token punctuation\">.</span>\n    │  <span class=\"token punctuation\">.</span>editorconfig\n    │  <span class=\"token punctuation\">.</span>gitignorev1\n    │  a<span class=\"token punctuation\">.</span>txt\n    │  cloudbaserc<span class=\"token punctuation\">.</span>js\n    │  <span class=\"token constant\">README</span><span class=\"token punctuation\">.</span>md\n    │\n    └─functions\n        └─app\n                index<span class=\"token punctuation\">.</span>js</code></pre></div>\n<p>然后我们进入到项目中</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ cd nextSSR</code></pre></div>\n<p>在 functions 文件夹下创建 next.js 应用：<code class=\"language-text\">$ npm init next-app functions/next</code></p>\n<p>等待初始化 next.js 项目...</p>\n<p>初始化完成后在 functions 文件夹下会多出一个 next 的文件夹，这个便是我们的 next 应用</p>\n<h2 id=\"配置-next\"><a href=\"#%E9%85%8D%E7%BD%AE-next\" aria-label=\"配置 next permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>配置 next</h2>\n<ol>\n<li>首先我们进入到 next 项目的根目录 <code class=\"language-text\">$ cd functions/next</code></li>\n<li>然后安装 severless-http <code class=\"language-text\">$ npm install --save serverless-http</code></li>\n<li>在 next 应用的根目录下 <code class=\"language-text\">项目根目录/functions/next应用根目录</code> 新建 <code class=\"language-text\">index.js</code>，并将下列代码添加进去</li>\n</ol>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"69277832950133236000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`    // index.js\n    const next = require('next')\n    const serverless = require('serverless-http')\n\n    const app = next({ dev: false })\n    const handle = app.getRequestHandler()\n\n    exports.main = async function(...args) {\n        await app.prepare()\n        return serverless((req, res) => {\n            handle(req, res)\n        })(...args)\n    }// next.config.js\n    module.exports = {\n        assetPrefix: '/next'\n    }`, `69277832950133236000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">    <span class=\"token comment\">// index.js</span>\n    <span class=\"token keyword\">const</span> next <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'next'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">const</span> serverless <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'serverless-http'</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">const</span> app <span class=\"token operator\">=</span> <span class=\"token function\">next</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> dev<span class=\"token punctuation\">:</span> <span class=\"token boolean\">false</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">const</span> handle <span class=\"token operator\">=</span> app<span class=\"token punctuation\">.</span><span class=\"token function\">getRequestHandler</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n    exports<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">main</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token operator\">...</span>args</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">await</span> app<span class=\"token punctuation\">.</span><span class=\"token function\">prepare</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> <span class=\"token function\">serverless</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> res</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">handle</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">,</span> res<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token operator\">...</span>args<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token comment\">// next.config.js</span>\n    module<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n        assetPrefix<span class=\"token punctuation\">:</span> <span class=\"token string\">'/next'</span>\n    <span class=\"token punctuation\">}</span></code></pre></div>\n<p>在 next 应用的根目录 (/function/next/<strong>next.config.js</strong>) 中新建 <code class=\"language-text\">next.config.js</code> 并将下列代码拷入</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"71111605576403240000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`// next.config.js\nmodule.exports = {\n    assetPrefix: '/next'\n}`, `71111605576403240000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// next.config.js</span>\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    assetPrefix<span class=\"token punctuation\">:</span> <span class=\"token string\">'/next'</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>这样我们的项目就配置差不多了。</p>\n<h2 id=\"项目的构建与发布\"><a href=\"#%E9%A1%B9%E7%9B%AE%E7%9A%84%E6%9E%84%E5%BB%BA%E4%B8%8E%E5%8F%91%E5%B8%83\" aria-label=\"项目的构建与发布 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>项目的构建与发布</h2>\n<ul>\n<li>首先我们进入到 <code class=\"language-text\">functions/next</code> 目录中</li>\n</ul>\n<p>执行 <code class=\"language-text\">$ npm run build</code></p>\n<ul>\n<li>然后回到项目根目录中，运行 cli 命令将代码上传到云函数</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ tcb functions:deploy next</code></pre></div>\n<ul>\n<li>然后我们创建一个 http 服务</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ cloudbase service:create -f next -p /next</code></pre></div>\n<blockquote>\n<p>-f 表示 HTTP Service 路径绑定的云函数名称 \\ -p 表示 Service Path，必须以 <code class=\"language-text\">/</code> 开头</p>\n</blockquote>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"74695155098469840000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`\\$ cloudbase service:create -f next -p /next\n✔ 云函数 HTTP service 创建成功！`, `74695155098469840000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">$ cloudbase service<span class=\"token punctuation\">:</span>create <span class=\"token operator\">-</span>f next <span class=\"token operator\">-</span>p <span class=\"token operator\">/</span>next\n✔ 云函数 <span class=\"token constant\">HTTP</span> service 创建成功！</code></pre></div>\n<h2 id=\"我们上传到了哪里了呢？\"><a href=\"#%E6%88%91%E4%BB%AC%E4%B8%8A%E4%BC%A0%E5%88%B0%E4%BA%86%E5%93%AA%E9%87%8C%E4%BA%86%E5%91%A2%EF%BC%9F\" aria-label=\"我们上传到了哪里了呢？ permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>我们上传到了哪里了呢？</h2>\n<p>我们进入到<a href=\"https://console.cloud.tencent.com/tcb/scf/index\">云开发管理</a>页面</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590205118371-16201.jpg\" alt=\"serverless\"></p>\n<p>我们看到在云函数的函数代码中可以找到我们刚才上传的文件</p>\n<p>我们点击预览即可浏览页面啦~</p>\n<p>在函数配置可以通过触发云函数来进行浏览我们的页面</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590205117137-16201.jpg\" alt=\"serverless\"></p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590205117399-16201.jpg\" alt=\"serverless\"></p>\n<h2 id=\"对比\"><a href=\"#%E5%AF%B9%E6%AF%94\" aria-label=\"对比 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>对比</h2>\n<p>我们通过对比查看</p>\n<ul>\n<li>通过 SSR 渲染的页面加载速度</li>\n</ul>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590205117618-16201.jpg\" alt=\"serverless\"></p>\n<ul>\n<li>非 SSR 的加载速度</li>\n</ul>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590205118406-16201.jpg\" alt=\"serverless\"></p>\n<p>可以看到有明显的速度提升啦~</p>\n<hr>\n<div id='scf-deploy-iframe-or-md'></div>\n<hr>\n<blockquote>\n<p><strong>传送门：</strong></p>\n<ul>\n<li>GitHub: <a href=\"https://github.com/serverless/serverless/blob/master/README_CN.md\">github.com/serverless</a></li>\n<li>官网：<a href=\"https://serverless.com/\">serverless.com</a></li>\n</ul>\n</blockquote>\n<p>欢迎访问：<a href=\"https://serverlesscloud.cn/\">Serverless 中文网</a>，您可以在 <a href=\"https://serverlesscloud.cn/best-practice\">最佳实践</a> 里体验更多关于 Serverless 应用的开发！</p>","tableOfContents":"<ul>\n<li><a href=\"/blog/2020-04-13-serverless-next.js-ssr/#%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87\">环境准备</a></li>\n<li><a href=\"/blog/2020-04-13-serverless-next.js-ssr/#%E6%90%AD%E5%BB%BA%E4%BA%91%E7%8E%AF%E5%A2%83\">搭建云环境</a></li>\n<li><a href=\"/blog/2020-04-13-serverless-next.js-ssr/#%E5%88%9D%E5%A7%8B%E5%8C%96%E9%A1%B9%E7%9B%AE\">初始化项目</a></li>\n<li><a href=\"/blog/2020-04-13-serverless-next.js-ssr/#%E9%85%8D%E7%BD%AE-next\">配置 next</a></li>\n<li><a href=\"/blog/2020-04-13-serverless-next.js-ssr/#%E9%A1%B9%E7%9B%AE%E7%9A%84%E6%9E%84%E5%BB%BA%E4%B8%8E%E5%8F%91%E5%B8%83\">项目的构建与发布</a></li>\n<li><a href=\"/blog/2020-04-13-serverless-next.js-ssr/#%E6%88%91%E4%BB%AC%E4%B8%8A%E4%BC%A0%E5%88%B0%E4%BA%86%E5%93%AA%E9%87%8C%E4%BA%86%E5%91%A2%EF%BC%9F\">我们上传到了哪里了呢？</a></li>\n<li><a href=\"/blog/2020-04-13-serverless-next.js-ssr/#%E5%AF%B9%E6%AF%94\">对比</a></li>\n</ul>"},"previousBlog":{"id":"04432dc5-1456-5b39-8a05-7b5ae3492394","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020327/1585306882223-9.jpg","authors":["serverless 社区"],"categories":["meetup"],"date":"2020-04-15T00:00:00.000Z","title":"Serverless 中文社区有奖征稿","description":"欢迎将您的技术实践、开发经验分享更多人借鉴学习！","authorslink":["https://serverlesscloud.cn"],"translators":null,"translatorslink":null,"tags":["Serverless","Meetup"],"keywords":"Serverless 全局变量组件,Serverless 征稿,Serverless Component","outdated":null},"wordCount":{"words":184,"sentences":26,"paragraphs":26},"fileAbsolutePath":"/opt/build/repo/content/blog/2020-04-15-article-meetup.md","fields":{"slug":"/blog/2020-04-15-article-meetup/","keywords":["serverless","云函数","Serverless","社区","serverless","开发","Framework","学习","礼品","整理"]}},"nextBlog":{"id":"43f1b4b3-585f-5695-88a1-7611872268e3","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020415/1586926925568-Log.jpg","authors":["Anycodes"],"categories":["guides-and-tutorials"],"date":"2020-04-13T00:00:00.000Z","title":"实时日志：腾讯云 Serverless Python 运行时支持日志实时输出","description":"当我们在调试时，只要触发器被触发，就能实时看到日志，那对写代码肯定大有裨益，这个组件就完成了这么一件事儿！","authorslink":["https://www.zhihu.com/people/liuyu-43-97"],"translators":null,"translatorslink":null,"tags":["Serverless","Python"],"keywords":"Serverless 全局变量组件,Serverless 单独部署组件,Serverless Component","outdated":true},"wordCount":{"words":132,"sentences":40,"paragraphs":40},"fileAbsolutePath":"/opt/build/repo/content/blog/2020-04-13-time-log.md","fields":{"slug":"/blog/2020-04-13-time-log/","keywords":["go","python","serverless","spa","云函数","serverless","日志","time","service","scflog","实时"]}},"recommendBlogs":{"edges":[{"node":{"id":"4300b21c-7209-5256-86ff-0d38e3daec9b","frontmatter":{"thumbnail":"https://main.qcloudimg.com/raw/14f1c8eed372e76c1b139703b2f6d0fa.jpg","authors":["KieranMcCarthy"],"categories":["user-stories","engineering-culture"],"date":"2018-01-09T00:00:00.000Z","title":"我是如何在四年时间里，从厨师转行为 Serverless 应用开发者","description":"我是厨师出身，现在成为了一名 Serverless 应用开发者。","authorslink":["https://serverless.com/author/kieranmccarthy/"],"translators":["Aceyclee"],"translatorslink":["https://www.zhihu.com/people/Aceyclee"],"tags":["应用开发","Serverless"],"keywords":"Serverless 应用开发,Serverless 管理,厨师转行为 Serverless 应用开发者","outdated":null},"wordCount":{"words":285,"sentences":38,"paragraphs":36},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-01-09-from-chef-to-serverless-developer-in-4-years.md","fields":{"slug":"/blog/2018-01-09-from-chef-to-serverless-developer-in-4-years/","keywords":["无服务器","无服务器开发","云函数","学习","Serverless","构建","Framework","开发者","服务器","应用","学位","简历"]}}},{"node":{"id":"713a0563-4bf9-5721-bacb-3b4ef609fe4a","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/camp-fire/camp-fire-housing-thumb.jpg","authors":["EricWyne"],"categories":["guides-and-tutorials","user-stories"],"date":"2018-12-05T00:00:00.000Z","title":"Serverless Twitter 机器人帮助为坎普山火受灾者安置住房","description":"加利福尼亚州的坎普山火致使数千人流离失所，为此，我构建了一个简单的 Serverless Twitter 机器人来帮助将受灾者安置在临时住房！","authorslink":["https://serverless.com/author/ericwyne/"],"translators":["Aceyclee"],"translatorslink":["zhihu.com/people/Aceyclee"],"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":157,"sentences":26,"paragraphs":26},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-12-05-serverless-twitter-camp-fire.md","fields":{"slug":"/blog/2018-12-05-serverless-twitter-camp-fire/","keywords":["serverless","无服务器","云函数","Serverless","org","住房","Twitter","函数","受灾","机器人","山火"]}}},{"node":{"id":"98602143-b837-5f50-a24f-3b1ec76044d7","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/sqquid/sqquid-serverless-thumb.jpg","authors":["RonPeled"],"categories":["user-stories"],"date":"2018-12-17T00:00:00.000Z","title":"SQQUID：100% 无服务器初创公司","description":"SQQUID 将 AWS Lambda 和无服务器框架用于其核心产品和营销网站。我们来看看一个完全无服务器的初创公司是怎样的。","authorslink":null,"translators":null,"translatorslink":null,"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":266,"sentences":42,"paragraphs":42},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-12-17-sqquid-one-hundred-percent-serverless.md","fields":{"slug":"/blog/2018-12-17-sqquid-one-hundred-percent-serverless/","keywords":["go","serverless","无服务器","无服务器架构","服务器","架构","Lambda","集成","FaaS","串行","系统"]}}},{"node":{"id":"29dc2e58-d2ba-56f9-aee1-d21b0bc62e0e","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/ao-com-story/ao-serverless-thumbnail.png","authors":["NickGottlieb"],"categories":["user-stories"],"date":"2019-04-24T00:00:00.000Z","title":"AO.com：逐渐转向无服务器优先","description":"AO.com 的 SCV 团队率先尝试无服务器服务。折服于无服务器框架的快速周转时间和低维护成本，整个团队逐渐转向无服务器优先。","authorslink":null,"translators":null,"translatorslink":null,"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":236,"sentences":42,"paragraphs":35},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-04-24-ao-serverless-first.md","fields":{"slug":"/blog/2019-04-24-ao-serverless-first/","keywords":["serverless","无服务器","服务器","团队","Lambda","功能","构建"]}}},{"node":{"id":"752d08d1-387a-5bde-acf3-98141baab294","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020414/1586871710979-%E5%85%AC%E5%85%B1%E7%94%A8.png","authors":["Anycodes"],"categories":["user-stories"],"date":"2019-06-20T00:00:00.000Z","title":"如何用 Serverless 为 Python 云函数打包依赖","description":"在使用无服务器云函数SCF时通常会遇到导入第三方库的问题，很多小伙伴比较头疼是：应该如何打包进去？这里，推荐几个不错的方法。","authorslink":["https://zhuanlan.zhihu.com/ServerlessGo"],"translators":null,"translatorslink":null,"tags":["云函数","Serverless"],"keywords":"Serverless,Serverless应用,无服务器云函数","outdated":null},"wordCount":{"words":81,"sentences":43,"paragraphs":43},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-06-20-for-python-cloud-functions.md","fields":{"slug":"/blog/2019-06-20-for-python-cloud-functions/","keywords":["java","serverless","无服务器","无服务器云函数","云函数","serverlesscloud","安装","serverless","pillowtest"]}}},{"node":{"id":"2dc78814-9d77-555b-a1bb-ad202c8ec2d1","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/cloudforecast/thumbnail.png","authors":["FrancoisLagier"],"categories":["user-stories"],"date":"2019-08-07T00:00:00.000Z","title":"Serverless：初创企业的理想选择？（CloudForecast 案例分析）","description":"CloudForecast 是 2018 年成立的一家独立初创企业，本文将介绍他们决定选择 Serverless 的原因。","authorslink":["https://serverless.com/author/francoislagier/"],"translators":["Aceyclee"],"translatorslink":["zhihu.com/people/Aceyclee"],"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":211,"sentences":29,"paragraphs":29},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-08-07-serverless-for-startups.md","fields":{"slug":"/blog/2019-08-07-serverless-for-startups/","keywords":["serverless","云函数","serverless","函数","Serverless","utm","Framework","blog","CloudForecast","cloudforecast"]}}},{"node":{"id":"97450b07-658b-5207-8216-1c7b9b51b115","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020114/1578988490344-v2-8b2cd2c5275aa2c5a3c5083a148a7a9f_1200x500.jpg","authors":["Anycodes"],"categories":["user-stories"],"date":"2019-09-01T00:00:00.000Z","title":"如何通过 Serverless 与自然语言处理，让搜索引擎「看」到你的博客","description":"Serverless 与自然语言处理结合的一个小应用","authorslink":["https://www.zhihu.com/people/liuyu-43-97"],"translators":null,"translatorslink":null,"tags":["个人博客","serverless"],"keywords":"Serverless 自然语言处理","outdated":null},"wordCount":{"words":106,"sentences":34,"paragraphs":34},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-09-01-search-engine-blog.md","fields":{"slug":"/blog/2019-09-01-search-engine-blog/","keywords":["serverless","云函数","keywords","serverlesscloud","summary"]}}},{"node":{"id":"ae4fd2f8-515c-5aec-b584-38427ef33f7e","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020114/1578989800047-part-00492-780.jpg","authors":["Anycodes"],"categories":["guides-and-tutorials","user-stories"],"date":"2019-09-16T00:00:00.000Z","title":"突破传统 OJ 瓶颈，「判题姬」接入云函数","description":"通过 Serverless 实现在线编程","authorslink":["https://www.zhihu.com/people/liuyu-43-97"],"translators":null,"translatorslink":null,"tags":["在线编程","云函数"],"keywords":"Serverless 在线编程,Serverless OJ","outdated":null},"wordCount":{"words":169,"sentences":30,"paragraphs":30},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-09-16-online-Judge.md","fields":{"slug":"/blog/2019-09-16-online-Judge/","keywords":["python","serverless","云函数","代码","函数","serverless"]}}}],"totalCount":64}},"pageContext":{"isCreatedByStatefulCreatePages":false,"blogId":"e218778b-22f8-5931-8475-c0ad8a0165ed","previousBlogId":"04432dc5-1456-5b39-8a05-7b5ae3492394","nextBlogId":"43f1b4b3-585f-5695-88a1-7611872268e3","categories":["user-stories"]}}}