{"componentChunkName":"component---src-templates-blog-detail-tsx","path":"/blog/2020-03-03-global-Component","result":{"data":{"currentBlog":{"id":"d45150eb-b890-55be-b616-dc19cf459c38","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/202034/1583323516946-v2-1a569e74722930de772e470209db3c05_1200x500.jpg","authors":["Anycodes"],"categories":["guides-and-tutorials","user-stories"],"date":"2020-03-03T00:00:00.000Z","title":"Serverless 组件开发尝试：全局变量组件和单独部署组件","description":"为了方便，我开发了这样的 Component","authorslink":["https://www.zhihu.com/people/liuyu-43-97"],"translators":null,"translatorslink":null,"tags":["Serverless","Component"],"keywords":"Serverless 全局变量组件,Serverless 单独部署组件,Serverless Component","outdated":true},"wordCount":{"words":212,"sentences":34,"paragraphs":33},"fileAbsolutePath":"/opt/build/repo/content/blog/2020-03-03-global-Component.md","fields":{"slug":"/blog/2020-03-03-global-Component/","keywords":["go","koa","serverless","website","云函数","serverless","website","tencent","mysql"]},"html":"<h2 id=\"前言\"><a href=\"#%E5%89%8D%E8%A8%80\" 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>实事求是地说，Serverless Framework 的 Components 真的好用，原先使用 SCF CLI 和 VSCode 插件部署腾讯云函数尽管也方便，但也只能部署云函数。</p>\n<p>假如我有静态资源，想配置 CDN，想绑定域名，或者其他更多的操作......可能都离不开控制台。但是 Serverless Framework 的 Components 几乎可以让我暂时告别控制台。对这样的一个工具，我真的 respect！</p>\n<p>然而就在我尝试使用 Components 做稍微大一点的项目，遇到了两个不算问题的问题，但也着实让人抓狂。</p>\n<ol>\n<li>Component 没有全局变量；</li>\n<li>Component 不能单独部署；</li>\n</ol>\n<blockquote>\n<p>再进行下文阅读前，可以先了解这些背景知识：</p>\n<ul>\n<li><a href=\"https://serverlesscloud.cn/blog/2018-04-25-what-are-serverless-components-how-use/\">Serverless Component 是什么，我怎样使用它？</a></li>\n<li><a href=\"https://serverlesscloud.cn/best-practice/2019-12-12-how-write-first-serverless-component/\">如何开发自己的第一个 Serverless Component</a></li>\n</ul>\n</blockquote>\n<h2 id=\"全局变量组件\"><a href=\"#%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F%E7%BB%84%E4%BB%B6\" 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>如果只有一个组件需要部署，例如下面这个 Yaml，那么全局变量存在的意义的确不大。</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"92954884350351640000\"\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(`hello_world:\n  component: &quot;@serverless/tencent-website&quot;\n  inputs:\n    code:\n      src: ./public\n      index: index.html\n      error: index.html\n    region: ap-shanghai\n    bucketName: hello_world`, `92954884350351640000`)\"\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=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">hello_world</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">component</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"@serverless/tencent-website\"</span>\n  <span class=\"token key atrule\">inputs</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">code</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">src</span><span class=\"token punctuation\">:</span> ./public\n      <span class=\"token key atrule\">index</span><span class=\"token punctuation\">:</span> index.html\n      <span class=\"token key atrule\">error</span><span class=\"token punctuation\">:</span> index.html\n    <span class=\"token key atrule\">region</span><span class=\"token punctuation\">:</span> ap<span class=\"token punctuation\">-</span>shanghai\n    <span class=\"token key atrule\">bucketName</span><span class=\"token punctuation\">:</span> hello_world</code></pre></div>\n<p>但是实际生产中，一个 Yaml 中会写很多的部分。</p>\n<p>例如我的 Blog 的 Yaml：<a href=\"https://github.com/anycodes/ServerlessBlog/blob/master/serverless.yaml%E3%80%82%E8%BF%99%E9%87%8C%E9%9D%A2%E5%85%B1%E6%9C%89%E5%8D%81%E5%87%A0%E4%B8%AA%E5%87%BD%E6%95%B0%EF%BC%8C%E5%A6%82%E6%9E%9C%E6%B2%A1%E6%9C%89%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F%E7%9A%84%E8%AF%9D%EF%BC%8C%E9%82%A3%E5%8F%AF%E8%83%BD%E7%9C%9F%E7%9A%84%E6%98%AF%E5%99%A9%E6%A2%A6%E3%80%82\">https://github.com/anycodes/ServerlessBlog/blob/master/serverless.yaml。这里面共有十几个函数，如果没有全局变量的话，那可能真的是噩梦。</a></p>\n<p>比方有 10 个函数，这些函数都要部署在 ap-guangzhou。部署完成之后，我又要把它们部署到 ap-shanghai 区，如果没有全局变量，就要修改十几个函数的配置。即使批量替换修改，也可能出现问题。所以，此时若有全局变量的组件，就显得尤为重要。</p>\n<p>为此，我贡献了这样一个组件：serverless-global。通过这个组件，我们可以设置一些全局变量，在程序中使用：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"53470740345410310000\"\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(`Conf:\n  component: &quot;serverless-global&quot;\n  inputs:\n    region: ap-shanghai\n    mysql_host: gz-cdb-mytest.sql.tencentcdb.com\n    mysql_user: mytest\n    mysql_password: mytest\n    mysql_port: 62580\n    mysql_db: mytest\n\nAlbum_Login:\n  component: &quot;@serverless/tencent-scf&quot;\n  inputs:\n    name: Album_Login\n    codeUri: ./album/login\n    handler: index.main_handler\n    runtime: Python3.6\n    region: \\${Conf.region}\n    environment:\n      variables:\n        mysql_host: \\${Conf.mysql_host}\n        mysql_port: \\${Conf.mysql_port}\n        mysql_user: \\${Conf.mysql_user}\n        mysql_password: \\${Conf.mysql_password}\n        mysql_db: \\${Conf.mysql_db}`, `53470740345410310000`)\"\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=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">Conf</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">component</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"serverless-global\"</span>\n  <span class=\"token key atrule\">inputs</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">region</span><span class=\"token punctuation\">:</span> ap<span class=\"token punctuation\">-</span>shanghai\n    <span class=\"token key atrule\">mysql_host</span><span class=\"token punctuation\">:</span> gz<span class=\"token punctuation\">-</span>cdb<span class=\"token punctuation\">-</span>mytest.sql.tencentcdb.com\n    <span class=\"token key atrule\">mysql_user</span><span class=\"token punctuation\">:</span> mytest\n    <span class=\"token key atrule\">mysql_password</span><span class=\"token punctuation\">:</span> mytest\n    <span class=\"token key atrule\">mysql_port</span><span class=\"token punctuation\">:</span> <span class=\"token number\">62580</span>\n    <span class=\"token key atrule\">mysql_db</span><span class=\"token punctuation\">:</span> mytest\n\n<span class=\"token key atrule\">Album_Login</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">component</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"@serverless/tencent-scf\"</span>\n  <span class=\"token key atrule\">inputs</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> Album_Login\n    <span class=\"token key atrule\">codeUri</span><span class=\"token punctuation\">:</span> ./album/login\n    <span class=\"token key atrule\">handler</span><span class=\"token punctuation\">:</span> index.main_handler\n    <span class=\"token key atrule\">runtime</span><span class=\"token punctuation\">:</span> Python3.6\n    <span class=\"token key atrule\">region</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span>Conf.region<span class=\"token punctuation\">}</span>\n    <span class=\"token key atrule\">environment</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">variables</span><span class=\"token punctuation\">:</span>\n        <span class=\"token key atrule\">mysql_host</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span>Conf.mysql_host<span class=\"token punctuation\">}</span>\n        <span class=\"token key atrule\">mysql_port</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span>Conf.mysql_port<span class=\"token punctuation\">}</span>\n        <span class=\"token key atrule\">mysql_user</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span>Conf.mysql_user<span class=\"token punctuation\">}</span>\n        <span class=\"token key atrule\">mysql_password</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span>Conf.mysql_password<span class=\"token punctuation\">}</span>\n        <span class=\"token key atrule\">mysql_db</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span>Conf.mysql_db<span class=\"token punctuation\">}</span></code></pre></div>\n<p>通过 serverless-global，我们可以定义一些全局的公共参数，并且通过变量的方法引用这些参数，例如 <code class=\"language-text\">${Conf.region}</code> 就是引用 Conf-inputs 中定义的 region 变量。期待 Serverless 团队在未来能支持全局变量的功能。</p>\n<h2 id=\"单独部署组件\"><a href=\"#%E5%8D%95%E7%8B%AC%E9%83%A8%E7%BD%B2%E7%BB%84%E4%BB%B6\" 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>还是 Serverless Blog 这个例子，里面有多个模块，包括十几个函数、API 网关以及 Website 等。初次部署真的爽歪歪+美滋滋：一键部署就是爽！</p>\n<p>但是，当我修改其中的某个函数，仅仅修改了一个配置信息，我再执行 <code class=\"language-text\">sls --debug</code> 部署的时候，它竟然又为我重新部署了一次！部署一次约 10min，可我仅仅修改了一行代码。虽说不是什么大问题，但体验也不如人意：为什么 Component 没有指定部署某个资源的功能？</p>\n<p>我猜想：如果可通过某个参数，来控制我要部署那个资源，该有多好？</p>\n<p>例如：我用命令 <code class=\"language-text\">sls --debug -n website</code> 可以只部署 website，而不是全部资源再跑一次部署，那多方便啊！于是我思前想后，通过简单的几行代码，实现了一套非常简单的 Component：</p>\n<p><img src=\"https://img.serverlesscloud.cn/202034/1583327304232-liucheng.png\" alt=\"流程图\"></p>\n<p>是的，我就是在官方 Component 上层，嵌套了一个 tempComponent。使用方法很简单，例如，有这么一个 website 的部分：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"13288909280279060000\"\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(`test1:\n  component: &quot;@serverless/tencent-website&quot;\n  inputs:\n    code:\n      src: ./public\n      index: index.html\n      error: index.html\n    region: ap-shanghai\n    bucketName: test1`, `13288909280279060000`)\"\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=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">test1</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">component</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"@serverless/tencent-website\"</span>\n  <span class=\"token key atrule\">inputs</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">code</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">src</span><span class=\"token punctuation\">:</span> ./public\n      <span class=\"token key atrule\">index</span><span class=\"token punctuation\">:</span> index.html\n      <span class=\"token key atrule\">error</span><span class=\"token punctuation\">:</span> index.html\n    <span class=\"token key atrule\">region</span><span class=\"token punctuation\">:</span> ap<span class=\"token punctuation\">-</span>shanghai\n    <span class=\"token key atrule\">bucketName</span><span class=\"token punctuation\">:</span> test1</code></pre></div>\n<p>把里面 component 的名字改一下，改成@gosls：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"81839886922674720000\"\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(`test1:\n  component: &quot;@gosls/tencent-website&quot;\n  inputs:\n    code:\n      src: ./public\n      index: index.html\n      error: index.html\n    region: ap-shanghai\n    bucketName: test1`, `81839886922674720000`)\"\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=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">test1</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">component</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"@gosls/tencent-website\"</span>\n  <span class=\"token key atrule\">inputs</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">code</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">src</span><span class=\"token punctuation\">:</span> ./public\n      <span class=\"token key atrule\">index</span><span class=\"token punctuation\">:</span> index.html\n      <span class=\"token key atrule\">error</span><span class=\"token punctuation\">:</span> index.html\n    <span class=\"token key atrule\">region</span><span class=\"token punctuation\">:</span> ap<span class=\"token punctuation\">-</span>shanghai\n    <span class=\"token key atrule\">bucketName</span><span class=\"token punctuation\">:</span> test1</code></pre></div>\n<p>这样就变成了支持部署单个组件的 component 了，并且所有腾讯云的组件都可以通过修改前面的前缀进行变化，如果不想用了，可以随时修改回 @serverless，下面的 inputs 的内容和格式，和官方的一模一样，直接转发给对应的 @serverless/tencent-website。例如：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"51577879998784315000\"\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\ntest1:\n  component: &quot;@gosls/tencent-website&quot;\n  inputs:\n    code:\n      src: ./public\n      index: index.html\n      error: index.html\n    region: ap-shanghai\n    bucketName: test1\n\n\ntest2:\n  component: &quot;@gosls/tencent-website&quot;\n  inputs:\n    code:\n      src: ./public\n      index: index.html\n      error: index.html\n    region: ap-shanghai\n    bucketName: test2\n\n\ntest3:\n  component: &quot;@gosls/tencent-website&quot;\n  inputs:\n    code:\n      src: ./public\n      index: index.html\n      error: index.html\n    region: ap-shanghai\n    bucketName: test3`, `51577879998784315000`)\"\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=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token comment\"># serverless.yml</span>\n\n<span class=\"token key atrule\">test1</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">component</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"@gosls/tencent-website\"</span>\n  <span class=\"token key atrule\">inputs</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">code</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">src</span><span class=\"token punctuation\">:</span> ./public\n      <span class=\"token key atrule\">index</span><span class=\"token punctuation\">:</span> index.html\n      <span class=\"token key atrule\">error</span><span class=\"token punctuation\">:</span> index.html\n    <span class=\"token key atrule\">region</span><span class=\"token punctuation\">:</span> ap<span class=\"token punctuation\">-</span>shanghai\n    <span class=\"token key atrule\">bucketName</span><span class=\"token punctuation\">:</span> test1\n\n\n<span class=\"token key atrule\">test2</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">component</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"@gosls/tencent-website\"</span>\n  <span class=\"token key atrule\">inputs</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">code</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">src</span><span class=\"token punctuation\">:</span> ./public\n      <span class=\"token key atrule\">index</span><span class=\"token punctuation\">:</span> index.html\n      <span class=\"token key atrule\">error</span><span class=\"token punctuation\">:</span> index.html\n    <span class=\"token key atrule\">region</span><span class=\"token punctuation\">:</span> ap<span class=\"token punctuation\">-</span>shanghai\n    <span class=\"token key atrule\">bucketName</span><span class=\"token punctuation\">:</span> test2\n\n\n<span class=\"token key atrule\">test3</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">component</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"@gosls/tencent-website\"</span>\n  <span class=\"token key atrule\">inputs</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">code</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">src</span><span class=\"token punctuation\">:</span> ./public\n      <span class=\"token key atrule\">index</span><span class=\"token punctuation\">:</span> index.html\n      <span class=\"token key atrule\">error</span><span class=\"token punctuation\">:</span> index.html\n    <span class=\"token key atrule\">region</span><span class=\"token punctuation\">:</span> ap<span class=\"token punctuation\">-</span>shanghai\n    <span class=\"token key atrule\">bucketName</span><span class=\"token punctuation\">:</span> test3</code></pre></div>\n<p>执行 <code class=\"language-text\">sls --debug</code>：</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">DFOUNDERLIU-MB0:website_test dfounderliu$ sls --debug\n\n  DEBUG ─ Resolving the template&#39;s static variables.\n  DEBUG ─ Collecting components from the template.\n  DEBUG ─ Downloading any NPM components found in the template.\n  DEBUG ─ Analyzing the template&#39;s components dependencies.\n  .....\n  DEBUG ─ Website deployed successfully to URL: http://test2-1256773370.cos-website.ap-shanghai.myqcloud.com.\n  DEBUG ─ Website deployed successfully to URL: http://test3-1256773370.cos-website.ap-shanghai.myqcloud.com.\n\n  test1:\n    url: http://test1-1256773370.cos-website.ap-shanghai.myqcloud.com\n    env:\n  test2:\n    url: http://test2-1256773370.cos-website.ap-shanghai.myqcloud.com\n    env:\n  test3:\n    url: http://test3-1256773370.cos-website.ap-shanghai.myqcloud.com\n    env:\n\n  19s › test1 › done</code></pre></div>\n<p>可以看到完成了三个的部署，当我使用参数，执行部署 test2 的时候：</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">DFOUNDERLIU-MB0:website_test dfounderliu$ sls --debug -n test2\n\n  DEBUG ─ Resolving the template&#39;s static variables.\n  DEBUG ─ Collecting components from the template.\n  DEBUG ─ Downloading any NPM components found in the template.\n  DEBUG ─ Analyzing the template&#39;s components dependencies.\n  DEBUG ─ Creating the template&#39;s components graph.\n  ......\n  DEBUG ─ Uploading directory /Users/dfounderliu/Desktop/ServerlessComponents/test/website_test/public to bucket test2-1256773370\n  DEBUG ─ Website deployed successfully to URL: http://test2-1256773370.cos-website.ap-shanghai.myqcloud.com.\n\n  test1:\n  test2:\n    url: http://test2-1256773370.cos-website.ap-shanghai.myqcloud.com\n    env:\n  test3:\n\n  6s › test3 › done</code></pre></div>\n<p>可以看到，通过 -n 参数，只部署了 test2，其他的组件没有发生任何变化。\n目前这个功能支持绝大部分 Tencent 官方提供的组件（<a href=\"https://github.com/gosls\">https://github.com/gosls</a> ）：</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">@serverless/tencent-apigateway\n@serverless/tencent-cam-policy\n@serverless/tencent-cam-role\n@serverless/tencent-cdn\n@serverless/tencent-cos\n@serverless/tencent-egg\n@serverless/tencent-express\n@serverless/tencent-flask\n@serverless/tencent-koa\n@serverless/tencent-laravel\n@serverless/tencent-scf\n@serverless/tencent-website</code></pre></div>\n<p>快来开始动手吧～</p>\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-03-03-global-Component/#%E5%89%8D%E8%A8%80\">前言</a></li>\n<li><a href=\"/blog/2020-03-03-global-Component/#%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F%E7%BB%84%E4%BB%B6\">全局变量组件</a></li>\n<li><a href=\"/blog/2020-03-03-global-Component/#%E5%8D%95%E7%8B%AC%E9%83%A8%E7%BD%B2%E7%BB%84%E4%BB%B6\">单独部署组件</a></li>\n</ul>"},"previousBlog":{"id":"249f7192-89b5-5225-89f8-18f9de1ea8a3","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020327/1585306882197-9.jpg","authors":["serverless 社区"],"categories":["meetup"],"date":"2020-03-04T00:00:00.000Z","title":"如何开发一个 Serverless Express 组件 - 直播课","description":"Serverless 专家陈涛在线分享如何开发一个 Serverless 组件","authorslink":["https://serverlesscloud.cn"],"translators":null,"translatorslink":null,"tags":["Serverless","Meetup"],"keywords":"Serverless 全局变量组件,Serverless 单独部署组件,Serverless Component","outdated":null},"wordCount":{"words":88,"sentences":17,"paragraphs":17},"fileAbsolutePath":"/opt/build/repo/content/blog/2020-03-04-express-meetup.md","fields":{"slug":"/blog/2020-03-04-express-meetup/","keywords":["serverless","云函数","Serverless","serverless","Component","腾讯","serverlesscloud","朋友圈","代金券"]}},"nextBlog":{"id":"73f1d68e-beba-5f85-9a46-2a24819f047f","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/202032/1583158864577-wuhan_wechat6.jpg","authors":["serverless 社区"],"categories":["meetup"],"date":"2020-03-02T00:00:00.000Z","title":"wuhan2020 黑客松大赛","description":"Hack for Wuhan，每颗渺小的种子都能创造伟大的力量","authorslink":["https://serverlesscloud.cn"],"translators":null,"translatorslink":null,"tags":["Serverless","Meetup"],"keywords":"Serverless 全局变量组件,Serverless 单独部署组件,Serverless Component","outdated":null},"wordCount":{"words":179,"sentences":27,"paragraphs":27},"fileAbsolutePath":"/opt/build/repo/content/blog/2020-03-02-hack-for-wuhan.md","fields":{"slug":"/blog/2020-03-02-hack-for-wuhan/","keywords":["serverless","云函数","Serverless","疫情","开源","serverless","Tencent","参赛","免费"]}},"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":"665f9ce2-4451-59fd-bf98-1861789d3b3b","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/Serverless_logo.png","authors":["AndreaPasswater"],"categories":["guides-and-tutorials","engineering-culture"],"date":"2018-03-19T00:00:00.000Z","title":"如何为无服务器开放源代码项目做贡献","description":"想要为无服务器开放源代码项目做贡献？您可以遵循下面的指南。","authorslink":null,"translators":null,"translatorslink":null,"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":96,"sentences":36,"paragraphs":36},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-03-19-how-contribute-to-serverless-open-source.md","fields":{"slug":"/blog/2018-03-19-how-contribute-to-serverless-open-source/","keywords":["serverless","无服务器","serverless","github","插件","服务器","贡献","示例","blog","contribute"]}}},{"node":{"id":"a3e92579-65c3-5159-937c-32d18c5df7d7","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/why-not/why-not-header.png","authors":["AndreaPasswater"],"categories":["guides-and-tutorials","operations-and-observability","engineering-culture"],"date":"2018-03-21T00:00:00.000Z","title":"不适合选择无服务器的情境及原因","description":"无服务器既有优点也有缺点。那么，哪些情境下不适合选择无服务器？原因又是什么呢？","authorslink":null,"translators":null,"translatorslink":null,"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":163,"sentences":43,"paragraphs":43},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-03-21-when-why-not-use-serverless.md","fields":{"slug":"/blog/2018-03-21-when-why-not-use-serverless/","keywords":["faas","react","serverless","spa","无服务器","无服务器函数","无服务器架构","无服务器开发","服务器","twitter","serverless","blockquote","lang","script","en"]}}},{"node":{"id":"6a16520b-7886-582e-9182-64e50712d486","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/vendor+choice/serverless-data-portability.jpg","authors":["NickGottlieb"],"categories":["engineering-culture","guides-and-tutorials"],"date":"2018-06-20T00:00:00.000Z","title":"浅谈无服务器、数据锁定和供应商选择","description":"供应商选择是如今 IT 领导者需要考虑的最重要事项，而这一点可利用数据可移植性来实现。","authorslink":null,"translators":null,"translatorslink":null,"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":205,"sentences":33,"paragraphs":33},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-06-20-data-lockin-vendor-choice-portability.md","fields":{"slug":"/blog/2018-06-20-data-lockin-vendor-choice-portability/","keywords":["go","serverless","无服务器","无服务器架构","供应商","serverless","开发人员","数据","锁定","选择","服务"]}}},{"node":{"id":"94741abb-10ba-5db1-9756-cd1d573473fa","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/webstorm-ide/streamline-webstorm-serverless2.jpg","authors":["EslamHefnawy"],"categories":["guides-and-tutorials","engineering-culture"],"date":"2018-08-15T00:00:00.000Z","title":"如何使用 WebStorm 简化无服务器工作流程","description":"在本文中，我将和您分享如何使用 WebStorm 进行无服务器特定的 IDE 设置以及如何利用它来极大地加快无服务器工作流程。","authorslink":null,"translators":null,"translatorslink":null,"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":234,"sentences":54,"paragraphs":54},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-08-15-streamline-serverless-workflow-webstorm.md","fields":{"slug":"/blog/2018-08-15-streamline-serverless-workflow-webstorm/","keywords":["nodejs","serverless","无服务器","无服务器开发","serverless","WebStorm","webstorm","服务器","blog","assets"]}}},{"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","功能","构建"]}}}],"totalCount":89}},"pageContext":{"isCreatedByStatefulCreatePages":false,"blogId":"d45150eb-b890-55be-b616-dc19cf459c38","previousBlogId":"249f7192-89b5-5225-89f8-18f9de1ea8a3","nextBlogId":"73f1d68e-beba-5f85-9a46-2a24819f047f","categories":["guides-and-tutorials","user-stories"]}}}