@arcblock/abtnode-docs
Version:
ABT Node Documentation, a help documentation for quickly get started with ABT Node.
1 lines • 46.9 kB
JSON
{"componentChunkName":"component---node-modules-arcblock-gatsby-theme-docs-src-templates-documentation-js","path":"/zh/developer/blocklet-spec","result":{"data":{"file":{"changeTime":"5 minutes ago","childMarkdownRemark":{"frontmatter":{"author":"zhenqiang","category":"","date":null,"description":"Blocklet 规范","draft":null,"keywords":"abtnode,blocklet,specification","language":"zh","layout":"documentation","path":"/zh/developer/blocklet-spec","tags":["abtnode","blocklet","specification"],"title":"Blocklet 规范"},"htmlAst":{"type":"root","children":[{"type":"element","tagName":"h2","properties":{"id":"什么是-blocklet?","style":"position:relative;"},"children":[{"type":"element","tagName":"a","properties":{"href":"#%E4%BB%80%E4%B9%88%E6%98%AF-blocklet%EF%BC%9F","ariaLabel":"什么是 blocklet? permalink","className":["anchor","before"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"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"},"children":[]}]}]},{"type":"text","value":"什么是 Blocklet?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Blocklet 是一种应用协议,同时也是一种软件架构。作为一个协议,它描述了构建 ABT 节点平台的方式;作为一个软件架构, 一个独立的 Blocklet 是一个可重用的软件模块,可能是一个 HTTP 服务,也可能是一个函数库等等;当多个 Blocklet 在一起运行时,需要一个平台将它们组合起来,共同构成一个独立的服务,比如 ABT 节点(ABT Node)。"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"如何定义-blocklet?","style":"position:relative;"},"children":[{"type":"element","tagName":"a","properties":{"href":"#%E5%A6%82%E4%BD%95%E5%AE%9A%E4%B9%89-blocklet%EF%BC%9F","ariaLabel":"如何定义 blocklet? permalink","className":["anchor","before"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"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"},"children":[]}]}]},{"type":"text","value":"如何定义 Blocklet?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"我们用 JSON 数据格式来描述 Blocklet 的协议。"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"定义基本信息","style":"position:relative;"},"children":[{"type":"element","tagName":"a","properties":{"href":"#%E5%AE%9A%E4%B9%89%E5%9F%BA%E6%9C%AC%E4%BF%A1%E6%81%AF","ariaLabel":"定义基本信息 permalink","className":["anchor","before"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"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"},"children":[]}]}]},{"type":"text","value":"定义基本信息"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-json"],"\"name\":":"","\"blocklet":"","name,":"","can":"","be":"","same":"","as":"","npm":"","package":"","name\",":""},"children":[{"type":"text","value":"{\n \"name\": \"blocklet name, can be same as npm package name\",\n \"description\": \"blocklet description, can be same as npm package description\",\n \"version\": \"blocklet version, can be same as npm package version\",\n \"group\": \"only `dapp|static` are allowed and supported\"\n}\n"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"name, description, version, group 描述了 Blocklet 的基本信息。其中,group 分为 "},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"dapp"}]},{"type":"text","value":" 和 "},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"static"}]},{"type":"text","value":" 两种类型。"},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"dapp"}]},{"type":"text","value":" 就是常规的 dapp,static 是一中只包含了前端静态资源的 Web 应用,ABT 节点内部会用一个 HTTP Server 来 serve "},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"static"}]},{"type":"text","value":" Blocklet."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"定义运行时设置","style":"position:relative;"},"children":[{"type":"element","tagName":"a","properties":{"href":"#%E5%AE%9A%E4%B9%89%E8%BF%90%E8%A1%8C%E6%97%B6%E8%AE%BE%E7%BD%AE","ariaLabel":"定义运行时设置 permalink","className":["anchor","before"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"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"},"children":[]}]}]},{"type":"text","value":"定义运行时设置"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-json"],"\"main\":":"","\"the":"","entrypoint":"","to":"","bundle":"","the":"","blocklet":"","or":"","static":"","folder\",":""},"children":[{"type":"text","value":"{\n \"main\": \"the entrypoint to bundle the blocklet or the static folder\",\n \"requiredEnvironments\": {\n \"name\": \"string, name of the environment\",\n \"description\": \"string, description of the environment\",\n \"required\": \"bool, is required\",\n \"default\": \"Any type, default value\"\n }\n}\n"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"除了对 Blocklet 基本信息的描述,Blocklet 还定义了 "},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"main"}]},{"type":"text","value":" 这个字段描述 Blocklet 如何开始运行,就是所谓的入口文件的描述。 这个字段和 Blocklet 的运行密切相关。"},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"main"}]},{"type":"text","value":" 定义了 dapp 或者 static 类型的 Blocklet 的入口文件或静态资源目录。所以对于 ABT 节点来说,"},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"main"}]},{"type":"text","value":" 字段是必须的,至关重要,否则 ABT 节点没有办法启动 Blocklet."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"除了 main 字段,我们还定义了 "},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"requiredEnvironments"}]},{"type":"text","value":" 字段用来声明 Blocklet 运行时需要的环境变量。有 4 个属性描述 1 个环境变量:name, description, required, default. 设置为 required 的变量,并且没有提供默认值时,用户必须在启动前设置该变量。"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"requiredEnvironments"}]},{"type":"text","value":" 不是必须的,Blocklet 需要时可以通过这个字段要求 Blocklet 用户提供相应的信息。比如,Blocklet 依赖 MongoDB 数据库,那么就可以用 requiredEnvironments 来要求用户填写 MongoDB 的连接字符串。"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"capabilities"}]},{"type":"text","value":" 用来告知 ABT Node 当前 Blocklet 的能力,比如如果你的 Blocklet 不能运行在任意动态的路由前缀下面,可以如下设置:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-json"],"\"capabilities\":":""},"children":[{"type":"text","value":" \"capabilities\": {\n \"dynamicPathPrefix\": false\n }\n"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"其他配置","style":"position:relative;"},"children":[{"type":"element","tagName":"a","properties":{"href":"#%E5%85%B6%E4%BB%96%E9%85%8D%E7%BD%AE","ariaLabel":"其他配置 permalink","className":["anchor","before"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"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"},"children":[]}]}]},{"type":"text","value":"其他配置"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-json"],"\"provider\":":"","\"arcblock|community\",":""},"children":[{"type":"text","value":"{\n \"provider\": \"arcblock|community\",\n \"public_url\": \"public page url, should at least specify one\",\n \"admin_url\": \"administrator page url, default to empty\",\n \"config_url\": \"configuration page url, default to empty\",\n \"doc_url\": \"public document url, if not specified, will use registry detail page\"\n}\n"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"这里是其他的配置项,对于 Blocklet 来说这些字段是可以选的,我们简单介绍一下这几个字段:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"provider 是声明 Blocklet 的来源,可选值有两个:arcblock|community. "},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"arcblock"}]},{"type":"text","value":" 代表 ArcBlock 官方开发的,"},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"community"}]},{"type":"text","value":" 是社区开发的。"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"public_url 是 Blocklet 可公开访问的地址。"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"admin_url 是 Blocklet 管理端地址。"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"config_url 是 Blocklet 配置页面地址。"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"doc_url 是 Blocklet 的文档地址,如果这个地址不存在,ABT 节点会使用 Blocklet 的 README 作为文档页面。"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"blocklet-生命周期","style":"position:relative;"},"children":[{"type":"element","tagName":"a","properties":{"href":"#blocklet-%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F","ariaLabel":"blocklet 生命周期 permalink","className":["anchor","before"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"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"},"children":[]}]}]},{"type":"text","value":"Blocklet 生命周期"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"生命周期","style":"position:relative;"},"children":[{"type":"element","tagName":"a","properties":{"href":"#%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F","ariaLabel":"生命周期 permalink","className":["anchor","before"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"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"},"children":[]}]}]},{"type":"text","value":"生命周期"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 121px; "},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 579.3388429752066%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,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'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"alt":"blocklet lifecycle","title":"blocklet lifecycle","src":"/abtnode/static/8fad49a82313c6d4d8296f704307e909/d15f4/blocklet-lifecycle.png","srcSet":["/abtnode/static/8fad49a82313c6d4d8296f704307e909/d15f4/blocklet-lifecycle.png 121w"],"sizes":["(max-width:","121px)","100vw,","121px"],"style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;","loading":"lazy"},"children":[]},{"type":"text","value":"\n "}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"在 ABT 节点中, Blocklet 完整的生命周期包括 "},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"安装(或部署)、启动、停止、卸载"}]},{"type":"text","value":" 这四个阶段。因为可以通过两种方式来安装 Blocklet, 分别是在市场中下载安装,另外一种是直接在本地用 ABT Node CLI 部署安装。用 CLI 部署主要是为了开发测试。所以在生命周期的第一阶段中存在安装、部署两种情况。"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"hooks","style":"position:relative;"},"children":[{"type":"element","tagName":"a","properties":{"href":"#hooks","ariaLabel":"hooks permalink","className":["anchor","before"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"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"},"children":[]}]}]},{"type":"text","value":"Hooks"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 921px; "},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 29.599999999999998%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAw0lEQVQY05VRSQqEQBDr/3/NFyio4IqK+75mSMCLOANTUFCx06lONEEQwHVdrOuKYRjgOI56HEdhy7LgeR6WZUGe5wjDUGdN02ju+164KApkWQZzk47jwLZtiKJImDOX2LaNOI51zgV1XWPfd8zzjKqqxGF3XSds8KOu63qdn3Wep8Qoakh863+KfFrm681T4J65tW1bZUSLtHVjxkHLfBG/E3NmruabTWbm+z6SJNFlChGnaYppmlCWpfKmEH8Kecz6A3K60C9uHDCnAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"alt":"blocklet lifecycle","title":"blocklet lifecycle","src":"/abtnode/static/4f09aa472359c4f94eb63a178d1e0a6c/6f606/blocklet-lifecycle-hooks.png","srcSet":["/abtnode/static/4f09aa472359c4f94eb63a178d1e0a6c/41b2e/blocklet-lifecycle-hooks.png 250w","/abtnode/static/4f09aa472359c4f94eb63a178d1e0a6c/36a81/blocklet-lifecycle-hooks.png 500w","/abtnode/static/4f09aa472359c4f94eb63a178d1e0a6c/6f606/blocklet-lifecycle-hooks.png 921w"],"sizes":["(max-width:","921px)","100vw,","921px"],"style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;","loading":"lazy"},"children":[]},{"type":"text","value":"\n "}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"在在这几个阶段中,ABT 节点提供了 hook 功能,用来在执行生命周期的过程中做一些事情。目前包含:"},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"pre-deploy, post-install, pre-start, pre-stop, pre-install, pre-uninstall"}]},{"type":"text","value":" 这几个 Hook."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"比如,某个 Blocklet 对于运行的机器有硬件要求:内存不能低于 1G,可用磁盘容量不能低于 500 MB。这个时候就可以利用 pre-install hook 来检测目标机器是否已满足需求,如果满足,正常安装,否则抛出错误消息,并终止安装。"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"hook 其实是一些 Shell 脚本,而这些脚本可能会引用 Blocklet 中的文件,而在打包 Blocklet 的过程中,ABT 节点打包工具(ABT Node CLI)会将 hook 用到的文件单独打包,所以,开发者需要在 "},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"hookFiles"}]},{"type":"text","value":" 中声明哪些文件被 hooks 引用了。"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"如何开发-blocklet?","style":"position:relative;"},"children":[{"type":"element","tagName":"a","properties":{"href":"#%E5%A6%82%E4%BD%95%E5%BC%80%E5%8F%91-blocklet%EF%BC%9F","ariaLabel":"如何开发 blocklet? permalink","className":["anchor","before"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"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"},"children":[]}]}]},{"type":"text","value":"如何开发 Blocklet?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"在了解了一些基础的 Blocklet 概念和协议后,那么怎么开发一个 Blocklet 呢?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"初始化-blocklet","style":"position:relative;"},"children":[{"type":"element","tagName":"a","properties":{"href":"#%E5%88%9D%E5%A7%8B%E5%8C%96-blocklet","ariaLabel":"初始化 blocklet permalink","className":["anchor","before"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"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"},"children":[]}]}]},{"type":"text","value":"初始化 Blocklet"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ABT Node CLI 提供了 "},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"abtnode blocklet:init"}]},{"type":"text","value":" 命令来帮助开发者快速创建一个 Blocklet 项目,这个命令会帮助开发者创建相关的配置文件和目录。"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"代码结构","style":"position:relative;"},"children":[{"type":"element","tagName":"a","properties":{"href":"#%E4%BB%A3%E7%A0%81%E7%BB%93%E6%9E%84","ariaLabel":"代码结构 permalink","className":["anchor","before"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"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"},"children":[]}]}]},{"type":"text","value":"代码结构"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-shell"],"blocklet.json":""},"children":[{"type":"text","value":"├── blocklet.json\n├── blocklet.md\n└── package.json\n"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"项目创建完成后,我们可以看到一个 Blocklet 项目主要包含两部分:Blocklet 描述信息和源代码。\nABT 节点当前只支持 Node.js 的 Blocklet 项目,所以 Blocklet 的描述信息一般会包含包含两部分:Node.js 的 package.json 和 Blocklet 的 blocklet.json. 我们在前面讲的 Blocklet Spec 的内容会放在 blocklet.json 中。当然,Blocklet 也允许将 blocklet.json 的内容放到 package.json 的 "},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"blocklet"}]},{"type":"text","value":" 字段中。"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"blockletjson","style":"position:relative;"},"children":[{"type":"element","tagName":"a","properties":{"href":"#blockletjson","ariaLabel":"blockletjson permalink","className":["anchor","before"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"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"},"children":[]}]}]},{"type":"text","value":"blocklet.json"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Blocklet 所有的描述信息都放在 blocklet.json 文件中。\n前面我们说,Blocklet 是一个 Node.js 项目,我们知道,Node.js 的 package.json 文件中也包含 name, description, version 这些信息。对于 Blocklet 来说,这部分重复的信息是等价的,ABT 节点会优先读取 blocklet.json 的配置,如果没有,才会去读取 package.json 中的。"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"如下是 blocklet.json 例子。"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-json"],"\"name\":":"","\"static-demo-blocklet\",":""},"children":[{"type":"text","value":"{\n \"name\": \"static-demo-blocklet\",\n \"description\": \"Demo blocklet that shows how to serve a static html5 game with ABT Node\",\n \"version\": \"1.0.0\",\n \"group\": \"static\",\n \"color\": \"primary\",\n \"main\": \"app/\",\n \"provider\": \"arcblock\",\n \"requiredEnvironments\": {\n \"name\": \"DEBUG\",\n \"description\": \"Enable test flag\",\n \"required\": false,\n \"default\": \"arcblock*\"\n },\n \"capabilities\": {\n \"dynamicPathPrefix\": true\n }\n}\n"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"blocklet-环境变量","style":"position:relative;"},"children":[{"type":"element","tagName":"a","properties":{"href":"#blocklet-%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F","ariaLabel":"blocklet 环境变量 permalink","className":["anchor","before"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"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"},"children":[]}]}]},{"type":"text","value":"Blocklet 环境变量"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"之后的开发工作就是一个普通的 Web 应用开发了。因为 Blocklet 是运行在 ABT 节点之中,所以 Blocklet 会依赖于 ABT 节点的环境。ABT 节点现在提供了一些环境变量供开发使用。"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"私有环境变量","style":"position:relative;"},"children":[{"type":"element","tagName":"a","properties":{"href":"#%E7%A7%81%E6%9C%89%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F","ariaLabel":"私有环境变量 permalink","className":["anchor","before"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"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"},"children":[]}]}]},{"type":"text","value":"私有环境变量"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"BLOCKLET_PORT"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"BLOCKLET"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"APP"}]},{"type":"text","value":"DIR"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"BLOCKLET"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"DATA"}]},{"type":"text","value":"DIR"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"BLOCKLET"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"LOG"}]},{"type":"text","value":"DIR"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"BLOCKLET"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"CACHE"}]},{"type":"text","value":"DIR"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"BLOCKLET"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"APP"}]},{"type":"text","value":"SK"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"BLOCKLET"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"APP"}]},{"type":"text","value":"ID"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"全局环境变量","style":"position:relative;"},"children":[{"type":"element","tagName":"a","properties":{"href":"#%E5%85%A8%E5%B1%80%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F","ariaLabel":"全局环境变量 permalink","className":["anchor","before"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"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"},"children":[]}]}]},{"type":"text","value":"全局环境变量"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"ABT"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"NODE"}]},{"type":"text","value":"DID"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"ABT"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"NODE"}]},{"type":"text","value":"PK"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"ABT"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"NODE"}]},{"type":"text","value":"URL"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"ABT"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"NODE"}]},{"type":"text","value":"DOMAIN"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"ABT"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"NODE"}]},{"type":"text","value":"PROTOCOL"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"这些变量都是字面意思,在开发 Blocklet 过程中可以从环境变量中读取这变量的些值。"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"如何打包-blocklet?","style":"position:relative;"},"children":[{"type":"element","tagName":"a","properties":{"href":"#%E5%A6%82%E4%BD%95%E6%89%93%E5%8C%85-blocklet%EF%BC%9F","ariaLabel":"如何打包 blocklet? permalink","className":["anchor","before"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"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"},"children":[]}]}]},{"type":"text","value":"如何打包 Blocklet?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Blocklet 开发完成后需要将代码打包才能进行部署,ABT CLI 提供了 "},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"abtnode bundle"}]},{"type":"text","value":" 命令来打包源码。"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"在-abt-节点中测试","style":"position:relative;"},"children":[{"type":"element","tagName":"a","properties":{"href":"#%E5%9C%A8-abt-%E8%8A%82%E7%82%B9%E4%B8%AD%E6%B5%8B%E8%AF%95","ariaLabel":"在 abt 节点中测试 permalink","className":["anchor","before"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"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"},"children":[]}]}]},{"type":"text","value":"在 ABT 节点中测试"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"在了解 Blocklet 生命周期一节时, 我们提到了部署(Deploy)阶段,这个命令可以将打包好的项目部署到本地 ABT 节点中,用来测试 Blocklet。"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"如何发布-blocklet?","style":"position:relative;"},"children":[{"type":"element","tagName":"a","properties":{"href":"#%E5%A6%82%E4%BD%95%E5%8F%91%E5%B8%83-blocklet%EF%BC%9F","ariaLabel":"如何发布 blocklet? permalink","className":["anchor","before"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"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"},"children":[]}]}]},{"type":"text","value":"如何发布 Blocklet?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"首先,将开发好的 Blocklet 发布到 NPM。"},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"abtnode bundle"}]},{"type":"text","value":" 命令会将打包好的代码放到当前目录的 "},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":".blocklet"}]},{"type":"text","value":" 目录中,在发布或者测试时,需要将 "},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":".blocklet/bundle"}]},{"type":"text","value":" 中代码打包发布。"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"然后分叉 "},{"type":"element","tagName":"a","properties":{"href":"https://github.com/arcblock/blocklets"},"children":[{"type":"text","value":"https://github.com/arcblock/blocklets"}]},{"type":"text","value":" 仓库,(如果没有 Github 账号的话,需要先注册 Github 账号)。修改项目的 registry.yml 文件,将自己的 Blocklet NPM 包地址放到 registry.yml 列表中。然后给 ArcBlock 的仓库: "},{"type":"element","tagName":"a","properties":{"href":"https://github.com/arcblock/blocklets"},"children":[{"type":"text","value":"https://github.com/arcblock/blocklets"}]},{"type":"text","value":" 提一个 Pull Request。"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"检查确认没问题后,会将上面创建的 PR 合并到 Blocklet 仓库的主分支,从而完成发布。"}]}],"data":{"quirksMode":false}}}}},"pageContext":{"site":{"title":"ABT Node","description":"ABT Node Documentation","siteUrl":"https://docs.arcblock.io","logoUrl":"/abtnode/","sidebarWidth":360,"disableI18n":false,"showGetStarted":true,"defaultBanner":"/abtnode/og-banner.png"},"id":"25c798c8-66c7-5463-9797-bee9e6f9bbe7","language":"zh","locale":"zh","languages":[{"value":"en","text":"English"},{"value":"zh","text":"简体中文"}],"headings":[{"value":"什么是 Blocklet?","depth":2},{"value":"如何定义 Blocklet?","depth":2},{"value":"定义基本信息","depth":2},{"value":"定义运行时设置","depth":2},{"value":"其他配置","depth":2},{"value":"Blocklet 生命周期","depth":2},{"value":"生命周期","depth":2},{"value":"Hooks","depth":2},{"value":"如何开发 Blocklet?","depth":2},{"value":"初始化 Blocklet","depth":2},{"value":"代码结构","depth":3},{"value":"blocklet.json","depth":3},{"value":"Blocklet 环境变量","depth":2},{"value":"私有环境变量","depth":3},{"value":"全局环境变量","depth":2},{"value":"如何打包 Blocklet?","depth":2},{"value":"在 ABT 节点中测试","depth":3},{"value":"如何发布 Blocklet?","depth":2}],"navItems":[{"group":"/home/runner/work/abtnode-docs/abtnode-docs/src","title":"ABT Node","priority":999,"link":"/"}],"version":"v0.2.20","official":true,"originalPath":"/zh/developer/blocklet-spec","sidebarContent":[{"url":null,"title":null,"pages":[{"title":"ABT Node 文档","path":"/zh/"}]},{"url":"/zh/introduction","title":"节点入门","pages":[{"title":"节点功能概览","path":"/zh/introduction/abtnode-overview"},{"title":"如何获取 ABT 节点","path":"/zh/introduction/abtnode-setup"},{"title":"配置并启动 ABT 节点","path":"/zh/introduction/abtnode-access"}]},{"url":"/zh/marketplace","title":"应用市场","pages":[{"title":"查找和安装 Blocklet","path":"/zh/marketplace/find-and-install"},{"title":"升级或降级 Blocklet","path":"/zh/marketplace/upgrade-downgrade"}]},{"url":"/zh/blocklet","title":"应用管理","pages":[{"title":"基本管理操作","path":"/zh/blocklet/basic-operations"},{"title":"环境变量管理","path":"/zh/blocklet/environments"},{"title":"核心 Blocklets","path":"/zh/blocklet/core-blocklets"}]},{"url":"/zh/router","title":"路由管理","pages":[{"title":"什么是路由","path":"/zh/router/what-is-router"},{"title":"路由的基本用法","path":"/zh/router/basic-usage"},{"title":"给站点绑定域名以及启用 SSL","path":"/zh/router/bind-domain-and-ssl"},{"title":"localhost 证书","path":"/zh/router/certificates-for-localhost"}]},{"url":"/zh/deployment","title":"生产环境指南","pages":[{"title":"部署最佳实践","path":"/zh/deployment/best-practice"},{"title":"在 AWS 上部署","path":"/zh/deployment/from-aws-ami"},{"title":"运行在反向代理","path":"/zh/deployment/behind-reverse-proxy"},{"title":"在 Docker 中运行","path":"/zh/deployment/run-in-docker"}]},{"url":"/zh/misc","title":"其他功能","pages":[{"title":"节点配置","path":"/zh/misc/node-settings"},{"title":"成员管理","path":"/zh/misc/member-management"},{"title":"GraphQL 试验台","path":"/zh/misc/graphql-console"}]},{"url":"/zh/developer","title":"开发者指南","pages":[{"title":"配置开发环境","path":"/zh/developer/config-dev-env"},{"title":"ABT 节点 cli 工具","path":"/zh/developer/abtnode-cli"},{"title":"节点配置","path":"/zh/developer/configuration"},{"title":"节点存储目录详解","path":"/zh/developer/storage-structure"},{"title":"Blocklet 规范","path":"/zh/developer/blocklet-spec"},{"title":"创建静态 Blocklets","path":"/zh/developer/static-blocklets"},{"title":"创建 DApp Blocklets","path":"/zh/developer/dapp-blocklets"},{"title":"Blocklet 生命周期钩子","path":"/zh/developer/blocklet-hooks"},{"title":"打包 Blocklet","path":"/zh/developer/bundle-blocklets"},{"title":"发布 Blocklet","path":"/zh/developer/publish-blocklets"},{"title":"Blocklet 仓库","path":"/zh/developer/blocklet-registry"},{"title":"在 Codespaces 中开发 Blocklets","path":"/zh/developer/blocklet-codespaces"},{"title":"为 Blocklet 配置 Auth Service","path":"/zh/developer/auth-service"},{"title":"可组合的 Blocklet","path":"/zh/developer/composable-blocklet"},{"title":"Docker 镜像源列表","path":"/zh/developer/docker-registry"}]}],"communityPath":"https://community.arcblockio.cn","githubUrl":"https://github.com/ArcBlock/abtnode-docs/tree/master/src/developer/blocklet-spec/index.zh.md"}},"staticQueryHashes":["1358860651","1619896071","1812186216","2194038815"]}