项目
分类于
发表于 2021-02-20
作者: 灼灼团队
本文字数: 50
阅读时长 ≈ 0.2 分钟

# 内置变量

# 页面变量

{ "title": "项目", "frontmatter": { "title": "项目" }, "regularPath": "/projects/p3.html", "relativePath": "projects/p3.md", "key": "v-5a77f9f8", "path": "/projects/p3.html", "headers": [ { "level": 2, "title": "内置变量", "slug": "内置变量" }, { "level": 3, "title": "页面变量", "slug": "页面变量" }, { "level": 3, "title": "站点变量", "slug": "站点变量" } ], "size": "50", "categories": [] }

# 站点变量

{ "title": "灼灼前端", "description": "移动端App开发网页:Flutter 原生跨端开发、Flutter 集成 Android & iOS 混合开发,丝滑高帧的用户体验。小程序开发:JS/TS、Vue、React、Uni-app 多端开发,小游戏、Three.js 3D、车联网地图应用。三方技术顾问:项目报价、合同、风险,项目管理、跟进与协调、验收;系统运维、压力测试。", "base": "/", "headTags": [ [ "meta", { "name": "baidu-site-verification", "content": "code-GLMGFYoFh6" } ] ], "pages": [ { "title": "Flutter 与原生项目集成", "frontmatter": { "title": "Flutter 与原生项目集成" }, "regularPath": "/flutter-embedding/", "relativePath": "flutter-embedding/index.md", "key": "v-7f9d06c6", "path": "/flutter-embedding/", "size": "27", "categories": [] }, { "title": "iOS 项目集成 Flutter Module", "frontmatter": { "title": "iOS 项目集成 Flutter Module", "date": "2020-11-15T14:03:53.000Z", "tags": [ "flutter", "ios" ], "categories": [ "Flutter" ] }, "regularPath": "/flutter-embedding/embed-with-ios.html", "relativePath": "flutter-embedding/embed-with-ios.md", "key": "v-56738eaa", "path": "/flutter-embedding/embed-with-ios.html", "headers": [ { "level": 2, "title": "集成说明", "slug": "集成说明" }, { "level": 3, "title": "术语说明", "slug": "术语说明" }, { "level": 3, "title": "安装 Flutter 环境", "slug": "安装-flutter-环境" }, { "level": 3, "title": "初始化 Flutter 项目", "slug": "初始化-flutter-项目" }, { "level": 3, "title": "配置 Podfile", "slug": "配置-podfile" }, { "level": 3, "title": "更新 pod 依赖", "slug": "更新-pod-依赖" }, { "level": 3, "title": "添加 MyFlutterViewController", "slug": "添加-myflutterviewcontroller" }, { "level": 3, "title": "添加页面跳转代码", "slug": "添加页面跳转代码" }, { "level": 3, "title": "常见问题", "slug": "常见问题" } ], "size": "1803", "categories": [ { "title": "Flutter", "id": "flutter", "permalink": "/categories/flutter/" } ] }, { "title": "关于灼灼", "frontmatter": { "title": "关于灼灼", "sidebar": false, "layout": "AboutLayout" }, "regularPath": "/about.html", "relativePath": "about.md", "key": "v-64505b38", "path": "/about.html", "size": "43", "categories": [] }, { "title": "Android 项目集成 Flutter Module", "frontmatter": { "title": "Android 项目集成 Flutter Module", "date": "2020-11-13T14:03:53.000Z", "tags": [ "flutter", "android" ], "categories": [ "Flutter" ] }, "regularPath": "/flutter-embedding/embed-with-android.html", "relativePath": "flutter-embedding/embed-with-android.md", "key": "v-b3d18c34", "path": "/flutter-embedding/embed-with-android.html", "headers": [ { "level": 2, "title": "Flutter Module 集成说明", "slug": "flutter-module-集成说明" }, { "level": 3, "title": "术语说明:", "slug": "术语说明" }, { "level": 3, "title": "首先,参考 Flutter 官网文档(flutter.dev) 安装 Flutter 环境;", "slug": "首先-参考-flutter-官网文档-flutter-dev-安装-flutter-环境" }, { "level": 3, "title": "0. 在Flutter 项目目录下运行命令对 Flutter Module 进行初始化:", "slug": "_0-在flutter-项目目录下运行命令对-flutter-module-进行初始化" }, { "level": 3, "title": "1. 修改宿主项目根目录下的 /settings.gradle :", "slug": "_1-修改宿主项目根目录下的-settings-gradle" }, { "level": 3, "title": "2. 修改宿主项目中 /app/build.gradle,添加 Flutter 依赖:", "slug": "_2-修改宿主项目中-app-build-gradle-添加-flutter-依赖" }, { "level": 3, "title": "3. 将 MyFlutterActivity.java 文件,拷贝至宿主项目中的目录: /app/src/main/java/com/your-domain/projectName/", "slug": "_3-将-myflutteractivity-java-文件-拷贝至宿主项目中的目录-app-src-main-java-com-your-domain-projectname" }, { "level": 3, "title": "4. 在宿主项目的 /app/src/main/AndroidManifest.xml 中,添加 Flutter Activity 的声明:", "slug": "_4-在宿主项目的-app-src-main-androidmanifest-xml-中-添加-flutter-activity-的声明" }, { "level": 3, "title": "5. 在宿主项目的相应位置调用类似如下代码可打开 Flutter 页面:", "slug": "_5-在宿主项目的相应位置调用类似如下代码可打开-flutter-页面" }, { "level": 3, "title": "常见问题:", "slug": "常见问题" } ], "size": "4346", "categories": [ { "title": "Flutter", "id": "flutter", "permalink": "/categories/flutter/" } ] }, { "title": "Flutter 源码梳理", "frontmatter": { "title": "Flutter 源码梳理" }, "regularPath": "/flutter-src/", "relativePath": "flutter-src/index.md", "key": "v-35553a3d", "path": "/flutter-src/", "size": "25", "categories": [] }, { "title": "Github Actions - 使用 SSH 远程连接服务器部署", "frontmatter": { "title": "Github Actions - 使用 SSH 远程连接服务器部署", "date": "2019-11-18T15:57:53.000Z", "tags": [ "github", "github-ci", "github actions", "CI/CD", "DevOps", "ssh" ], "categories": [ "CI/CD", "Github Actions" ] }, "regularPath": "/github-actions/ssh-deploy.html", "relativePath": "github-actions/ssh-deploy.md", "key": "v-32fbca04", "path": "/github-actions/ssh-deploy.html", "headers": [ { "level": 3, "title": "需求", "slug": "需求" }, { "level": 3, "title": "代码", "slug": "代码" }, { "level": 3, "title": "小结", "slug": "小结" }, { "level": 3, "title": "参考链接", "slug": "参考链接" } ], "excerpt": "<p>文档中并没有关于 SSH 方面的东西,虽然不属于 Github Actions 范畴,但经常用到,并且确实要花费一些时间去检索用法,甚至调试很久。</p>\n<p>此文是为了记录经过验证的示例代码,方便日后或他人参考和使用。</p>\n", "size": "973", "categories": [ { "title": "CI/CD", "id": "ci-cd", "permalink": "/categories/ci-cd/" }, { "title": "Github Actions", "id": "github-actions", "permalink": "/categories/github-actions/" } ] }, { "title": "GitLab CI 示例:利用 CI 同步生产环境数据库到开发环境", "frontmatter": { "title": "GitLab CI 示例:利用 CI 同步生产环境数据库到开发环境", "date": "2018-11-20T20:58:19.000Z", "tags": [ "gitlab", "gitlab-ci", "CI/CD", "DevOps" ], "categories": [ "CI/CD", "GitLab CI/CD" ] }, "regularPath": "/gitlab-ci/example-db-sync.html", "relativePath": "gitlab-ci/example-db-sync.md", "key": "v-b21af5f8", "path": "/gitlab-ci/example-db-sync.html", "headers": [ { "level": 2, "title": "问题", "slug": "问题" }, { "level": 2, "title": "目标", "slug": "目标" }, { "level": 2, "title": "示例代码", "slug": "示例代码" }, { "level": 2, "title": "触发同步", "slug": "触发同步" }, { "level": 2, "title": "小结", "slug": "小结" }, { "level": 2, "title": "相关链接", "slug": "相关链接" } ], "excerpt": "<h2 id=\"问题\"><a class=\"header-anchor\" href=\"#问题\">#</a> 问题</h2>\n<p>我们通常需要频繁的将生产环境(production)的数据库同步到 develop 和 staging 环境。</p>\n<p>之前我们的做法是写了一个 shell 在服务器上手动运行,这个需要测试人员和开发人员拥有服务器权限,甚至是生产环境的权限,风险较大且 “不够 CI/CD 化”。</p>\n<p>后来是想写一个 HTTP 服务来触发这样的数据库同步操作,增加了额外的工作开销,还要为这个服务配相应的 CI/CD,不如直接使用 GitLab CI 来完成这个工作。</p>\n<p>GitLab CI Pipeline 不仅可以在用户 push 代码的时候被触发,还可以通过 HTTP 调用的形式主动触发。</p>\n<h2 id=\"目标\"><a class=\"header-anchor\" href=\"#目标\">#</a> 目标</h2>\n<p>开发 &amp; 测试人员将 production 环境的数据库同步到 develop / staging 环境:</p>\n<!--beforebegin--><div class=\"language- extra-class\"><!--afterbegin--><pre><code>- 无需接触服务器环境\n- 任意时间可主动进行同步(相对于计划任务而言)\n- 可指定同步某个项目相关的数据库\n- 可指定同步到某个服务器环境 ( develop / staging )\n</code></pre>\n<!--beforeend--></div><!--afterend--><p>预设场景:</p>\n<!--beforebegin--><div class=\"language- extra-class\"><!--afterbegin--><pre><code>- 有三个数据库项目:project-a project-b project-c\n- 有三个服务器环境:production develop staging\n- 通过 GitLab CI Pipeline Triggers 来触发执行(HTTP方式)\n- 我们可任意指定同步某一个项目的 production 数据库到 develop 或 staging\n</code></pre>\n<!--beforeend--></div><!--afterend-->", "size": "3336", "categories": [ { "title": "CI/CD", "id": "ci-cd", "permalink": "/categories/ci-cd/" }, { "title": "GitLab CI/CD", "id": "gitlab-ci-cd", "permalink": "/categories/gitlab-ci-cd/" } ] }, { "title": "Github Actions - 发布 npm 包", "frontmatter": { "title": "Github Actions - 发布 npm 包", "date": "2019-11-18T14:03:53.000Z", "tags": [ "github", "github-ci", "github actions", "CI/CD", "DevOps" ], "categories": [ "CI/CD", "Github Actions" ] }, "regularPath": "/github-actions/npm-publish.html", "relativePath": "github-actions/npm-publish.md", "key": "v-8a703ee4", "path": "/github-actions/npm-publish.html", "headers": [ { "level": 3, "title": "需求", "slug": "需求" }, { "level": 3, "title": "代码", "slug": "代码" }, { "level": 3, "title": "小结", "slug": "小结" }, { "level": 3, "title": "参考链接", "slug": "参考链接" } ], "excerpt": "<p>Github 推出个人免费私有仓库后,我就逐渐把在其它平台的私有仓库迁移过来了,万分方便。</p>\n<p>唯一的遗憾就是 CI/CD,之前使用 <code>Gitlab CI</code> 体验很好,以至于我对其它的 CI 工具都提不起兴趣,一直期待 Github 能推出类似的,所以 <code>Github Actions</code> 的推出我是无比兴奋的。</p>\n", "size": "1106", "categories": [ { "title": "CI/CD", "id": "ci-cd", "permalink": "/categories/ci-cd/" }, { "title": "Github Actions", "id": "github-actions", "permalink": "/categories/github-actions/" } ] }, { "title": "GitLab CI 示例:Docker 镜像打包发布 & SSH 部署", "frontmatter": { "title": "GitLab CI 示例:Docker 镜像打包发布 & SSH 部署", "date": "2018-11-18T21:44:35.000Z", "tags": [ "gitlab", "gitlab-ci", "CI/CD", "DevOps" ], "categories": [ "CI/CD", "GitLab CI/CD" ] }, "regularPath": "/gitlab-ci/example-docker-ssh-deploy.html", "relativePath": "gitlab-ci/example-docker-ssh-deploy.md", "key": "v-5c6aa8e4", "path": "/gitlab-ci/example-docker-ssh-deploy.html", "headers": [ { "level": 3, "title": "目标", "slug": "目标" }, { "level": 3, "title": "示例代码说明", "slug": "示例代码说明" }, { "level": 3, "title": "参考链接", "slug": "参考链接" } ], "excerpt": "<h3 id=\"目标\"><a class=\"header-anchor\" href=\"#目标\">#</a> 目标</h3>\n<p>当我们 push 代码到 git 仓库时,将项目部署到目标服务器上,具体步骤:</p>\n<!--beforebegin--><div class=\"language- extra-class\"><!--afterbegin--><pre><code>- 基于代码仓库中的 Dockerfile 构建代码镜像\n- 将构建的代码镜像推送到我们的私有镜像仓库\n- 通过 ssh 连接目标服务器,远程执行部署指令,基于代码镜像启动容器\n</code></pre>\n<!--beforeend--></div><!--afterend-->", "size": "1448", "categories": [ { "title": "CI/CD", "id": "ci-cd", "permalink": "/categories/ci-cd/" }, { "title": "GitLab CI/CD", "id": "gitlab-ci-cd", "permalink": "/categories/gitlab-ci-cd/" } ] }, { "frontmatter": { "layout": "HomeLayout", "services": [ { "title": "网页、小程序开发", "details": "JS/TS、Vue、React、Uni-app 多端开发,小游戏、Three.js 3D、车联网地图应用", "imgUrl": "/img/ui.png" }, { "title": "移动端App开发", "details": "Flutter 原生跨端开发、Flutter 集成 Android & iOS 混合开发,丝滑高帧的用户体验", "imgUrl": "/img/art.png" }, { "title": "三方技术顾问", "details": "项目报价、合同、风险,项目管理、跟进与协调、验收;系统运维、压力测试", "imgUrl": "/img/thinking.png" } ], "customers": [ { "brand": "科大讯飞", "logo": "/img/customer/xunfei.png", "type": "logo", "link": "https://www.iflytek.com/" }, { "brand": "仓擎智能", "logo": "/img/customer/SingPilot.AI_logo.png", "type": "logo", "link": "http://www.singpilot.ai/" }, { "brand": "北辰教育", "logo": "/img/customer/beicheng-edu.png", "type": "logo", "link": "http://www.poledu.org/" }, { "brand": "春甫集团", "logo": "/img/customer/chunfujituan.png", "type": "logo", "link": "http://www.aztcm.com/", "background": "gray" }, { "brand": "铄普信息", "logo": "/img/customer/shuopu.png", "type": "logo", "link": "http://www.soappsh.com/" }, { "brand": "澳锐优科技", "logo": "/img/customer/aureo.png", "type": "logo", "link": "http://aureo.com.au/", "background": "gray" }, { "brand": "广晟科技", "logo": "/img/customer/guangsheng.png", "type": "logo", "link": "http://www.stsun.cn/" }, { "brand": "俊士铁路", "logo": "/img/customer/junshitielu.png", "type": "logo", "link": "http://www.trainscn.com/", "background": "gray" }, { "brand": "合力", "logo": "/img/customer/heli.png", "type": "logo", "link": "http://www.helichina.com/" }, { "brand": "中关村", "logo": "/img/customer/zgc.png", "type": "logo", "link": "http://www.hfhrsip.com/" } ] }, "regularPath": "/", "relativePath": "index.md", "key": "v-61049486", "path": "/", "size": "1016", "categories": [] }, { "title": "GitLab CI 示例:构建 & 测试 Node.js 应用", "frontmatter": { "title": "GitLab CI 示例:构建 & 测试 Node.js 应用", "date": "2018-11-14T00:18:13.000Z", "tags": [ "gitlab", "gitlab-ci", "CI/CD", "DevOps" ], "categories": [ "CI/CD", "GitLab CI/CD" ] }, "regularPath": "/gitlab-ci/example-node-js.html", "relativePath": "gitlab-ci/example-node-js.md", "key": "v-3acf4678", "path": "/gitlab-ci/example-node-js.html", "headers": [ { "level": 2, "title": "示例定义", "slug": "示例定义" }, { "level": 2, "title": "解释说明", "slug": "解释说明" }, { "level": 3, "title": "stages", "slug": "stages" }, { "level": 3, "title": "build_job", "slug": "build-job" }, { "level": 3, "title": "test_job", "slug": "test-job" }, { "level": 3, "title": "cache", "slug": "cache" }, { "level": 2, "title": "总结", "slug": "总结" } ], "excerpt": "<p>通过解释说明一个简单的 Node.js 应用的 <code>Pipeline</code> 示例来介绍 GitLab CI 的工作方式和使用。</p>\n<p>其中会重点介绍 GitLab CI 的执行过程,<code>Stage</code> <code>Job</code> 等基础概念,以及缓存策略。</p>\n", "size": "1813", "categories": [ { "title": "CI/CD", "id": "ci-cd", "permalink": "/categories/ci-cd/" }, { "title": "GitLab CI/CD", "id": "gitlab-ci-cd", "permalink": "/categories/gitlab-ci-cd/" } ] }, { "title": "GitLab CI 示例:构建 & 部署 Web 前端项目(部署到 Swarm)", "frontmatter": { "title": "GitLab CI 示例:构建 & 部署 Web 前端项目(部署到 Swarm)", "date": "2018-11-22T09:51:04.000Z", "tags": [ "gitlab", "gitlab-ci", "CI/CD", "DevOps" ], "categories": [ "CI/CD", "GitLab CI/CD" ] }, "regularPath": "/gitlab-ci/example-web-front-end.html", "relativePath": "gitlab-ci/example-web-front-end.md", "key": "v-0742d6f8", "path": "/gitlab-ci/example-web-front-end.html", "headers": [ { "level": 2, "title": "问题", "slug": "问题" }, { "level": 2, "title": "TL;DR", "slug": "tl-dr" }, { "level": 2, "title": "例说", "slug": "例说" }, { "level": 2, "title": "小结", "slug": "小结" } ], "excerpt": "<h2 id=\"问题\"><a class=\"header-anchor\" href=\"#问题\">#</a> 问题</h2>\n<p>Web 前端的应用需要在 node 环境下安装依赖和构建,但是发布一般又是用 nginx 镜像,我们既不想在 node 容器里安装 nginx,也不想在 nginx 容器里安装 node;</p>\n<h2 id=\"tl-dr\"><a class=\"header-anchor\" href=\"#tl-dr\">#</a> TL;DR</h2>\n<p>所以,我们先在一个 node 容器中 build 应用,利用 GitLab CI Cache 机制,将构建后的目标文件(通常是 dist 文件夹)缓存,以便在发布阶段 (release stage) 可以使用。</p>\n<p>这里我所谓的 release 是指发布 docker image ,所以需要一个 Dockerfile,并且是以 nginx image 为基础镜像构建的。</p>\n<p>我这里是部署到 swarm 集群上,所以会首先把 <code>docker-stack.yml</code> 文件 scp 到目标服务器上。</p>\n", "size": "2029", "categories": [ { "title": "CI/CD", "id": "ci-cd", "permalink": "/categories/ci-cd/" }, { "title": "GitLab CI/CD", "id": "gitlab-ci-cd", "permalink": "/categories/gitlab-ci-cd/" } ] }, { "title": "GitLab CI 基本介绍", "frontmatter": { "title": "GitLab CI 基本介绍", "date": "2018-11-09T00:03:53.000Z", "tags": [ "gitlab", "gitlab-ci", "CI/CD", "DevOps" ], "categories": [ "CI/CD", "GitLab CI/CD" ] }, "regularPath": "/gitlab-ci/", "relativePath": "gitlab-ci/index.md", "key": "v-214ff246", "path": "/gitlab-ci/", "headers": [ { "level": 3, "title": "前置需求", "slug": "前置需求" }, { "level": 3, "title": "GitLab CI 的重要概念", "slug": "gitlab-ci-的重要概念" }, { "level": 3, "title": "GitLab CI 的工作方式", "slug": "gitlab-ci-的工作方式" }, { "level": 3, "title": "小结", "slug": "小结" } ], "excerpt": "<!-- {% img https://docs.gitlab.com/ee/ci/img/cicd_pipeline_infograph.png %} -->\n<p><img src=\"https://docs.gitlab.com/ee/ci/img/cicd_pipeline_infograph.png\" alt=\"Image\"></p>\n<blockquote>\n<p>这篇基本介绍只介绍 GitLab CI,不会写具体的使用细节,旨在让新接触 GitLab CI 的同学先对它有个基本的认识,直接看官网文档可能需要多花点时间才能理清一些概念。</p>\n</blockquote>\n<blockquote>\n<p>GitLab CI 的设计很灵活,有多种使用方案,我在接下来会针对最常用的几种情况写一系列包括实现细节步骤的文章。</p>\n</blockquote>\n", "size": "955", "categories": [ { "title": "CI/CD", "id": "ci-cd", "permalink": "/categories/ci-cd/" }, { "title": "GitLab CI/CD", "id": "gitlab-ci-cd", "permalink": "/categories/gitlab-ci-cd/" } ] }, { "title": "Javascript 构造函数、new、bind()、call() 原理理解", "frontmatter": { "title": "Javascript 构造函数、new、bind()、call() 原理理解", "date": "2018-02-28T14:11:14.000Z", "tags": [ "javascript", "constructor", "bind()", "new", "call()" ], "categories": [ "Javascript" ] }, "regularPath": "/javascript/constructor-bind-call-apply.html", "relativePath": "javascript/constructor-bind-call-apply.md", "key": "v-b7d7a788", "path": "/javascript/constructor-bind-call-apply.html", "headers": [ { "level": 3, "title": "问题", "slug": "问题" }, { "level": 3, "title": "构造函数", "slug": "构造函数" }, { "level": 3, "title": "this & call()", "slug": "this-call" }, { "level": 3, "title": "bind()", "slug": "bind" }, { "level": 3, "title": "总结", "slug": "总结" } ], "excerpt": "<p>其它语言开发者初接触 Js 时,会对构造函数、new 关键字有些迷糊,因为这两个概念在其它 OO 语言中是很基本的概念,但在 Js 中用起来和在以前熟悉的语言中有些不一样,引起一些困惑。</p>\n", "size": "2267", "categories": [ { "title": "Javascript", "id": "javascript", "permalink": "/categories/javascript/" } ] }, { "title": "Javascript async/await 原理 & 实现", "frontmatter": { "title": "Javascript async/await 原理 & 实现", "date": "2018-02-28T21:30:14.000Z", "tags": [ "javascript", "async/await", "async/await 原理" ], "categories": [ "Javascript" ] }, "regularPath": "/javascript/deep-into-async-await.html", "relativePath": "javascript/deep-into-async-await.md", "key": "v-4db56742", "path": "/javascript/deep-into-async-await.html", "headers": [ { "level": 3, "title": "Generator 基础复习", "slug": "generator-基础复习" }, { "level": 3, "title": "run()", "slug": "run" }, { "level": 3, "title": "总结", "slug": "总结" } ], "excerpt": "<p>ES7 在语法层面上支持了 <code>async/await</code> 关键字,我们将在代码层面上模拟实现 <code>async/await</code> 来理解它的工作原理。</p>\n<p>本文旨在说明其工作原理,你应该具备以下前置知识:</p>\n<ul>\n<li>熟悉 <code>Promise</code> 的概念及使用</li>\n<li>熟悉 <code>async/await</code> 的概念及使用</li>\n<li>了解 <code>Generator</code> 的概念</li>\n</ul>\n", "size": "1763", "categories": [ { "title": "Javascript", "id": "javascript", "permalink": "/categories/javascript/" } ] }, { "title": "动手写一个简单的 Promise.js", "frontmatter": { "title": "动手写一个简单的 Promise.js", "date": "2018-01-24T02:07:14.000Z", "tags": [ "javascript", "promise" ], "categories": [ "Javascript" ] }, "regularPath": "/javascript/diy-simple-promise-js.html", "relativePath": "javascript/diy-simple-promise-js.md", "key": "v-d7e8720c", "path": "/javascript/diy-simple-promise-js.html", "excerpt": "<p>初学 <code>Node.js</code> 的朋友总会耗一番周折去理解 <code>Promise</code>,这里给出一个最简单的 <code>Promise</code> 实现,以帮助对 <code>Promise</code> 还有疑惑的同学彻底理解其实现原理。</p>\n", "size": "1408", "categories": [ { "title": "Javascript", "id": "javascript", "permalink": "/categories/javascript/" } ] }, { "title": "Node.js 源码分析 - 加载 js 文件", "frontmatter": { "title": "Node.js 源码分析 - 加载 js 文件", "date": "2018-11-30T21:04:49.000Z", "tags": [ "Node.js", "Node.js 源码分析", "源码分析" ], "categories": [ "Node.js 源码分析" ] }, "regularPath": "/nodejs-src/bootstrap-js.html", "relativePath": "nodejs-src/bootstrap-js.md", "key": "v-3ee66324", "path": "/nodejs-src/bootstrap-js.html", "headers": [ { "level": 3, "title": "提出问题", "slug": "提出问题" }, { "level": 3, "title": "LoadEnvironment()", "slug": "loadenvironment" }, { "level": 3, "title": "总结", "slug": "总结" } ], "excerpt": "<h3 id=\"提出问题\"><a class=\"header-anchor\" href=\"#提出问题\">#</a> 提出问题</h3>\n<blockquote>\n<p>了解 js 文件加载前的准备工作</p>\n</blockquote>\n<p>在《{% post_link nodejs/nodejs-src/the-main 从 main 函数开始 %}》这篇中说到了 <code>LoadEnvironment()</code> 函数负责加载 js 代码,但并没有继续说明加载细节。</p>\n<p>这篇从 <code>LoadEnvironment()</code> 开始探究 js 代码加载的详细过程。</p>\n", "size": "3392", "categories": [ { "title": "Node.js 源码分析", "id": "node-js-源码分析", "permalink": "/categories/node-js-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/" } ] }, { "title": "Node.js 源码分析 - 目录 & 前言", "frontmatter": { "title": "Node.js 源码分析 - 目录 & 前言", "date": "2018-11-24T22:30:15.000Z", "tags": [ "Node.js", "Node.js 源码分析", "源码分析" ], "categories": [ "Node.js 源码分析" ] }, "regularPath": "/nodejs-src/", "relativePath": "nodejs-src/index.md", "key": "v-d7218d42", "path": "/nodejs-src/", "headers": [ { "level": 2, "title": "适合谁", "slug": "适合谁" }, { "level": 2, "title": "目录", "slug": "目录" }, { "level": 3, "title": "> V8 Embedding", "slug": "v8-embedding" }, { "level": 3, "title": "> Node.js 源码分析", "slug": "node-js-源码分析" }, { "level": 2, "title": "分析方式", "slug": "分析方式" }, { "level": 2, "title": "代码", "slug": "代码" }, { "level": 2, "title": "相关资料", "slug": "相关资料" } ], "excerpt": "<p>这两年先后两次读过 Node.js 源码,但是每次都懒于记录,过几个月就忘记了,这次把疏理过程记录下来,以免之后再浪费时间从头看。虽然是为了备忘,我会尽量站在读者的角度写,以望能帮助想了解 Node.js 源码的朋友节省一些时间、精力。</p>\n<h2 id=\"适合谁\"><a class=\"header-anchor\" href=\"#适合谁\">#</a> 适合谁</h2>\n<ul>\n<li>你需要熟悉 C/C++</li>\n<li>你需要熟悉 Node.js,理解异步编程及原理</li>\n</ul>\n", "size": "964", "categories": [ { "title": "Node.js 源码分析", "id": "node-js-源码分析", "permalink": "/categories/node-js-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/" } ] }, { "title": "Node.js 源码分析 - 从 main 函数开始", "frontmatter": { "title": "Node.js 源码分析 - 从 main 函数开始", "date": "2018-11-27T21:30:15.000Z", "tags": [ "Node.js", "Node.js 源码分析", "源码分析" ], "categories": [ "Node.js 源码分析" ] }, "regularPath": "/nodejs-src/the-main.html", "relativePath": "nodejs-src/the-main.md", "key": "v-7b383644", "path": "/nodejs-src/the-main.html", "headers": [ { "level": 3, "title": "小目标", "slug": "小目标" }, { "level": 3, "title": "贴代码说明", "slug": "贴代码说明" }, { "level": 3, "title": "开捋:从 main 函数到进程主循环", "slug": "开捋-从-main-函数到进程主循环" }, { "level": 3, "title": "小结", "slug": "小结" } ], "excerpt": "<h3 id=\"小目标\"><a class=\"header-anchor\" href=\"#小目标\">#</a> 小目标</h3>\n<blockquote>\n<p>知道程序大概执行逻辑,关键点执行的顺序</p>\n</blockquote>\n<p>我们平时在终端敲下 <code>node app.js</code> 后,发生了什么。</p>\n<p>具体点,知道 node.js 原生(C++)模块什么时候加载的,在哪加载的;\n知道我们的 js 代码是在哪个环节被加载执行的;\n知道进程的主循环(事件循环)什么时候启动的;</p>\n<p>有了这个小目标的基础,在接下来的文章中,我们再进一步的探索 node.js 原生模块的注册是怎么实现的,怎么获取 &amp; 初始化的,怎么曝露给 js 环境调用的;再细说 node.js 的模块机制,我们通常的 <code>app.js</code> 怎么被执行的;</p>\n", "size": "5912", "categories": [ { "title": "Node.js 源码分析", "id": "node-js-源码分析", "permalink": "/categories/node-js-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/" } ] }, { "title": "Node.js 原生模块(C++模块)的注册", "frontmatter": { "title": "Node.js 原生模块(C++模块)的注册", "date": "2018-11-28T21:04:49.000Z", "tags": [ "Node.js", "Node.js 源码分析", "源码分析" ], "categories": [ "Node.js 源码分析" ] }, "regularPath": "/nodejs-src/register-builtin-modules.html", "relativePath": "nodejs-src/register-builtin-modules.md", "key": "v-b6e12ff8", "path": "/nodejs-src/register-builtin-modules.html", "headers": [ { "level": 3, "title": "将 RegisterBuiltinModules() 层层展开", "slug": "将-registerbuiltinmodules-层层展开" }, { "level": 3, "title": "查看一个原生模块的源码", "slug": "查看一个原生模块的源码" }, { "level": 3, "title": "模块注册实现", "slug": "模块注册实现" }, { "level": 3, "title": "小结", "slug": "小结" } ], "excerpt": "<p>上一篇提到 <code>RegisterBuiltinModules()</code> 注册了原生 C++ 模块没有详细展开,这里就从这个函数展开。</p>\n", "size": "6117", "categories": [ { "title": "Node.js 源码分析", "id": "node-js-源码分析", "permalink": "/categories/node-js-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/" } ] }, { "title": "项目管理", "frontmatter": { "title": "项目管理", "date": "2021-01-08T11:44:17.000Z" }, "regularPath": "/projects/", "relativePath": "projects/index.md", "key": "v-368764ef", "path": "/projects/", "headers": [ { "level": 2, "title": "目录", "slug": "目录" }, { "level": 2, "title": "Hello VuePress", "slug": "hello-vuepress" }, { "level": 3, "title": "Image", "slug": "image" }, { "level": 3, "title": "Table", "slug": "table" }, { "level": 3, "title": "emoji", "slug": "emoji" }, { "level": 3, "title": "tip", "slug": "tip" }, { "level": 3, "title": "Warning", "slug": "warning" }, { "level": 3, "title": "带标题的危险警告", "slug": "带标题的危险警告" }, { "level": 2, "title": "代码块", "slug": "代码块" }, { "level": 3, "title": "可展开的代码块", "slug": "可展开的代码块" }, { "level": 2, "title": "页面数据", "slug": "页面数据" }, { "level": 3, "title": "Badge", "slug": "badge" } ], "size": "748", "categories": [] }, { "title": "项目测试", "frontmatter": { "title": "项目测试" }, "regularPath": "/projects/p1.html", "relativePath": "projects/p1.md", "key": "v-93af3278", "path": "/projects/p1.html", "headers": [ { "level": 2, "title": "p1-h2", "slug": "p1-h2" }, { "level": 3, "title": "p1-h3", "slug": "p1-h3" }, { "level": 3, "title": "p1-h3", "slug": "p1-h3-2" } ], "size": "55", "categories": [] }, { "title": "项目测试2", "frontmatter": { "title": "项目测试2" }, "regularPath": "/projects/p2.html", "relativePath": "projects/p2.md", "key": "v-77139638", "path": "/projects/p2.html", "size": "18", "categories": [] }, { "title": "项目", "frontmatter": { "title": "项目" }, "regularPath": "/projects/p3.html", "relativePath": "projects/p3.md", "key": "v-5a77f9f8", "path": "/projects/p3.html", "headers": [ { "level": 2, "title": "内置变量", "slug": "内置变量" }, { "level": 3, "title": "页面变量", "slug": "页面变量" }, { "level": 3, "title": "站点变量", "slug": "站点变量" } ], "size": "50", "categories": [] }, { "title": "V8 Embedding - 编译", "frontmatter": { "title": "V8 Embedding - 编译", "date": "2018-08-01T23:47:14.000Z", "tags": [ "V8", "javascript", "Node.js", "C/C++" ], "categories": [ "Javascript Engine V8", "V8 Embedding Basics" ] }, "regularPath": "/v8/compile-v8.html", "relativePath": "v8/compile-v8.md", "key": "v-68c711e4", "path": "/v8/compile-v8.html", "headers": [ { "level": 3, "title": "编译", "slug": "编译" }, { "level": 3, "title": "使用静态库", "slug": "使用静态库" }, { "level": 3, "title": "参考链接", "slug": "参考链接" } ], "excerpt": "<p>直接 git pull V8 的代码是不行的,需要使用 Google 提供的 depot_tools 工具包来获对代码并配置。</p>\n<p>由于要从 Google 下载资源,需要科学上网,下载和编译的耗时都较长,分别视你的网络情况和机器配置而定。</p>\n<p>为了屏蔽掉不同系统的差异,直接使用 Docker 容器环境来编译。</p>\n", "size": "903", "categories": [ { "title": "Javascript Engine V8", "id": "javascript-engine-v8", "permalink": "/categories/javascript-engine-v8/" }, { "title": "V8 Embedding Basics", "id": "v8-embedding-basics", "permalink": "/categories/v8-embedding-basics/" } ] }, { "title": "V8 Embedding - 回调函数", "frontmatter": { "title": "V8 Embedding - 回调函数", "date": "2018-08-06T21:07:07.000Z", "tags": [ "V8", "javascript", "Node.js", "C/C++" ], "categories": [ "Javascript Engine V8", "V8 Embedding Basics" ] }, "regularPath": "/v8/expose-cpp-func-callback.html", "relativePath": "v8/expose-cpp-func-callback.md", "key": "v-25d34104", "path": "/v8/expose-cpp-func-callback.html", "headers": [ { "level": 2, "title": "目标", "slug": "目标" }, { "level": 2, "title": "代码 & 说明", "slug": "代码-说明" }, { "level": 3, "title": "编译", "slug": "编译" }, { "level": 3, "title": "执行", "slug": "执行" }, { "level": 3, "title": "说明", "slug": "说明" }, { "level": 2, "title": "相关链接", "slug": "相关链接" } ], "excerpt": "<h2 id=\"目标\"><a class=\"header-anchor\" href=\"#目标\">#</a> 目标</h2>\n<p>上一篇写处理函数参数,漏掉了 callback 函数做为参数的情况,这里给个简单的示例。</p>\n<p>用 C++ 写一个简单 <code>RunFunc()</code> v8 函数传给 js 环境,使以下代码可运行:</p>\n<!--beforebegin--><div class=\"language-js line-numbers-mode\"><!--afterbegin--><pre v-pre class=\"language-js\"><code><span class=\"token comment\">// app.js</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">fn</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">msg</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">RunFunc</span><span class=\"token punctuation\">(</span>fn<span class=\"token punctuation\">)</span>\n</code></pre>\n<div class=\"line-numbers-wrapper\"><span class=\"line-number\">1</span><br><span class=\"line-number\">2</span><br><span class=\"line-number\">3</span><br><span class=\"line-number\">4</span><br><span class=\"line-number\">5</span><br><span class=\"line-number\">6</span><br></div><!--beforeend--></div><!--afterend-->", "size": "3027", "categories": [ { "title": "Javascript Engine V8", "id": "javascript-engine-v8", "permalink": "/categories/javascript-engine-v8/" }, { "title": "V8 Embedding Basics", "id": "v8-embedding-basics", "permalink": "/categories/v8-embedding-basics/" } ] }, { "title": "我们的服务", "frontmatter": { "title": "我们的服务", "sidebar": false }, "regularPath": "/services.html", "relativePath": "services.md", "key": "v-7a8269b4", "path": "/services.html", "size": "29", "categories": [] }, { "title": "FFMPEG - 基础命令", "frontmatter": { "title": "FFMPEG - 基础命令", "date": "2019-11-24T14:31:14.000Z", "tags": [ "ffmpeg" ], "categories": [ "ffmpeg" ] }, "regularPath": "/tech/ffmpeg-basic.html", "relativePath": "tech/ffmpeg-basic.md", "key": "v-036031a4", "path": "/tech/ffmpeg-basic.html", "headers": [ { "level": 3, "title": "Mac 安装", "slug": "mac-安装" }, { "level": 3, "title": "查看 mac 上的设备列表", "slug": "查看-mac-上的设备列表" }, { "level": 3, "title": "屏幕录像", "slug": "屏幕录像" }, { "level": 3, "title": "摄像头录制", "slug": "摄像头录制" }, { "level": 3, "title": "录音", "slug": "录音" }, { "level": 3, "title": "录制画中画", "slug": "录制画中画" }, { "level": 3, "title": "RTMP拉流", "slug": "rtmp拉流" }, { "level": 3, "title": "视频批量切割", "slug": "视频批量切割" }, { "level": 3, "title": "视频合并", "slug": "视频合并" }, { "level": 3, "title": "参考", "slug": "参考" } ], "excerpt": "<h3 id=\"mac-安装\"><a class=\"header-anchor\" href=\"#mac-安装\">#</a> Mac 安装</h3>\n<!--beforebegin--><div class=\"language-sh line-numbers-mode\"><!--afterbegin--><pre v-pre class=\"language-sh\"><code>brew <span class=\"token function\">install</span> ffmpeg\n</code></pre>\n<div class=\"line-numbers-wrapper\"><span class=\"line-number\">1</span><br></div><!--beforeend--></div><!--afterend--><h3 id=\"查看-mac-上的设备列表\"><a class=\"header-anchor\" href=\"#查看-mac-上的设备列表\">#</a> 查看 mac 上的设备列表</h3>\n<!--beforebegin--><div class=\"language-sh line-numbers-mode\"><!--afterbegin--><pre v-pre class=\"language-sh\"><code>ffmpeg -f avfoundation -list_devices <span class=\"token boolean\">true</span> -i <span class=\"token string\">\"\"</span>\n</code></pre>\n<div class=\"line-numbers-wrapper\"><span class=\"line-number\">1</span><br></div><!--beforeend--></div><!--afterend-->", "size": "1622", "categories": [ { "title": "ffmpeg", "id": "ffmpeg", "permalink": "/categories/ffmpeg/" } ] }, { "title": "V8 Embedding - C++ 变量暴露给 Javascript 环境", "frontmatter": { "title": "V8 Embedding - C++ 变量暴露给 Javascript 环境", "date": "2018-08-03T08:14:42.000Z", "tags": [ "V8", "javascript", "Node.js", "C/C++" ], "categories": [ "Javascript Engine V8", "V8 Embedding Basics" ] }, "regularPath": "/v8/expose-cpp-var.html", "relativePath": "v8/expose-cpp-var.md", "key": "v-27bce064", "path": "/v8/expose-cpp-var.html", "headers": [ { "level": 2, "title": "目标", "slug": "目标" }, { "level": 2, "title": "代码 & 说明", "slug": "代码-说明" }, { "level": 3, "title": "ObjectTemplate 与 Object 的区别", "slug": "objecttemplate-与-object-的区别" }, { "level": 3, "title": "Gobal ObjectTemplate", "slug": "gobal-objecttemplate" }, { "level": 2, "title": "相关链接", "slug": "相关链接" } ], "excerpt": "<h2 id=\"目标\"><a class=\"header-anchor\" href=\"#目标\">#</a> 目标</h2>\n<p>上一篇通过 Hello World 示例了解了 v8 的核心概念和基本使用方式,这篇中我们要将 C++ 环境中的对象暴露到 Javascript 环境中,即在 Javascript 代码中可以使用在 C++ 环境中的数据。</p>\n", "size": "2489", "categories": [ { "title": "Javascript Engine V8", "id": "javascript-engine-v8", "permalink": "/categories/javascript-engine-v8/" }, { "title": "V8 Embedding Basics", "id": "v8-embedding-basics", "permalink": "/categories/v8-embedding-basics/" } ] }, { "title": "V8 Embedding - 目录", "frontmatter": { "title": "V8 Embedding - 目录", "date": "2018-08-01T23:47:14.000Z", "tags": [ "V8", "javascript", "Node.js", "C/C++" ], "categories": [ "Javascript Engine V8", "V8 Embedding Basics" ] }, "regularPath": "/v8/", "relativePath": "v8/index.md", "key": "v-8d59f1c2", "path": "/v8/", "headers": [ { "level": 3, "title": "适合谁", "slug": "适合谁" }, { "level": 3, "title": "目录", "slug": "目录" }, { "level": 3, "title": "相关资料", "slug": "相关资料" } ], "excerpt": "<p>无论是中文还是英文资源,全网关于 v8 的资料是少之又少,官方文档也只是浅浅带过,缺少可实践运行的实例,此系列为 v8 embedding 的几个实例解释。</p>\n<h3 id=\"适合谁\"><a class=\"header-anchor\" href=\"#适合谁\">#</a> 适合谁</h3>\n<ul>\n<li>你需要熟悉 C/C++</li>\n<li>了解 Javascript</li>\n</ul>\n", "size": "660", "categories": [ { "title": "Javascript Engine V8", "id": "javascript-engine-v8", "permalink": "/categories/javascript-engine-v8/" }, { "title": "V8 Embedding Basics", "id": "v8-embedding-basics", "permalink": "/categories/v8-embedding-basics/" } ] }, { "title": "V8 Embedding - C++ 函数暴露给 Javascript 环境", "frontmatter": { "title": "V8 Embedding - C++ 函数暴露给 Javascript 环境", "date": "2018-08-04T21:07:07.000Z", "tags": [ "V8", "javascript", "Node.js", "C/C++" ], "categories": [ "Javascript Engine V8", "V8 Embedding Basics" ] }, "regularPath": "/v8/expose-cpp-function.html", "relativePath": "v8/expose-cpp-function.md", "key": "v-7cbd9a98", "path": "/v8/expose-cpp-function.html", "headers": [ { "level": 2, "title": "目标", "slug": "目标" }, { "level": 2, "title": "代码 & 说明", "slug": "代码-说明" }, { "level": 3, "title": "编译", "slug": "编译" }, { "level": 3, "title": "执行", "slug": "执行" }, { "level": 3, "title": "说明", "slug": "说明" }, { "level": 2, "title": "相关链接", "slug": "相关链接" } ], "excerpt": "<h2 id=\"目标\"><a class=\"header-anchor\" href=\"#目标\">#</a> 目标</h2>\n<p>上一篇我们把 C++ 环境中的对象暴露到 Javascript 环境中,这篇我们要将 C++ 环境中的 <code>函数</code> 暴露到 Javascript 环境中,写一个简单 <code>console.log</code> 函数传给 js 环境,使以下代码可运行:</p>\n<!--beforebegin--><div class=\"language-js line-numbers-mode\"><!--afterbegin--><pre v-pre class=\"language-js\"><code><span class=\"token comment\">// app.js</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Hi, 老根!'</span><span class=\"token punctuation\">)</span>\n</code></pre>\n<div class=\"line-numbers-wrapper\"><span class=\"line-number\">1</span><br><span class=\"line-number\">2</span><br></div><!--beforeend--></div><!--afterend-->", "size": "2538", "categories": [ { "title": "Javascript Engine V8", "id": "javascript-engine-v8", "permalink": "/categories/javascript-engine-v8/" }, { "title": "V8 Embedding Basics", "id": "v8-embedding-basics", "permalink": "/categories/v8-embedding-basics/" } ] }, { "title": "V8 Embedding - 函数传参、返回、异常处理", "frontmatter": { "title": "V8 Embedding - 函数传参、返回、异常处理", "date": "2018-08-05T21:07:07.000Z", "tags": [ "V8", "javascript", "Node.js", "C/C++" ], "categories": [ "Javascript Engine V8", "V8 Embedding Basics" ] }, "regularPath": "/v8/expose-cpp-func-params.html", "relativePath": "v8/expose-cpp-func-params.md", "key": "v-1d2c7664", "path": "/v8/expose-cpp-func-params.html", "headers": [ { "level": 2, "title": "目标", "slug": "目标" }, { "level": 2, "title": "代码 & 说明", "slug": "代码-说明" }, { "level": 3, "title": "编译", "slug": "编译" }, { "level": 3, "title": "执行", "slug": "执行" }, { "level": 3, "title": "说明", "slug": "说明" }, { "level": 2, "title": "相关链接", "slug": "相关链接" } ], "excerpt": "<h2 id=\"目标\"><a class=\"header-anchor\" href=\"#目标\">#</a> 目标</h2>\n<p>上一篇我们只是简单的把 C++ 环境中的函数暴露到 Javascript 环境中调用,这篇我们更进一步,学会操作函数参数、返回值以及 V8 异常处理。</p>\n<p>写一个简单 <code>Math.add()</code> 函数传给 js 环境,使以下代码可运行:</p>\n<!--beforebegin--><div class=\"language-js line-numbers-mode\"><!--afterbegin--><pre v-pre class=\"language-js\"><code><span class=\"token comment\">// app.js</span>\n<span class=\"token keyword\">const</span> a <span class=\"token operator\">=</span> <span class=\"token number\">1023</span>\n<span class=\"token keyword\">const</span> b <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\n<span class=\"token keyword\">const</span> sum <span class=\"token operator\">=</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">)</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>sum<span class=\"token punctuation\">)</span>\n</code></pre>\n<div class=\"line-numbers-wrapper\"><span class=\"line-number\">1</span><br><span class=\"line-number\">2</span><br><span class=\"line-number\">3</span><br><span class=\"line-number\">4</span><br><span class=\"line-number\">5</span><br></div><!--beforeend--></div><!--afterend-->", "size": "3526", "categories": [ { "title": "Javascript Engine V8", "id": "javascript-engine-v8", "permalink": "/categories/javascript-engine-v8/" }, { "title": "V8 Embedding Basics", "id": "v8-embedding-basics", "permalink": "/categories/v8-embedding-basics/" } ] }, { "title": "V8 Embedding - Hello World 讲解", "frontmatter": { "title": "V8 Embedding - Hello World 讲解", "date": "2018-08-02T23:47:14.000Z", "tags": [ "V8", "javascript", "Node.js", "C/C++" ], "categories": [ "Javascript Engine V8", "V8 Embedding Basics" ] }, "regularPath": "/v8/v8-embedding-hello-world.html", "relativePath": "v8/v8-embedding-hello-world.md", "key": "v-57835864", "path": "/v8/v8-embedding-hello-world.html", "headers": [ { "level": 3, "title": "示例代码", "slug": "示例代码" }, { "level": 3, "title": "V8 重要概念", "slug": "v8-重要概念" }, { "level": 3, "title": "参考链接", "slug": "参考链接" } ], "excerpt": "<p>通过一个 Hello World 示例来介绍 V8 的几个重要概念。</p>\n<p>这个示例代码是基于 V8 (7.1) 的,要编译这个示例请查看 {% post_link v8/compile-v8 Javascript Engine V8 Embedding - 编译 %}</p>\n", "size": "2328", "categories": [ { "title": "Javascript Engine V8", "id": "javascript-engine-v8", "permalink": "/categories/javascript-engine-v8/" }, { "title": "V8 Embedding Basics", "id": "v8-embedding-basics", "permalink": "/categories/v8-embedding-basics/" } ] }, { "frontmatter": { "layout": "CategoryLayout", "category_id": "flutter", "$all_categories": [ { "title": "Flutter", "id": "flutter", "permalink": "/categories/flutter/", "count": 2 }, { "title": "CI/CD", "id": "ci-cd", "permalink": "/categories/ci-cd/", "count": 7 }, { "title": "Github Actions", "id": "github-actions", "permalink": "/categories/github-actions/", "count": 2 }, { "title": "GitLab CI/CD", "id": "gitlab-ci-cd", "permalink": "/categories/gitlab-ci-cd/", "count": 5 }, { "title": "Javascript", "id": "javascript", "permalink": "/categories/javascript/", "count": 3 }, { "title": "Node.js 源码分析", "id": "node-js-源码分析", "permalink": "/categories/node-js-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/", "count": 4 }, { "title": "Javascript Engine V8", "id": "javascript-engine-v8", "permalink": "/categories/javascript-engine-v8/", "count": 7 }, { "title": "V8 Embedding Basics", "id": "v8-embedding-basics", "permalink": "/categories/v8-embedding-basics/", "count": 7 }, { "title": "ffmpeg", "id": "ffmpeg", "permalink": "/categories/ffmpeg/", "count": 1 } ] }, "regularPath": "/categories/flutter/", "key": "v-0ed18a9e", "path": "/categories/flutter/", "categories": [] }, { "frontmatter": { "layout": "CategoryLayout", "category_id": "ci-cd", "$all_categories": [ { "title": "Flutter", "id": "flutter", "permalink": "/categories/flutter/", "count": 2 }, { "title": "CI/CD", "id": "ci-cd", "permalink": "/categories/ci-cd/", "count": 7 }, { "title": "Github Actions", "id": "github-actions", "permalink": "/categories/github-actions/", "count": 2 }, { "title": "GitLab CI/CD", "id": "gitlab-ci-cd", "permalink": "/categories/gitlab-ci-cd/", "count": 5 }, { "title": "Javascript", "id": "javascript", "permalink": "/categories/javascript/", "count": 3 }, { "title": "Node.js 源码分析", "id": "node-js-源码分析", "permalink": "/categories/node-js-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/", "count": 4 }, { "title": "Javascript Engine V8", "id": "javascript-engine-v8", "permalink": "/categories/javascript-engine-v8/", "count": 7 }, { "title": "V8 Embedding Basics", "id": "v8-embedding-basics", "permalink": "/categories/v8-embedding-basics/", "count": 7 }, { "title": "ffmpeg", "id": "ffmpeg", "permalink": "/categories/ffmpeg/", "count": 1 } ] }, "regularPath": "/categories/ci-cd/", "key": "v-1e8e06b6", "path": "/categories/ci-cd/", "categories": [] }, { "frontmatter": { "layout": "CategoryLayout", "category_id": "github-actions", "$all_categories": [ { "title": "Flutter", "id": "flutter", "permalink": "/categories/flutter/", "count": 2 }, { "title": "CI/CD", "id": "ci-cd", "permalink": "/categories/ci-cd/", "count": 7 }, { "title": "Github Actions", "id": "github-actions", "permalink": "/categories/github-actions/", "count": 2 }, { "title": "GitLab CI/CD", "id": "gitlab-ci-cd", "permalink": "/categories/gitlab-ci-cd/", "count": 5 }, { "title": "Javascript", "id": "javascript", "permalink": "/categories/javascript/", "count": 3 }, { "title": "Node.js 源码分析", "id": "node-js-源码分析", "permalink": "/categories/node-js-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/", "count": 4 }, { "title": "Javascript Engine V8", "id": "javascript-engine-v8", "permalink": "/categories/javascript-engine-v8/", "count": 7 }, { "title": "V8 Embedding Basics", "id": "v8-embedding-basics", "permalink": "/categories/v8-embedding-basics/", "count": 7 }, { "title": "ffmpeg", "id": "ffmpeg", "permalink": "/categories/ffmpeg/", "count": 1 } ] }, "regularPath": "/categories/github-actions/", "key": "v-0c56e09e", "path": "/categories/github-actions/", "categories": [] }, { "frontmatter": { "layout": "CategoryLayout", "category_id": "gitlab-ci-cd", "$all_categories": [ { "title": "Flutter", "id": "flutter", "permalink": "/categories/flutter/", "count": 2 }, { "title": "CI/CD", "id": "ci-cd", "permalink": "/categories/ci-cd/", "count": 7 }, { "title": "Github Actions", "id": "github-actions", "permalink": "/categories/github-actions/", "count": 2 }, { "title": "GitLab CI/CD", "id": "gitlab-ci-cd", "permalink": "/categories/gitlab-ci-cd/", "count": 5 }, { "title": "Javascript", "id": "javascript", "permalink": "/categories/javascript/", "count": 3 }, { "title": "Node.js 源码分析", "id": "node-js-源码分析", "permalink": "/categories/node-js-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/", "count": 4 }, { "title": "Javascript Engine V8", "id": "javascript-engine-v8", "permalink": "/categories/javascript-engine-v8/", "count": 7 }, { "title": "V8 Embedding Basics", "id": "v8-embedding-basics", "permalink": "/categories/v8-embedding-basics/", "count": 7 }, { "title": "ffmpeg", "id": "ffmpeg", "permalink": "/categories/ffmpeg/", "count": 1 } ] }, "regularPath": "/categories/gitlab-ci-cd/", "key": "v-78f8833b", "path": "/categories/gitlab-ci-cd/", "categories": [] }, { "frontmatter": { "layout": "CategoryLayout", "category_id": "javascript", "$all_categories": [ { "title": "Flutter", "id": "flutter", "permalink": "/categories/flutter/", "count": 2 }, { "title": "CI/CD", "id": "ci-cd", "permalink": "/categories/ci-cd/", "count": 7 }, { "title": "Github Actions", "id": "github-actions", "permalink": "/categories/github-actions/", "count": 2 }, { "title": "GitLab CI/CD", "id": "gitlab-ci-cd", "permalink": "/categories/gitlab-ci-cd/", "count": 5 }, { "title": "Javascript", "id": "javascript", "permalink": "/categories/javascript/", "count": 3 }, { "title": "Node.js 源码分析", "id": "node-js-源码分析", "permalink": "/categories/node-js-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/", "count": 4 }, { "title": "Javascript Engine V8", "id": "javascript-engine-v8", "permalink": "/categories/javascript-engine-v8/", "count": 7 }, { "title": "V8 Embedding Basics", "id": "v8-embedding-basics", "permalink": "/categories/v8-embedding-basics/", "count": 7 }, { "title": "ffmpeg", "id": "ffmpeg", "permalink": "/categories/ffmpeg/", "count": 1 } ] }, "regularPath": "/categories/javascript/", "key": "v-417c2884", "path": "/categories/javascript/", "categories": [] }, { "frontmatter": { "layout": "CategoryLayout", "category_id": "node-js-源码分析", "$all_categories": [ { "title": "Flutter", "id": "flutter", "permalink": "/categories/flutter/", "count": 2 }, { "title": "CI/CD", "id": "ci-cd", "permalink": "/categories/ci-cd/", "count": 7 }, { "title": "Github Actions", "id": "github-actions", "permalink": "/categories/github-actions/", "count": 2 }, { "title": "GitLab CI/CD", "id": "gitlab-ci-cd", "permalink": "/categories/gitlab-ci-cd/", "count": 5 }, { "title": "Javascript", "id": "javascript", "permalink": "/categories/javascript/", "count": 3 }, { "title": "Node.js 源码分析", "id": "node-js-源码分析", "permalink": "/categories/node-js-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/", "count": 4 }, { "title": "Javascript Engine V8", "id": "javascript-engine-v8", "permalink": "/categories/javascript-engine-v8/", "count": 7 }, { "title": "V8 Embedding Basics", "id": "v8-embedding-basics", "permalink": "/categories/v8-embedding-basics/", "count": 7 }, { "title": "ffmpeg", "id": "ffmpeg", "permalink": "/categories/ffmpeg/", "count": 1 } ] }, "regularPath": "/categories/node-js-%25E6%25BA%2590%25E7%25A0%2581%25E5%2588%2586%25E6%259E%2590/", "key": "v-6840f1f7", "path": "/categories/node-js-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/", "categories": [] }, { "frontmatter": { "layout": "CategoryLayout", "category_id": "javascript-engine-v8", "$all_categories": [ { "title": "Flutter", "id": "flutter", "permalink": "/categories/flutter/", "count": 2 }, { "title": "CI/CD", "id": "ci-cd", "permalink": "/categories/ci-cd/", "count": 7 }, { "title": "Github Actions", "id": "github-actions", "permalink": "/categories/github-actions/", "count": 2 }, { "title": "GitLab CI/CD", "id": "gitlab-ci-cd", "permalink": "/categories/gitlab-ci-cd/", "count": 5 }, { "title": "Javascript", "id": "javascript", "permalink": "/categories/javascript/", "count": 3 }, { "title": "Node.js 源码分析", "id": "node-js-源码分析", "permalink": "/categories/node-js-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/", "count": 4 }, { "title": "Javascript Engine V8", "id": "javascript-engine-v8", "permalink": "/categories/javascript-engine-v8/", "count": 7 }, { "title": "V8 Embedding Basics", "id": "v8-embedding-basics", "permalink": "/categories/v8-embedding-basics/", "count": 7 }, { "title": "ffmpeg", "id": "ffmpeg", "permalink": "/categories/ffmpeg/", "count": 1 } ] }, "regularPath": "/categories/javascript-engine-v8/", "key": "v-44502de4", "path": "/categories/javascript-engine-v8/", "categories": [] }, { "frontmatter": { "layout": "CategoryLayout", "category_id": "v8-embedding-basics", "$all_categories": [ { "title": "Flutter", "id": "flutter", "permalink": "/categories/flutter/", "count": 2 }, { "title": "CI/CD", "id": "ci-cd", "permalink": "/categories/ci-cd/", "count": 7 }, { "title": "Github Actions", "id": "github-actions", "permalink": "/categories/github-actions/", "count": 2 }, { "title": "GitLab CI/CD", "id": "gitlab-ci-cd", "permalink": "/categories/gitlab-ci-cd/", "count": 5 }, { "title": "Javascript", "id": "javascript", "permalink": "/categories/javascript/", "count": 3 }, { "title": "Node.js 源码分析", "id": "node-js-源码分析", "permalink": "/categories/node-js-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/", "count": 4 }, { "title": "Javascript Engine V8", "id": "javascript-engine-v8", "permalink": "/categories/javascript-engine-v8/", "count": 7 }, { "title": "V8 Embedding Basics", "id": "v8-embedding-basics", "permalink": "/categories/v8-embedding-basics/", "count": 7 }, { "title": "ffmpeg", "id": "ffmpeg", "permalink": "/categories/ffmpeg/", "count": 1 } ] }, "regularPath": "/categories/v8-embedding-basics/", "key": "v-afefd432", "path": "/categories/v8-embedding-basics/", "categories": [] }, { "frontmatter": { "layout": "CategoryLayout", "category_id": "ffmpeg", "$all_categories": [ { "title": "Flutter", "id": "flutter", "permalink": "/categories/flutter/", "count": 2 }, { "title": "CI/CD", "id": "ci-cd", "permalink": "/categories/ci-cd/", "count": 7 }, { "title": "Github Actions", "id": "github-actions", "permalink": "/categories/github-actions/", "count": 2 }, { "title": "GitLab CI/CD", "id": "gitlab-ci-cd", "permalink": "/categories/gitlab-ci-cd/", "count": 5 }, { "title": "Javascript", "id": "javascript", "permalink": "/categories/javascript/", "count": 3 }, { "title": "Node.js 源码分析", "id": "node-js-源码分析", "permalink": "/categories/node-js-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/", "count": 4 }, { "title": "Javascript Engine V8", "id": "javascript-engine-v8", "permalink": "/categories/javascript-engine-v8/", "count": 7 }, { "title": "V8 Embedding Basics", "id": "v8-embedding-basics", "permalink": "/categories/v8-embedding-basics/", "count": 7 }, { "title": "ffmpeg", "id": "ffmpeg", "permalink": "/categories/ffmpeg/", "count": 1 } ] }, "regularPath": "/categories/ffmpeg/", "key": "v-78f2d8a8", "path": "/categories/ffmpeg/", "categories": [] }, { "frontmatter": { "layout": "CategoryLayout", "$all_categories": [ { "title": "CI/CD", "id": "ci-cd", "permalink": "/categories/ci-cd/", "count": 7 }, { "title": "Javascript Engine V8", "id": "javascript-engine-v8", "permalink": "/categories/javascript-engine-v8/", "count": 7 }, { "title": "V8 Embedding Basics", "id": "v8-embedding-basics", "permalink": "/categories/v8-embedding-basics/", "count": 7 }, { "title": "GitLab CI/CD", "id": "gitlab-ci-cd", "permalink": "/categories/gitlab-ci-cd/", "count": 5 }, { "title": "Node.js 源码分析", "id": "node-js-源码分析", "permalink": "/categories/node-js-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/", "count": 4 }, { "title": "Javascript", "id": "javascript", "permalink": "/categories/javascript/", "count": 3 }, { "title": "Flutter", "id": "flutter", "permalink": "/categories/flutter/", "count": 2 }, { "title": "Github Actions", "id": "github-actions", "permalink": "/categories/github-actions/", "count": 2 }, { "title": "ffmpeg", "id": "ffmpeg", "permalink": "/categories/ffmpeg/", "count": 1 } ], "category_id": false }, "regularPath": "/categories/", "key": "v-ef9325c4", "path": "/categories/", "categories": [] } ], "themeConfig": { "logo": "/img/logo-w.png", "nav": [ { "text": "主页", "link": "/", "type": "link", "items": [] }, { "text": "博客", "link": "/categories/", "type": "link", "items": [] } ], "sidebar": { "/nodejs-src/": [ "", "the-main", "register-builtin-modules", "bootstrap-js" ], "/v8/": [ "", "compile-v8", "v8-embedding-hello-world", "expose-cpp-var", "expose-cpp-function", "expose-cpp-func-params", "expose-cpp-func-callback" ], "/gitlab-ci/": [ "", "example-web-front-end", "example-node-js", "example-docker-ssh-deploy", "example-db-sync" ], "/github-actions/": [ "npm-publish", "ssh-deploy" ], "/\bjavascript/": [ "constructor-bind-call-apply", "deep-into-async-await", "diy-simple-promise-js" ], "/flutter-embedding/": [ "", "embed-with-android", "embed-with-ios" ] }, "sidebarDepth": 4, "displayAllHeaders": false } }

联系我们
联系电话:17681177133
联系邮箱:admin@zhuo-zhuo.com
公司地址:合肥市高新区习友路2666号 (习友路和石莲南路交叉口西北角)二期304室
官网
博客
皖ICP备20009670号-2
合肥灼灼信息技术有限公司 | Copyright © 2020-present zhuo-zhuo.com