{"componentChunkName":"component---src-templates-best-practice-detail-tsx","path":"/best-practice/2020-02-04-vuepress-serverless","result":{"data":{"currentBlog":{"id":"d28c5060-2591-5220-b940-e0f73d022e76","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020219/1582115734254-VuePress_2_%E9%95%BF%E5%89%AF%E6%9C%AC.png","authors":["Aceyclee"],"categories":["best-practice"],"date":"2020-02-04T00:00:00.000Z","title":"基于 Serverless 的 VuePress 极简静态网站","description":"通过 Serverless Website 组件快速构建一个 VuePress 极简静态网站","authorslink":["https://www.zhihu.com/people/Aceyclee"],"translators":null,"translatorslink":null,"tags":["Serverless","VuePress"],"keywords":"VuePress,静态网站管理系统,VuePress 极简静态网站","outdated":true},"wordCount":{"words":150,"sentences":32,"paragraphs":31},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2020-02-04-vuepress-serverless.md","fields":{"slug":"/best-practice/2020-02-04-vuepress-serverless/","keywords":["nodejs","serverless","vue","vuejs","website","单页应用","无服务器","serverless","vuepress","Serverless","yml","VuePress","部署"]},"html":"<p>之前用过 <a href=\"https://serverlesscloud.cn/best-practice/2019-12-14-docsify-with-serverless/\">Docsify + Serverless Framework 快速创建个人博客系统</a>，虽然 docsify 也是基于 Vue，然而它是完全的运行时驱动，因此对 SEO 不够友好。所以这次尝试使用 VuePress 来搭建一个静态网站，依然部署在 Serverless 架构上。</p>\n<p><strong>简单介绍一下：</strong></p>\n<ul>\n<li><a href=\"https://www.vuepress.cn\">VuePress</a>：由两部分组成，第一部分是一个<a href=\"https://github.com/vuejs/vuepress/tree/master/packages/%40vuepress/core\">极简静态网站生成器</a>；另一个部分是为书写技术文档而优化的<a href=\"https://www.vuepress.cn/theme/default-theme-config.html\">默认主题</a>。每一个由 VuePress 生成的页面都带有预渲染好的 HTML，也因此具有非常好的加载性能和搜索引擎优化（SEO）。同时，一旦页面被加载，Vue 将接管这些静态内容，并将其转换成一个完整的单页应用（SPA），其他页面则会只在用户浏览到的时候才按需加载。</li>\n<li><a href=\"https://github.com/serverless/serverless/blob/master/README_CN.md\">Serverless Framework</a>：在 GitHub 上有三万颗星，业界非常受欢迎的无服务器应用框架，开发者无需关心底层资源即可部署完整可用的 Serverless 应用架构。</li>\n</ul>\n<p>接下来我们分三步进行：<strong>创建项目 → 配置 yml 文件 → 部署</strong></p>\n<h2 id=\"▎工具准备\"><a href=\"#%E2%96%8E%E5%B7%A5%E5%85%B7%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<p>首先确保系统包含以下环境：</p>\n<ul>\n<li><a href=\"https://nodejs.org/en/\">Node.js</a> (Node.js 版本需不低于 8.6，建议使用 10.0 及以上版本)</li>\n<li><a href=\"https://git-scm.com/\">Git</a></li>\n</ul>\n<p><strong>1. 安装 Serverless Framework</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ npm install -g serverless</code></pre></div>\n<p><strong>2. 安装 VuePress</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ npm install -g vuepress</code></pre></div>\n<h2 id=\"▎创建项目\"><a href=\"#%E2%96%8E%E5%88%9B%E5%BB%BA%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<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"37473861663049890000\"\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(`# 创建项目目录\nmkdir vuepress-starter && cd vuepress-starter\n\n# 新建一个 markdown 文件\necho '# Hello VuePress!' > README.md\n\n# 开始写作\nvuepress dev .\n\n# 构建静态文件\nvuepress build .`, `37473861663049890000`)\"\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=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># 创建项目目录</span>\n<span class=\"token function\">mkdir</span> vuepress-starter <span class=\"token operator\">&amp;&amp;</span> <span class=\"token builtin class-name\">cd</span> vuepress-starter\n\n<span class=\"token comment\"># 新建一个 markdown 文件</span>\n<span class=\"token builtin class-name\">echo</span> <span class=\"token string\">'# Hello VuePress!'</span> <span class=\"token operator\">></span> README.md\n\n<span class=\"token comment\"># 开始写作</span>\nvuepress dev <span class=\"token builtin class-name\">.</span>\n\n<span class=\"token comment\"># 构建静态文件</span>\nvuepress build <span class=\"token builtin class-name\">.</span></code></pre></div>\n<p>这时候可以看到 ./vuepress-starter 目录下创建的 <code class=\"language-text\">README.md</code> 文档，它会做为主页内容渲染，直接编辑 <code class=\"language-text\">docsify/README.md</code> 就能更新网站内容。此时通过浏览器访问 <a href=\"http://localhost:8080/\">http://localhost:8080/</a> 即可本地预览。</p>\n<h2 id=\"▎配置-yml-文件\"><a href=\"#%E2%96%8E%E9%85%8D%E7%BD%AE-yml-%E6%96%87%E4%BB%B6\" aria-label=\"▎配置 yml 文件 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>▎配置 yml 文件</h2>\n<p>在项目目录下，创建 <code class=\"language-text\">serverless.yml</code> 文件：</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ touch serverless.yml</code></pre></div>\n<p>将以下内容写入上述的 yml 文件里：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"63276674944326164000\"\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(`# serverless.yml\n\nmyvuepress:\n  component: &quot;@serverless/tencent-website&quot;\n  inputs:\n    code:\n      src: ./dist # Upload static files\n      index: index.html\n      error: 404.html\n    region: ap-guangzhou\n    bucketName: my-bucket`, `63276674944326164000`)\"\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=\"console\"><pre class=\"language-console\"><code class=\"language-console\"># serverless.yml\n\nmyvuepress:\n  component: &quot;@serverless/tencent-website&quot;\n  inputs:\n    code:\n      src: ./dist # Upload static files\n      index: index.html\n      error: 404.html\n    region: ap-guangzhou\n    bucketName: my-bucket</code></pre></div>\n<p>配置完成后，文件目录如下：</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">/vuepress-starter\n  ├── .vuepress\n  |    ├── dist\n  |    |   ├── 404.html\n  |    |   └── index.html\n  |    └── serverless.yml\n  └── README.md</code></pre></div>\n<h2 id=\"▎部署\"><a href=\"#%E2%96%8E%E9%83%A8%E7%BD%B2\" 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>通过 <code class=\"language-text\">serverless</code> 命令（可使用命令缩写 <code class=\"language-text\">sls</code> ）进行部署，添加 <code class=\"language-text\">--debug</code> 参数查看部署详情：</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ sls --debug</code></pre></div>\n<p>如果你的账号未 <a href=\"https://cloud.tencent.com/login\">登陆</a> 或 <a href=\"https://cloud.tencent.com/register\">注册</a> 腾讯云，可以直接通过微信扫描命令行中的二维码，从而进行授权登陆和注册。这也是我觉得特别方便的一个地方！</p>\n<p>部署过程中，terminal 显示信息示意：</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ sls\n （此处有张二维码）\n  Please scan QR code login from wechat.\n  Wait login...\n  Login successful for TencentCloud.\n\n    myvuepress:\n      url: http://my-bucket-1256526400.cos-website.ap-guangzhou.myqcloud.com\n      env:\n\n  59s › myvuepress › done</code></pre></div>\n<p>访问命令行输出的 url，即可查看使用 Serverless Framework 部署的 VuePress 网站啦~</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020219/1582114426945-VuePress.jpg\" alt=\"最终效果\"></p>\n<h2 id=\"▎小结\"><a href=\"#%E2%96%8E%E5%B0%8F%E7%BB%93\" 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>部署过程中要注意，由于 VuePress 生成的 <code class=\"language-text\">index.html</code> 所在目录默认隐藏，因此要在正确的目录层级中创建  <code class=\"language-text\">serverless.yml</code> 文件，不然会导致部署失败。</p>\n<p>这次依然使用了腾讯云 <a href=\"https://cloud.tencent.com/product/sf\">Serverless Framework</a> 作为网站部署的工具，实在是因为太方便了。部署过程不到一分钟，完全不用考虑云上资源如何配置的问题！✌️</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=\"/best-practice/2020-02-04-vuepress-serverless/#%E2%96%8E%E5%B7%A5%E5%85%B7%E5%87%86%E5%A4%87\">▎工具准备</a></li>\n<li><a href=\"/best-practice/2020-02-04-vuepress-serverless/#%E2%96%8E%E5%88%9B%E5%BB%BA%E9%A1%B9%E7%9B%AE\">▎创建项目</a></li>\n<li><a href=\"/best-practice/2020-02-04-vuepress-serverless/#%E2%96%8E%E9%85%8D%E7%BD%AE-yml-%E6%96%87%E4%BB%B6\">▎配置 yml 文件</a></li>\n<li><a href=\"/best-practice/2020-02-04-vuepress-serverless/#%E2%96%8E%E9%83%A8%E7%BD%B2\">▎部署</a></li>\n<li><a href=\"/best-practice/2020-02-04-vuepress-serverless/#%E2%96%8E%E5%B0%8F%E7%BB%93\">▎小结</a></li>\n</ul>"},"previousBlog":{"id":"3f27165c-9176-5e1d-a427-9ffc801d5f2b","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/202026/1580962859953-probider.png","authors":["Tabor"],"categories":["best-practice"],"date":"2020-02-06T00:00:00.000Z","title":"基于 Serverless + 企业微信打造疫情监控小助手","description":"使用 Serverless 基本功能，配合企业微信打造 nCoV 疫情监控小助手","authorslink":["https://canmeng.net"],"translators":null,"translatorslink":null,"tags":["Serverless","企业微信"],"keywords":"Serverless 企业微信,Serverless 基本功能,nCoV 疫情监控小助手","outdated":true},"wordCount":{"words":100,"sentences":26,"paragraphs":26},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2020-02-06-serverless-work-weixin.md","fields":{"slug":"/best-practice/2020-02-06-serverless-work-weixin/","keywords":["php","python","serverless","云函数","font","echo","results","curl","info","color","responsesz"]}},"nextBlog":{"id":"1e3cc3dc-4176-54ac-99bf-c9f2d7edd372","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020113/1578918119146-WINTERS.png","authors":["Tabor"],"categories":["best-practice"],"date":"2020-01-13T00:00:00.000Z","title":"使用 Wintersmith + Serverless Framework 快速创建个人站点","description":"通过 Serverless Website 组件快速构建一个 Serverless Wintersmith 个人站点。","authorslink":["https://canmeng.net"],"translators":null,"translatorslink":null,"tags":["Serverless","Wintersmith"],"keywords":"Wintersmith,Wintersmith 站点,Serverless Framework 快速创建个人站点","outdated":true},"wordCount":{"words":118,"sentences":30,"paragraphs":30},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2020-01-13-Wintersmith-with-serverless.md","fields":{"slug":"/best-practice/2020-01-13-Wintersmith-with-serverless/","keywords":["serverless","website","无服务器","serverless","Serverless","yml","wintersmith","Framework","部署","tencent"]}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"blogId":"d28c5060-2591-5220-b940-e0f73d022e76","previousBlogId":"3f27165c-9176-5e1d-a427-9ffc801d5f2b","nextBlogId":"1e3cc3dc-4176-54ac-99bf-c9f2d7edd372"}}}