{"success":true,"data":[{"id":"639ebb35f0ccae2b10e0fb64","author_id":"56f3686f02c237a73a1a8acf","tab":"share","content":"<div class=\"markdown-text\"><p>CNode TG Channel 开启 !</p>\n<p>Channel 将定期推送最新技术文章、资讯以及活动，欢迎订阅！</p>\n<p><a href=\"https://t.me/cnode_js\">https://t.me/cnode_js</a></p>\n<p><img src=\"//static.cnodejs.org/FkwbDvoUIeRAccpPd6f53rgXwrDz\" alt=\"qrcode_tg_channel_cnode.png\"></p>\n<blockquote>\n<p>Tips: 订阅后点击 “设置- View Discussion” 即可加入交流群!</p>\n</blockquote>\n</div>","title":"CNode - TG 频道","last_reply_at":"2026-01-31T12:35:39.880Z","good":false,"top":true,"reply_count":41,"visit_count":291095,"create_at":"2022-12-18T07:03:17.900Z","author":{"loginname":"thonatos","avatar_url":"https://avatars.githubusercontent.com/u/958063?v=4&s=120"}},{"id":"6262718079f90d94a6a0d2f5","author_id":"4f447c2f0a8abae26e01b27d","tab":"share","content":"<div class=\"markdown-text\"><h2>概述</h2>\n<p>Node.js 刚刚发布了 18.0.0 版本，内置了 <code>fetch</code>、<code>node:test</code> 等标准模块。</p>\n<p><strong>一句话点评：std lib 在标准化，user lib 在精细化。</strong></p>\n<blockquote>\n<p>原文地址：<a href=\"https://zhuanlan.zhihu.com/p/502951532\">EggJS 知乎专栏</a>，求点赞。</p>\n</blockquote>\n<hr>\n<h2>如何快速体验</h2>\n<p>推荐用 <a href=\"https://github.com/Schniz/fnm\">fnm</a>，<a href=\"https://github.com/jasongin/nvs\">nvs</a>，<a href=\"https://github.com/nvm-sh/nvm\">nvm</a> 等 Node.js 版本管理器。</p>\n<pre class=\"prettyprint language-bash\"><code>$ fnm install 18\nInstalling Node v18.0.0 (arm64)\n\n$ fnm use 18\nUsing Node v18.0.0\n\n$ node -v\nv18.0.0\n</code></pre><p>需要注意的是，该版本不是 LTS 版本，请勿在生产环境使用，需要等到 2022-10-25 才会成为 LTS 版本。</p>\n<p><img src=\"https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/012135a1091b40ef807c8b6e3919bcce~tplv-k3u1fbpfcp-zoom-1.image\" alt=\"image.png\" title=\"https://github.com/nodejs/Release\"></p>\n<h2>Looking to the future</h2>\n<blockquote>\n<p>The project is also continuing its ‘Next 10’ effort.  The goal of this effort is to reflect on what led to success in the first 10 years of Node.js and set the direction for success in the next 10.</p>\n</blockquote>\n<p>Node.js 官方启动了 <a href=\"https://github.com/nodejs/next-10\">next-10</a> 工作，并讨论出了<a href=\"https://github.com/nodejs/node/blob/master/doc/contributing/technical-priorities.md\">未来重要的几件事</a>：</p>\n<ul>\n<li>现代化的 HTTP</li>\n<li>友好的类型支持</li>\n<li>对初学者更友好的渐进式文档</li>\n<li>对 ECMAScript 规范的支持和及时跟进</li>\n<li>可观测性，包括 logging/metrics/tracing，以及 APM 等</li>\n<li>更好的多线程支持</li>\n<li>支持打包为单文件的分发方式</li>\n</ul>\n<p>譬如前面说的 Fetch 就和 Modern HTTP 的会议讨论有关，<a href=\"https://github.com/nodejs/next-10/blob/main/meetings/summit-jan-2022.md\">相关纪要</a>。</p>\n<blockquote>\n<p>6 月份的 OpenJS World 会议中将分享 ESM 和 Observability 进展，可以关注下相关动态。</p>\n</blockquote>\n<hr>\n<h2>Fetch API</h2>\n<p>前端同学应该都很熟悉<code>fetch()</code>这个 API，它提供了标准的网络请求能力，取代了远古的  XMLHttpRequest 。</p>\n<p>反观 Node.js 侧，官方提供的 <a href=\"https://nodejs.org/dist/latest-v18.x/docs/api/http.html#httprequesturl-options-callback\">http.request()</a>，太底层太基础了，用起来往往需要大量的封装。譬如 302 后自动跳转、文件上传、响应结果解析等等。</p>\n<p>因此在 Node.js 社区有非常多的上层请求库封装：</p>\n<ul>\n<li>曾经广受社区欢迎的 request 库去年<a href=\"https://github.com/request/request/issues/3142\">宣布停止维护</a>后，也引起了社区比较大的混乱。。</li>\n<li>我们 Egg 内置的是 <a href=\"https://www.npmjs.com/package/urllib\">urllib</a>，沉淀了阿里多年在网络请求上踩的坑，足够稳定，不过代码也有点久远了。</li>\n<li>更多参见 <a href=\"https://github.com/request/request/issues/3143\">Alternative libraries to request</a> 以及 <a href=\"https://zhuanlan.zhihu.com/p/415361629\">《天猪：那些你应该说再见的 npm 祖传老库》</a>。</li>\n</ul>\n<p><strong>去年 Node.js 官方推出了 <strong><a href=\"https://undici.nodejs.org/\"><strong>undici</strong></a></strong>，一个非常现代化的库，具备优越的性能，良好的扩展性，内置的 mock 等能力，集大成者。</strong></p>\n<blockquote>\n<p>undici 的命名也很有趣：A HTTP/1.1 client → 11 → Eleven → Undici，即意大利语的 11。</p>\n</blockquote>\n<p>从而 <strong>Node.js 终于内置了新的请求库</strong>，它遵循 <a href=\"https://fetch.spec.whatwg.org/\">Fetch 规范</a>，底层就是基于 undici 来实现的。</p>\n<pre class=\"prettyprint language-javascript\"><code>const res = await fetch(&#x27;https:&#x2F;&#x2F;nodejs.org&#x2F;api&#x2F;documentation.json&#x27;);\nif (res.ok) {\n  const data = await res.json();\n  console.log(data);\n}\n</code></pre><p>就这么简单，比 <a href=\"https://nodejs.org/dist/latest-v18.x/docs/api/http.html#httprequesturl-options-callback\">http.request()</a> 那一坨 callback-style 代码简洁多了，平时写个脚本啥的，不用再引入额外的类库了。</p>\n<p>全局增加了 fetch, FormData, Headers, Request, Response 这几个 API，以及 Web Streams API。</p>\n<p>目前还处于默认开启的实验性特性阶段，文档在 <a href=\"https://nodejs.org/dist/latest-v18.x/docs/api/globals.html#fetch\">Globals</a> 章节，近乎没有，有需要直接看 <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API\">MDN 文档</a> 即可。</p>\n<p>可能是为了遵循规范， undici 的很多能力如 Mock，Proxy，Pool 等都没有提供出来。</p>\n<hr>\n<h2>Test Runner</h2>\n<p>单元测试很重要，很多新兴的编程语言都是会内置对应的能力，但前端这块一直都是由社区来实现，前端同学耳熟能详的 Test Runner 有 <a href=\"https://mochajs.org/\">Mocha</a>、<a href=\"https://jestjs.io/\">Jest</a>。</p>\n<pre class=\"prettyprint language-javascript\"><code>&#x2F;&#x2F; mocha showcase\nimport assert from &#x27;assert&#x2F;strict&#x27;;\n\ndescribe(&#x27;test&#x2F;index.test.js&#x27;, () =&gt; {\n  it(&#x27;test1&#x27;, async () =&gt; {\n    const res = await fetch(&#x27;https:&#x2F;&#x2F;nodejs.org&#x2F;api&#x2F;documentation.json&#x27;);\n    assert(res.ok);\n  });\n  \n  it.skip(&#x27;skip some test&#x27;, () =&gt; {});\n});\n</code></pre><p>终于，Node.js 在 18.x 里官方支持了 <a href=\"https://nodejs.org/dist/latest-v18.x/docs/api/test.html\">Test 能力</a>：</p>\n<pre class=\"prettyprint language-javascript\"><code>import test from &#x27;node:test&#x27;;\nimport assert from &#x27;assert&#x2F;strict&#x27;;\n\n&#x2F;&#x2F; 等价于 describe()\ntest(&#x27;asynchronous passing test&#x27;, async () =&gt; {\n  const res = await fetch(&#x27;https:&#x2F;&#x2F;nodejs.org&#x2F;api&#x2F;documentation.json&#x27;);\n  assert(res.ok);\n});\n\ntest(&#x27;multi level test&#x27;, async (t) =&gt; {\n  &#x2F;&#x2F; 等价于 it()\n  await t.test(&#x27;subtest 1&#x27;, (t) =&gt; {\n    assert.strictEqual(1, 1);\n  });\n\n  await t.test(&#x27;subtest 2&#x27;, (t) =&gt; {\n    assert.strictEqual(2, 2);\n  });\n});\n\n&#x2F;&#x2F; 等价于 describe.skip() &#x2F; it.skip()\ntest(&#x27;skip option&#x27;, { skip: true }, () =&gt; {});\n\n&#x2F;&#x2F; 等价于 describe.only() &#x2F; it.only()\ntest(&#x27;only option&#x27;, { only: true }, () =&gt; {});\n</code></pre><p>可以看到：</p>\n<ul>\n<li>语法其实差不多，会更简洁一点，就一个 <code>test()</code>，options 除了 skip 和 only 外，还支持 concurrency 并发。</li>\n<li>无需启动器，每一个文件都是一个可执行的 Node.js 代码。</li>\n<li>暂未支持 <code>before/after/beforeEach/afterEach</code> 能力，看 issue 描述会后续支持。</li>\n<li>暂未支持 Reporter，但日志输出为标准 <a href=\"https://testanything.org/\">TAP</a> 格式，所以应该很容易能复用现有的社区生态。</li>\n</ul>\n<p>类似覆盖率的演进过程，以前我们需要通过 nyc 对代码转译打桩，现在变为的 Node.js 内置覆盖率输出，nyc 变为 c8 这样的覆盖率报告生成工具。</p>\n<p>后续 mocha 等估计会变为类似的上层封装，提供批量执行 和 Reporter 等能力。</p>\n<hr>\n<h2>Build-time user-land snapshot</h2>\n<p>简单的说，可以把某个 js 直接编译成 v8 snapshot，从而可以极大的提速启动时间。</p>\n<p>目前这个版本，还只能通过 Node.js 源码来编译，且只能编译成 Node.js Runtime 的方式，即 Build-time。</p>\n<pre class=\"prettyprint language-bash\"><code># 把一段 markdown 渲染的逻辑，直接打包到 Node Runtime\n$ cd &#x2F;path&#x2F;to&#x2F;node&#x2F;source\n$ .&#x2F;configure --node-snapshot-main=marked.js\n$ make node\n\n# 执行编译好的 Node Runtime\n$ out&#x2F;Release&#x2F;node\n&gt; const html = globalThis.marked(&#x27;# this is title&#x27;);\n</code></pre><p>秋怡正在继续推进<a href=\"https://github.com/nodejs/node/issues/35711\">该能力</a>，未来可以无需编译 Node.js 源码：</p>\n<pre class=\"prettyprint language-bash\"><code>$ node --build-snapshot --snapshot-blob marked.blob marked.js \n$ node --snapshot-blob marked.blob\n</code></pre><p>PS：这个能力用在命令行 CLI 的独立打包好像也不错。<a href=\"https://github.com/nodejs/node/issues/42566\">https://github.com/nodejs/node/issues/42566</a></p>\n<hr>\n<h2>V8 引擎升级</h2>\n<p>内置的 V8 引擎升级到 10.1 版本，值得注意的特性：</p>\n<ul>\n<li>class fields 和 private class methods 的性能优化。</li>\n<li><a href=\"https://v8.dev/blog/v8-release-99#intl.locale-extensions\">Intl 规范</a> 的支持，在做日期的本地化，字符串处理的时候非常有用。</li>\n<li>数组支持 findLast() 和 findLastIndex() 等。</li>\n</ul>\n<p>秋怡也写了一篇文章 <a href=\"https://v8.dev/blog/faster-class-features\">Faster initialization of instances with new class features</a> 分享了背后的实现。</p>\n<p>PS：<a href=\"https://mp.weixin.qq.com/s/6PTcjJQTED3WpJH8ToXInw\">ECMAScript 双月报告：装饰器提案进入 Stage 3</a> ，阿里的 Node 架构团队今年会推动 Decorator 方案在 V8 的落地实现，不过肯定赶不上了，只能 Node.js 20.x 见了。</p>\n<hr>\n<h2>ESM 的支持</h2>\n<p>虽然在 18.x 中没有新的内容，但在过去的几个月中一直在持续推动 ECMAScript模块实现：</p>\n<ul>\n<li>对 <a href=\"https://github.com/tc39/proposal-import-assertions\">JSON Import Assertions</a> 的支持。</li>\n<li>JSON 模块的正式支持。</li>\n<li>对 HTTPS 和 HTTP 导入的实验性支持。</li>\n<li><a href=\"https://github.com/nodejs/loaders\">Node.js 加载器团队</a>也在继续开发 ECMAScript 模块加载器实现。</li>\n</ul>\n<hr>\n<h2>工具链和编译器的升级</h2>\n<ul>\n<li>Linux 版是在 RHEL8 上构建的，要求 glibc 2.28 以上版本。</li>\n<li>macOS 要求 10.15 以上版本。</li>\n<li>Windows 很多旧版本也不支持了。</li>\n</ul>\n<p>PS：CentOS 7 官方不再维护了，它对应的 glibc 版本太低，所以升不了。。。</p>\n<ul>\n<li><a href=\"https://developer.aliyun.com/article/780803\">centos7和8不维护停止更新之后，服务器选择使用什么系统好？</a></li>\n<li><a href=\"https://github.com/nodejs/node/pull/42659\">doc: update minimum glibc requirements for Linux by richardlau</a></li>\n</ul>\n<hr>\n<h2>相关资料</h2>\n<ul>\n<li><a href=\"https://nodejs.org/en/blog/announcements/v18-release-announce\">https://nodejs.org/en/blog/announcements/v18-release-announce</a></li>\n<li><a href=\"https://nodejs.org/en/blog/release/v18.0.0/\">https://nodejs.org/en/blog/release/v18.0.0/</a></li>\n</ul>\n</div>","title":"Node.js 18 新特性解读","last_reply_at":"2026-01-12T14:06:02.655Z","good":false,"top":true,"reply_count":37,"visit_count":139759,"create_at":"2022-04-22T09:12:32.716Z","author":{"loginname":"atian25","avatar_url":"https://avatars.githubusercontent.com/u/227713?v=4&s=120"}},{"id":"5fdb44d70f99cb37f45e3410","author_id":"56f3686f02c237a73a1a8acf","tab":"share","content":"<div class=\"markdown-text\"><p>RT.</p>\n<p>请大家遵守法律法规，勿发布不合规内容。</p>\n<ul>\n<li>2021/11/26：针对部分打擦边球的推广行为（如各种云服务商的推广链接），将会对账户做出屏蔽处理。</li>\n<li>2021/11/26：针对机器人频繁发布广告与违规内容，新增发帖限制如下：新用户五天内不允许发帖（不影响回帖）。</li>\n</ul>\n</div>","title":"【2021/11/26】请大家遵纪守法，勿发布不合规内容","last_reply_at":"2026-01-12T01:08:48.744Z","good":false,"top":true,"reply_count":292,"visit_count":241112,"create_at":"2020-12-17T11:45:27.667Z","author":{"loginname":"thonatos","avatar_url":"https://avatars.githubusercontent.com/u/958063?v=4&s=120"}},{"id":"61f69e4aa08b39f75309c2a8","author_id":"4efc278525fa69ac6900000f","tab":"share","content":"<div class=\"markdown-text\"><p><a href=\"https://registry.npmmirror.com\">https://registry.npmmirror.com</a> npmmirror 镜像站在2013年12月开始就使用基于 koa 的 <a href=\"https://github.com/cnpm/cnpmjs.org\">https://github.com/cnpm/cnpmjs.org</a> 私有 npm 应用搭建，这些年 node 应用框架在快速换代升级，连我们自己造的 egg 都要升级到 TypeScript 了，所以在 2021 年我们启动了 <a href=\"http://cnpmjs.org\">cnpmjs.org</a> 的技术升级重构，基于 egg 的 TypeScript 模式重新实现 <a href=\"https://github.com/cnpm/cnpmcore\">https://github.com/cnpm/cnpmcore</a> 。</p>\n<p>npm registry 的接口是 100% 实现迁移，然后在数据同步上通过数据库实现足够简单的任务系统，已经在 2022年1月30日完全老数据迁移。\n非常感谢阿里云这么多年来的对中国 npm 镜像云服务器的开源赞助，只能靠仅有的广告位和每年的感谢帖子来回报这份天价的云资源账单。这一次重构之后，我们验证下来至少可以节省一半的云服务器资源，也算是让阿里云的开源赞助可以减轻一些成本负担。</p>\n<p>当然 cnpmcore 不仅仅是为了技术升级，我们的核心新能力会跟随 npmfs 黑科技在 2022 年发布出来，到时候 npm install 的安装速度会在 cli 侧和 registry 侧同时发力，让 npm 模块安装速度在可预见的未来达到秒级。</p>\n<p>PS：预估你在此期间遇到包数据同步和丢失问题，请先手动同步一次，如果还是没有，请回帖反馈给我们。</p>\n</div>","title":"npmmirror 镜像站升级公告","last_reply_at":"2026-01-10T22:58:43.737Z","good":false,"top":true,"reply_count":138,"visit_count":222745,"create_at":"2022-01-30T14:18:50.170Z","author":{"loginname":"fengmk2","avatar_url":"https://avatars.githubusercontent.com/u/156269?v=4&s=120"}},{"id":"61dbd8fd994582918ef7d174","author_id":"54009f5ccd66f2eb37190485","tab":"share","content":"<div class=\"markdown-text\"><p>很多人觉得Node.js没有往年那么火了，事实上不是这样的，Node.js社区健康稳步的发展中，主要是从性能好向好用转变，在易用性上有很大提升，从Node.js源码更新的内容看，大抵如此。Node.js Diagnostics Working Group是近二年Node.js社区的重点工作组，Node.js 14版本之后的大部分功能特性都是这个工作组推动的。早在2015年，有2个跟踪工作组tracing WG 和事后分析工作组 postmortem WG，在2017年合并到Diagnostics WG。核心产出是async_hooks, profiling, tracing, dump debug, report等，都是在易用性和好用性上做提升。让每个Node.js开发者更低门槛的提升Node.js应用的开发体验。</p>\n<p>秦粤老师在《浮华过后的Node.js》分享里，也表达了同样观点，他用的是产品化平缓期，也是健康稳步的发展的意思。</p>\n<p><img src=\"//static.cnodejs.org/FqRK1Uehhaz3lFDF3oHeL97Z7zYm\" alt=\"image.png\"></p>\n<p>社区方面，Web框架已经没有多少空间，以特性取胜的框架，应该不会很多，比较期待Egg3。像fastify这种，修改Node.js机制，在性能领域深耕的框架，目前看是比较有作为的。pnpm是有创新的，但代码是有点可读性不太好。我更加喜欢rushstack对menorepo的改进，大规模编程范式还需要探索。除了去年提的midway-hooks，easy-monitor，看起来remix和morden算新，但还没有超出之前的范畴。</p>\n<p>下面结合《<a href=\"https://nodersurvey.github.io/reporters\">Node.js开发者2021报告</a>》内容，我们详细解读一下Node.js 2021年的情况。这份解读是根据冰森&amp;狼叔直播内容整理的，要点如下。\n​</p>\n<h3>1）开发框架变化较大，造轮子变少，TS变多，使用企业级框架变多</h3>\n<p>​</p>\n<p>去年express占比还非常高，今年企业级框架变多，尤其是大而全的框架更受欢迎。</p>\n<p><img src=\"//static.cnodejs.org/Fl-QFKuag-dvFGbx7Q45WabMH5d8\" alt=\"image.png\"></p>\n<p>Egg在国内普及率很高，而Midway和Nest增长较快，其实和TS普及有一定关系。\n​\n<img src=\"//static.cnodejs.org/FvoNa6PGZJN1ZaqZlmXZuRnNUI5_\" alt=\"image.png\">\n​</p>\n<h3>2）版本更新变化较大，从Node 12升级到Node 14，升级比较积极</h3>\n<p>​</p>\n<p>去年Node.js主要是使用Node 12，2021年Node 14占比将近一半，更新还是较快的。</p>\n<p><img src=\"//static.cnodejs.org/FpQcq4qzd9rl-R-VEXzLZAiVMPaa\" alt=\"image.png\">\n​</p>\n<h3>3）吐槽变多，意味着用的人变多，趋于成熟</h3>\n<p>​</p>\n<p>C++之父Bjarne Stroustrup说过：世界上只有两种编程语言,一种是整天被人骂的,还有一种是没人用的。\n​</p>\n<p>大家对Node.js吐槽变多，实际上是在应用场景上使用较多，不再是针对于某些特性而进行吹捧。回归理性，在真实应用场景上，分布广泛，核心围绕API和BFF层，CLI&amp;工具。\n​\n<img src=\"//static.cnodejs.org/FkEeeI7hvEdSMIyUNaKxnQx9pzcJ\" alt=\"image.png\"></p>\n<h3>4）出圈：年龄分布较去年比变大，使用工种也变得比较丰富。</h3>\n<p>除了应用场景上，分布广泛外，非前端意外的开发者相关角色也有很大比例的提升，比如架构师，技术总监，项目经理等都一定程度上使用Node.js。可以说Node.js走出了前端圈，面向更大群体提供服务。另外受访者的年龄分布也变大了，这和出圈是有直接关系的。\n​\n<img src=\"//static.cnodejs.org/FsnHAf1Map8P8i4bEAn89POQf_8E\" alt=\"image.png\"></p>\n<h3>5）使用困惑：性能优化，内存泄漏以及npm依赖</h3>\n<p>​</p>\n<p>以往对Node.js困惑最多的是异步流程控制，随着async/await的普及，这个问题已经慢慢在弱化。随着开发者使用Node.js深度增加，对性能优化，内存泄漏更为关注，这也是比较容易理解的。</p>\n<p><img src=\"//static.cnodejs.org/FkPiwL5U9kbNq1vUE1J8AQKn54z4\" alt=\"image.png\"></p>\n<p>​</p>\n<h3>6）未来：从业经验越高则越关注性能和 Serverless</h3>\n<p>​</p>\n<p>关注性能比较容易理解，关注Serverless最主要是的原因是Serverless可以做到低运维甚至是0运维。运维作为Node.js开发者必备技能，Serverless的出现使得很多非专业Node.js也能轻松搞定Node.js各种服务端场景。</p>\n<p><img src=\"//static.cnodejs.org/FjZSOZ1uO-Tqh8yTL2E4CtvMUFbN\" alt=\"image.png\"></p>\n<p><img src=\"//static.cnodejs.org/FshPaWkMvnMKMxJckqf0L-M5OYe1\" alt=\"image.png\"></p>\n<h3>推荐阅读</h3>\n<ul>\n<li>天猪《EggJS 的前世今生与未来》，比较期待Egg3，easy-monitor作者一君也加入Egg3项目组了 <a href=\"https://www.yuque.com/atian25/blog/egg-1to2to3\">https://www.yuque.com/atian25/blog/egg-1to2to3</a></li>\n<li>秦粤 《浮华过后的Node.js》链接稍后给出来</li>\n</ul>\n<h3>参考</h3>\n<ul>\n<li>原文  <a href=\"https://cnodejs.org/topic/6108bbc2a5d29d175c2d4208\">https://cnodejs.org/topic/6108bbc2a5d29d175c2d4208</a></li>\n<li>报告 <a href=\"https://nodersurvey.github.io/reporters\">https://nodersurvey.github.io/reporters</a></li>\n</ul>\n<p>如果大家想参与讨论，欢迎回复</p>\n</div>","title":"Node.js 2021年开发者报告解读：健康稳步的发展中","last_reply_at":"2025-09-24T08:00:32.947Z","good":false,"top":true,"reply_count":24,"visit_count":254265,"create_at":"2022-01-10T06:58:05.059Z","author":{"loginname":"i5ting","avatar_url":"https://avatars.githubusercontent.com/u/3118295?v=4&s=120"}},{"id":"634fa473d3061fe5e4e88d35","author_id":"516f989a6d38277306ae8c1b","tab":"share","content":"<div class=\"markdown-text\"><p>继 2019 年开源 Midway 框架之后，阿里一直在 Node.js 的前沿进行深度研究，除了加入 TC39 参与标准化建设，向上游 Node.js 项目持续贡献，与龙蜥社区合作优化之外，也在 Serverless 领域有了不小的成果。</p>\n<p>今天，向大家介绍我们最新的面向云原生场景，面向 Serverless 架构下的新产品， 代号 <strong>Noslate</strong>。</p>\n<h2>Noslate 是什么？</h2>\n<p>欢迎访问项目了解更多内容：<a href=\"https://github.com/noslate-project/noslate\">Noslate</a>\n<img src=\"https://gw.alicdn.com/imgextra/i4/O1CN01hh1Db41sqh60CiNhD_!!6000000005818-2-tps-1324-390.png\" alt=\"Noslate\">\nJavaScript 是开发者数量最庞大的编程语言，早些年 Node.js 等技术的出现，让 JavaScript 可以轻松地处理各类服务端任务。</p>\n<p>但随着云原生/Serverless 等新架构概念的引导，弹性效率成为了全新的架构设计目标。为了能够让 JavaScript 任务拥有更高的弹性效率，进而满足在泛终端、全栈交付等领域的效率期待。我们逐步深入探索的过程中逐渐形成了 Noslate Project，旨在提升云原生场景下 JavaScript 的被调度性能，解决诊断性黑盒问题。</p>\n<p>Noslate 它主要由三个子项目组成，分别体现了我们在提升 Javascript 任务弹性效率过程中碰到的问题以及解决方式：</p>\n<ol>\n<li>Node.js Distribution：初期针对函数计算冷启动场景优化，降低 Node.js 用户代码加载耗时，形成了针对性的 Node.js 发行版本。</li>\n<li>Noslate Workers：随着探索的深入，我们设计了面向轻量端云同构场景的 W3C Web-interoperable JavaScript 轻量化容器方案。在交付灵活度上和资源、执行效率上形成平衡，现在主要应用于中心化的 SSR 渲染等轻量任务场景，效果显著。</li>\n<li>Noslate Debugger：在落地业务过程中，我们发现在弹性效率提升后，对于异常和崩溃变得难以定位，得益于 Linux 系统 Coredump 机制的启发，我们设计了基于 Corefile 对问题进行离线诊断的 Noslate Debugger 产品，帮助用户实现问题的回溯和实时定位。</li>\n</ol>\n<p>简而言之，Noslate 目标是通过提供完整的技术产品方案， 将 JavaScript 打造成云原生时代最灵活的交付语言。</p>\n<h2>为什么开源？</h2>\n<p>一方面我们希望通过开源加强项目产品化程度；另一方面希望在社区中吸收更多的实践场景进而继续完善产品设计，也欢迎大家参与到项目中来。\n同时，依托阿里云龙蜥社区和 Anolis 操作系统的合作关系，我们得以在底层探索，实现技术的演进。</p>\n<h3>一、Noslate Workers</h3>\n<p><img src=\"https://gw.alicdn.com/imgextra/i4/O1CN01L6QLHh1NRjQD5l5PE_!!6000000001567-2-tps-1270-339.png\" alt=\"Noslate Workers\">\nW3C Web-interoperable 运行时 Aworker，提供了一个轻量，近乎 0 冷启动的 JavaScript Serverless 运行环境。通过它，可以轻松的在已有的架构中集成轻量化类 Serverless 的能力。\n<img src=\"https://gw.alicdn.com/imgextra/i2/O1CN015XmQ8e20OlsVamGdC_!!6000000006840-2-tps-1729-672.png\" alt=\"Noslate Workers 架构\">\n与传统的 FaaS 架构不同，这是一个在普通应用容器之上的轻量任务单位。得益于良好的动态任务高密度混部和隔离特性、以及基于任务状态拷贝 API 带来的近乎 0 冷启动特性，可以实现任务的即用即启与即停即抛，进而无需关心在整个大集群中任务节点的编排问题。\n与既有架构的关系：\n<img src=\"https://gw.alicdn.com/imgextra/i3/O1CN01hwla1u1WSUch3qhT0_!!6000000002787-0-tps-3337-1879.jpg\" alt=\"弹性架构分层\">\nNoslate Workers 由两个主要组件组成：</p>\n<ol>\n<li>Aworker - 轻量、Web-interoperable JavaScript Runtime</li>\n<li>Noslated - Serverless 化的 Aworker 调度管控实现</li>\n</ol>\n<h4>关于 Aworker</h4>\n<p>提供 Web API 标准的 Web-interoperable JavaScript 运行时，适合不直接依赖系统接口的业务逻辑部署。 Aworker 实现了近似 <a href=\"https://www.w3.org/TR/service-workers/\">Service Worker API</a> 的规范，提供了基本的 <a href=\"https://www.w3.org/TR/service-workers/#fetchevent\">Request-Response</a> 服务 API。\n因为提供了相比于 Node.js 的 API 更加高层次、抽象的定义，不会泄漏系统底层状态，Aworker 通过 Startup Snapshot 和 Warmfork 能力， 实现了更快的水平及垂直扩容，能够在毫秒级启动并处理流量，具备更高的弹性效率。</p>\n<h5>亮点特性一、Warmfork</h5>\n<p>熟悉 Linux 系统编程的同学都知道 fork(2) 系统调用有几个优势：</p>\n<ol>\n<li>新进程可以继承母进程的当前状态，而无需从 main() 开始初始化；</li>\n<li>pcb、栈、内存页，页表都是纯内存复制，所以进程创建快 (&lt;1ms)；</li>\n<li>CopyOnWrite，新进程可以继承母进程的静态页表，可节省系统内存；</li>\n</ol>\n<p>对于 Node.js 来说，因为其无法在主线程持有所有多线程的状态 (如锁，信号量等)，所以 Node.js 进行 fork 的修改难度很大。其多线程设计主要 来源于 libuv 库和 V8 Platform Worker 线程：</p>\n<ol>\n<li>因部分 IO 操作存在同步调用，如 dns，文件读写等，所以 libuv 使用 IO 线程将同步操作转换成异步操作；</li>\n<li>Node.js 的 V8 默认配置为多线程 GC、Background Compilation/Optimization 的方式；</li>\n</ol>\n<p>Node.js 的单进程多线程模型可以由下图表示：\n<img src=\"https://gw.alicdn.com/imgextra/i1/O1CN01f3vkhU1gZxESjIBhq_!!6000000004157-2-tps-767-267.png\" alt=\"Node.js 单进程多线程模型\">\nAworker 的设计是采用单进程单线程的模型，也就是将上述模型中的 worker thread 单独抽出放到一独立进程中。Worker 因此可支持 fork，从而避免从 main() 开始的启动消耗，达到快速启动的目的。\n<img src=\"https://gw.alicdn.com/imgextra/i1/O1CN01vaKK3b1NniQw29c7a_!!6000000001615-2-tps-734-266.png\" alt=\"Aworker 单进程单线程模型\">\n为了支持单线程，Aworker 还做了如下修改：</p>\n<ol>\n<li>使用了 Linux AIO 特性替掉了 libuv 中同步的文件系统操作（不是 POSIX AIO，两者有区别。Posix AIO 类似于 libuv 现有的实现）；</li>\n<li>使用 V8 的 SingleThread 模式，这是一个给低端设备（Low-end devices）实现的能力，不过非常符合 Serverless 资源模型；</li>\n</ol>\n<p>而为了管理、隔离这些工作进程，我们设计了一个轻量的业务进程容器管理组件 Turf ，该组件能通过 Warmfork 方式创建新的 Aworker 服务进程，并能提供一定的资源、环境的隔离能力，同时兼容 OCI。区别于传统 runc, rund 的容器，turf 旨在承载如 Aworker 这类轻 JS Runtime，它无需镜像运行，开销更低，可以支持更高的部署密度。</p>\n<p>Warmfork 具体的对比：\n<img src=\"https://gw.alicdn.com/imgextra/i2/O1CN01cLR5kd1JGVFa2tPic_!!6000000001001-2-tps-480-391.png\" alt=\"warmfork\">\n提供 “被复制” 的进程，称为 “种子进程”，其他服务进程都是该进程的克隆。譬如 Aworker 作为种子进程，它需要确定自己一个 “可被克隆” 的时间点，将自己的所在状态（内存）作为克隆进程的初始状态。</p>\n<p>Warmfork 的系统时序如下：\n<img src=\"https://gw.alicdn.com/imgextra/i3/O1CN01dTl9w71ZcW8TdBOon_!!6000000003215-2-tps-675-386.png\" alt=\"warmfork 时序\"></p>\n<h5>亮点特性二、Startup Snapshot</h5>\n<p>Warmfork 能实现了单机上服务进程的快速启动，而对于优化冷机启动加载速度，需要采用 Startup Snapshot 方案。\nStartup Snapshot 和 CodeCache 的区别在于 Startup Snapshot 能够保存用户代码逻辑执行状态，而 CodeCache 只保存代码解析结果、仍然需要重新执行 用户代码逻辑。</p>\n<p>设计上，Startup Snapshot 可提供携带用户代码逻辑的快速恢复，但是也有局限性：</p>\n<ol>\n<li>Startup Snapshot 对内存开销敏感，如果应用启动阶段用了大量内存，可能造成负优化；</li>\n<li>用户代码启动需要没有歧义的状态，比如 IP 地址、日期、连接状态、服务发现结果等，针对这些歧义内容用户代码需要在进程恢复时有修正能力；</li>\n</ol>\n<p>V8 的 Startup Snapshot Serializer 就是一个类似于 GC 的对象遍历器。这个遍历器通过遍历加入到 Snapshot 中的 Root 对象，遍历它所对应的对象图并按照对象关系生成一系列的反序列化指令。</p>\n<p>Startup Snapshot 相当于从 V8 Context 对象与它的 globalThis 开始，遍历堆中所有的对象并将对象关系与引用序列化成 特有的字节码，形成一个线性的可存储状态。并在恢复时，解释执行这些字节码，恢复堆中的对象内容与他们之间的引用关系。\n<img src=\"https://gw.alicdn.com/imgextra/i3/O1CN01VbTxVV1j7xsJEqEGB_!!6000000004502-2-tps-750-390.png\" alt=\"V8 对象\">\n上述的两类和被调度性能相关的特性被统一归类为状态拷贝 API，具体使用可以参考官网文档中的<a href=\"https://noslate.midwayjs.org/docs/noslate_workers/aworker/serialize-api\">《状态拷贝 API》</a>章节，详细介绍了命令行参数和程序内的 Events。</p>\n<h4>Noslated</h4>\n<p>Noslate Container Deamon，作为 Noslate Workers 解决方案的核心管控程序，提供了实例调度、弹性扩缩容、配置管理、流量管理等能力。</p>\n<p>基于健壮性考虑，它由两个角色组成：控制面（Control Plane）、数据面（Data Plane）\n<img src=\"https://gw.alicdn.com/imgextra/i3/O1CN01OGE8Xk1hEiU0mY4Nw_!!6000000004246-2-tps-2845-1351.png\" alt=\"Noslated 架构\">\nNoslated 对于实例的管控主要有三个模式：</p>\n<ol>\n<li>基础模式 - 基于流量的扩缩容</li>\n<li>即抛模式 - 运行完即销毁</li>\n<li>预留模式 - 面向历史场景兼容，在此不额外展开，详情可以查阅官网<a href=\"https://noslate.midwayjs.org/docs/noslate_workers/references/scale/#%E4%B8%89%E9%A2%84%E7%95%99%E7%AD%96%E7%95%A5\">【预留策略】</a>。</li>\n</ol>\n<h5>一、基础模式</h5>\n<p>当流量进入 Data Plane 后，如果没有能够处理请求的 Worker 实例，会通过 requestQueueing 事件通知 Control Plane，它会根据当前水位决定扩容数量，如果当前已无法创建 Worker 实例，会返回资源上限报错。新的 Worker 实例启动后，会自动连接到 Data Plane，Data Plane 发现新的 Worker 实例连接后会主动触发初始化请求，初始化成功后开始消费请求队列里堆积的请求。</p>\n<p>当 Worker 实例闲置一段时间后，Control Plane 会主动发起 GC 操作，告知 Data Plane 关闭流量，流量关闭后，Control Plane 会通知 Turf 关闭 Worker 实例，清理资源残留。\n<img src=\"https://gw.alicdn.com/imgextra/i3/O1CN01TWklUC1OusEnQ5ENK_!!6000000001766-2-tps-1207-1020.png\" alt=\"基础弹性模式\"></p>\n<h5>二、即抛模式</h5>\n<p>针对特定的灵活场景，一次性的轻量用户脚本执行（比如特别高密度的混部执行二方任务如 SSR），为了隔离不同请求间的上下文，可以针对每个请求创建一个实例，并在执行后销毁。\n<img src=\"https://gw.alicdn.com/imgextra/i3/O1CN01k7ZGMG1DHWQzoQWSV_!!6000000000191-2-tps-1207-1020.png\" alt=\"即抛模式\">\n在常规 Node.js 实例带上业务逻辑启动一般都不会太快，如果直接用于响应用户流量 RT 会难以接受。得益于 Aworker 运行时的 Warmfork 以及 Startup Snapshot 能力，把部分业务初始化逻辑放置到 Warmfrok 特性中，进而让新实例都是更快的启动并具备响应能力，这才让高密度混部二方任务成为可能。</p>\n<h2>二、Noslate Debugger</h2>\n<p><img src=\"https://gw.alicdn.com/imgextra/i1/O1CN010OWgpL1yU9IWuE5XG_!!6000000006581-2-tps-1270-339.png\" alt=\"Noslate Debugger\">\nNoslate Debugger 是针对 V8 应用的离线分析工具，它可以分析 Node.js 等应用程序产生的 Corefile (Core 文件)：</p>\n<ol>\n<li>检查 Node.js/V8 应用程序的结构体、堆栈等内容</li>\n<li>检查 V8 堆内的各种对象信息</li>\n<li>从 Corefile 中导出 Heap Snapshot</li>\n<li>业务无感获取 Corefile (通过 Arthur 工具)</li>\n<li>已支持 Node.js / AWorker LTS 官方发行版</li>\n</ol>\n<p>为了更好的解决问题而不是造轮子，在未来的几个月 Noslate Debugger 也会和国内社区 Node.js 稳定性领域优秀的开源软件 Easy Monitor 共建整合，在 Node.js/V8 的问题诊断领域形成合力，也是值得期待的事情。</p>\n<h5>优点一：基于 Corefile 的 “快照” 更适应 Serverless</h5>\n<p>Serverless 应用通常会使用大量生命周期短、规格小的任务实例，但在此类任务实例上获得调试诊断能力并不容易，这使得 Serverless 应用长期处于较为黑盒的窘境。比如，Inspector 需要稳定和长时的网络连接、运行时 Heap Snapshot 需要较多的计算和内存资源，都是和 Serverless 架构背道而驰的。</p>\n<p>不管是 V8 的对象还是堆快照，它都是 “信息” 在内存中的存储，而 Inspector 功能就是可以在 “运行时” 能提取这些信息。Noslate Debugger 通过 Corefile 将这部分调试诊断能力转移到了离线时进行，让原有实时性要求高的在线诊断调试转化为只需简单文件上传即可集成使用。</p>\n<p>在用户本地或云端服务上提供接近用户本地开发时的调试诊断体感：\n<img src=\"https://gw.alicdn.com/imgextra/i2/O1CN01OCIltT1LGcaAR4r8G_!!6000000001272-2-tps-861-519.png\" alt=\"调试流程\"></p>\n<blockquote>\n<p>Corefile (特指 GNU Corefile 格式) 主要记录的是 Node.js 进程的内存和寄存器转储(CoreDump: 内存到磁盘的过程)。所以它也是进程完整“信息”，被用于 Linux 系统应用 Crash(有损) 的调试载体，也可用于 GCore(无损) 产生进程快照用于离线分析。</p>\n</blockquote>\n<h5>优点二：更小的业务影响​</h5>\n<p>对比原有线上 “堆快照” 对业务的影响长达数分钟，到只影响业务 RT 秒级（通过 GCore），甚至只有几十毫秒 （通过 Arthur 工具）。Corefile 快照也不会有任何运行时的&quot;添油加醋&quot;，所以它也适合那些还未被GC的对象定位，譬如诊断已经结束了的业务处理等。</p>\n<p>Arthur 是 Noslate Debugger 中用于低影响获取 core文件的工具，利用 fork 减少进程暂停时间，LZ4 压缩减少转储体积。带业务流量的线上环境抓取，业务影响 31.106 毫秒，Corefile 大小为 338 MB （进程原使用 1.44GB 物理内存）。</p>\n<h2>三、Node.js 发行版</h2>\n<p><img src=\"https://gw.alicdn.com/imgextra/i1/O1CN01wxGn641fHLWa312QP_!!6000000003981-2-tps-1270-339.png\" alt=\"Anode\">\n我们还对 Node.js 的实例进行了定向弹性场景的优化，提高了用户代码的加载速度，从而降低了冷启动时间。主要包括 Require 关系加速、Bytecode Cache，优化效果提升可高达 100% ~ 200%。该发行版，同时包含来自阿里云基础软件团队在 ARM 架构的性能优化特性。</p>\n<h3>冷启动优化</h3>\n<p>PGO（Profile Guided Optimization），是一种根据运行时 Profiling Data 来进行编译优化的技术，这里我们借鉴了这一概念。主要是通过执行一遍之后收集启动阶段的热点数据生成缓存文件，后续通过内存映射直接加载高效的缓存文件，即可获得提升在 100% ~ 200% 的用户代码冷启动优化效果。\n<img src=\"https://gw.alicdn.com/imgextra/i4/O1CN01nHx1UD1yE7Qqlfef6_!!6000000006546-2-tps-1164-930.png\" alt=\"PGO 流程\"></p>\n<h3>面向特定平台架构优化</h3>\n<p>Node.js 支持包括 x64、arm64 等在内的多种架构。 但针对 ARM 芯片的快速发展，上游版本往往仅提供基础适配，缺少针对新指令集的优化，导致在 ARM 芯片上无法获得潜在的性能提升。当下主流云厂商大都提供了 ARM 架构、高性价比的运行环境。 Noslate Node.js 发行版针对 ARM 等平台的优化可以让应用在这些架构上获得更高的性能和效率。\n目前 Noslate Node.js 发行版已经在进行针对阿里云 Ampere、阿里云倚天的定制优化，未来计划包括支持龙蜥社区中的其他架构。主要包括：zlib 特性优化、其他一些利用 SIMD 的性能提升都在 PR 合并和准别中。\n上面是对 Noslate Project 的简单介绍，如果想要详细了解可通过下述方式：\n● GitHub: <a href=\"https://github.com/noslate-project/noslate\">https://github.com/noslate-project/noslate </a>\n● 网站：<a href=\"https://noslate.midwayjs.org/\">https://noslate.midwayjs.org/</a>\n● 龙蜥社区 SIG（特殊兴趣小组，有钉钉群）：<a href=\"https://openanolis.cn/sig/web-platform\">https://openanolis.cn/sig/web-platform</a>\n● 邮件列表：noslate-support@list.alibaba-inc.com</p>\n<p>致谢\n感谢阿里巴巴集团内业务方的支持，同时还要特别感谢所有给本项目贡献过代码、一起探索过技术方向伙伴们（包括不限于 legendecas、mariodu、zhaolei0505、XadillaX、umuoy1、oraluben、hyj1991 等）。</p>\n</div>","title":"阿里巴巴 Noslate 正式开源 - 面向云原生的 JavaScript 容器方案","last_reply_at":"2024-03-29T10:56:08.107Z","good":false,"top":true,"reply_count":10,"visit_count":183715,"create_at":"2022-10-19T07:17:07.977Z","author":{"loginname":"mariodu","avatar_url":"//gravatar.com/avatar/1cb272a2b4347c9a15b502ce7e4802ba?size=48"}},{"id":"69d0a4fdf4e680271f4753a7","author_id":"68a69f72f13576f34f083621","tab":"share","content":"<div class=\"markdown-text\"><p><strong>国内手机和电脑上外网梯子的机场节点怎么用？- windows/MacOS/Linux等PC电脑系统和苹果安卓等手机系统使用翻墙机场时，将订阅的翻墙节点导入Clash、Shadowrocket（小火箭）、Stash（Clash for iOS）、Quantumult X（圈叉）、Surge、V2rayN、sing-box 等翻墙客户端就可以轻松实现科学上网。今天给大家分享六个pc电脑和手机上都能稳定流畅科学上网的机场节点梯子推荐，这些翻墙机场相较传统的翻墙vpn和网络加速器来说，便宜好用性价比超高，如果你也想买一个便宜的稳定靠谱梯子，那么不妨从这些好用的魔法梯子中选择一个。</strong></p>\n<p><img src=\"https://discuss.d2l.ai/uploads/default/original/3X/7/2/7250a7e2f35e11fb46247c70b0a916c19335f67e.jpeg\" alt></p>\n<h3>一、尔湾云-2026最佳稳定梯子</h3>\n<p><strong><a href=\"https://affg.cc/ewan\">官网地址</a></strong></p>\n<p>推荐指数：⭐⭐⭐⭐⭐⭐</p>\n<p>收费：24 元/月（<a href=\"https://affg.cc/ewan\">官网领取七折优惠</a>）</p>\n<p>简介：尔湾云2022年开始运营。主打高级别线路，虽然定价不算低但是翻墙节点线路质量非常可靠，<strong>敏感期抗封锁能力强</strong>。这个翻墙机场节点梯子来上外网google谷歌、youtube油管、刷twitter推特以及支持chatgpt、Gemini、Claude等AI模型都完全没有问题。定价虽然24元/月，但是速度靠谱线路稳定，4k视频缓冲不卡顿，你完全可以用它来观看奈飞netflix、迪士尼disney、hbo等流媒体。流量一次性到账，完全不用担心每月剩余流量清零问题。</p>\n<h3>二、扬帆云-安全好用的翻墙机场推荐</h3>\n<p><strong><a href=\"https://affg.cc/yafa\">官网地址</a></strong></p>\n<p>推荐指数：⭐⭐⭐⭐⭐⭐</p>\n<p>收费：15元/月</p>\n<p>简介：扬帆云机场是在行业中诞生最早的一批电脑翻墙梯子之一，如果有半年以上电脑挂梯子魔法科学上外网经验的小伙伴，对它肯定不陌生。扬帆云在全世界都拥有极高的人气，粉丝群体庞大，真爱粉更是数不胜数。客户端设计也很简洁，几乎不需要翻墙教程，下载后看一眼就会，毕竟就那么几个按钮。作为稳定的老牌机场梯子，价格也并不高，支持解锁流媒体。</p>\n<h3>三、SYCloud速云梯-高性价比电脑手机翻墙梯子推荐</h3>\n<p><strong><a href=\"https://affg.cc/suyu\">官网地址</a></strong></p>\n<p>推荐指数：⭐⭐⭐⭐⭐</p>\n<p>收费：18元/月</p>\n<p>SYCloud是一款高端翻墙机场节点梯子，由晴天私人珍藏。其上网速度和网络稳定性优秀，成为晴天日常工作、游戏、观影的首选工具。SYCloud以观影速度优化出色而闻名，能够流畅播放4K和8K超高清视频，无卡顿超前缓冲。</p>\n<p>作为一个月收费仅为18元的电脑翻墙梯子软件，SYCloud采用成本极高的IEPL专线，为用户提供出色的观影体验。这种专线机场在观看高清视频时表现出色，支持解锁netflix和Disney等流媒体能够实现秒开视频，流畅播放。同时，SYCloud的翻墙节点还可用于游戏加速，具有极低的延迟。</p>\n<p>SYCloud的运营时间可以追溯到几年前，是一家经验丰富的翻墙机场服务商。其支持Clash（Stash）、Shadowrocket小火箭等插件，是晴天目前使用时间最长的外网梯子。对于新手用户，SYCloud提供完整的科学上网教程和翻墙插件下载使用指导，24小时客服为用户提供便捷的帮助。</p>\n<h3>四、疾风云-靠谱梯子推荐</h3>\n<p><strong><a href=\"https://affg.cc/jife\">官网地址</a></strong></p>\n<p>推荐指数：⭐⭐⭐⭐</p>\n<p>收费：19元/月</p>\n<p>简介：疾风云也是一款非常好用的电脑科学上网梯子，网速稳定快速收费不贵，</p>\n<h3>五、优信云-小众高速机场</h3>\n<p><strong><a href=\"https://affg.cc/uxin\">官网地址</a></strong></p>\n<p>推荐指数：⭐⭐⭐⭐</p>\n<p>收费：15元/月</p>\n<p>简介：优信云是新兴Shadowsocks翻墙机场服务，提供隧道中转和IPLC线路，节点分布美、法、日、新、港台等地区。解锁Netflix奈飞等各大流媒体，也支持ChatGPT、TikTok、YouTube等平台。</p>\n<p>客户端方面，优信云机场做的还是很不错的，基本上所有的主流平台都被涵盖了，包括windows电脑，苹果手机，安卓手机，路由器等等，在机场官网下载他们的插件安装包后就能一键导入使用，而且各个客户端都有攻略，简洁明了，看一眼就会。</p>\n<h3>六、三番云-按流量计费机场</h3>\n<p><strong><a href=\"https://affg.cc/3fan\">官网地址</a></strong></p>\n<p>推荐指数：⭐⭐⭐⭐</p>\n<p>收费：14元/月</p>\n<p>简介：三番云是一家提供高速稳定的网络加速服务的高端机场，支持多种协议，如SS/SSR、V2Ray和Trojan，适用于Windows、Android、macOS和Linux等多种操作系统。它的特点包括流媒体视频和音乐的解锁能力，如Netflix、Disney、Hulu、HBO等，支持ChatGPT，并且在稳定性方面表现良好。</p>\n<p><strong>这六款能在电脑上稳定流畅使用的科学上网软件，同样也适用于手机翻墙浏览外网。是这些年自己用过并且感觉还可以的，收费有高有低，但总体来说都是高性价比且安全好用的，选择适合自己的一款翻墙梯子放心用就是。</strong></p>\n<hr>\n<p>免责声明： 本文所介绍的机场梯子VPN请只限用于正常外贸商务、新媒体、游戏娱乐、学习交流，切勿用在违法犯罪用途，用户请自觉遵守当地法律法规，出现一切后果本项目作者概不负责。</p>\n<p>2026梯子推荐，翻墙机场 ，机场推荐 ，SS/SSR/机场，机场加速器购买，V2ray机场梯子，Trojan机场 ，Clash节点，好用的便宜梯子，翻墙梯子，VPN梯子 ，稳定梯子 ，手机电脑梯子，外网梯子，外贸梯子，油管梯子，AI梯子</p>\n</div>","title":"稳定梯子推荐：六款手机PC电脑能用的翻墙机场节点梯子VPN","last_reply_at":"2026-04-05T02:36:49.626Z","good":false,"top":false,"reply_count":2,"visit_count":329,"create_at":"2026-04-04T05:43:25.215Z","author":{"loginname":"acsor","avatar_url":"//gravatar.com/avatar/765a14152db762f75397596fb4ef38be?size=48"}},{"id":"69d10c83f4e6800a484753d4","author_id":"68a69f72f13576f34f083621","tab":"share","content":"<div class=\"markdown-text\"><p><strong>2026年，使用Clash机场或小火箭节点等魔法外网梯子已成为基本技能。无论是外贸人员访问谷歌、程序员查阅GitHub或使用Gemini、ChatGPT、Claude等AI模型，还是影迷解锁观看Netflix等流媒体的4K内容，传统免费科学上网VPN梯子已无法满足需求。翻墙机场以稳定、高速和大流量的优势，成为翻墙梯子推荐中的首选。</strong></p>\n<p>这里分享几个稳定、快速、安全、便宜的<strong>翻墙机场推荐</strong>，安卓苹果手机系统和PC电脑Windows系统都能用的翻墙软件梯子工具，提供 Shadowsocks、ShadowsocksR、VMess、VLESS（Reality）、Trojan、Hysteria 多种协议，支持 Clash、Clash Verge、ClashX、Shadowrocket（小火箭）、Stash（Clash for iOS）、Quantumult X（圈叉）、Surge、V2rayN、sing-box 等多种流行的翻墙客户端，所有机场梯子都支持Clash节点一键导入Clash客户端使用。无论是Netflix奈飞、Disney迪士尼、HBO、Hulu、YouTube油管等<strong>流媒体解锁机场</strong>，还是日常工作学习，甚至上外网网络游戏加速的需求，都能完美解决，供大家参考。本文精选五款顶级机场翻墙机场，助你找到最佳<a href=\"https://gitlab.com/cnvpn/shouji-tizi\">VPN梯子 </a>。</p>\n<p><img src=\"https://community-all-backup.s3.dualstack.us-east-1.amazonaws.com/original/2X/7/70e973b570b3d877ad95233869003144728e066c.jpeg\" alt></p>\n<hr>\n<h2>为什么选择翻墙机场？</h2>\n<p>免费梯子（如自由门、蓝灯）或自建VPS（如Vultr）速度慢、易被封，晚高峰几乎卡死。而<strong>Clash机场魔法梯子</strong>依托SS/SSR、V2Ray、Trojan等协议，结合BGP中转和IPLC专线，提供更强的抗封锁能力和流畅体验。相比免费工具，收费的<strong>翻墙机场</strong>在安全性、稳定性和性价比上更胜一筹，尤其是海外运营的机场 ，跑路风险低，隐私有保障。</p>\n<p>一分钱一分货：便宜直连易翻车，专线支持的<strong>VPN梯子</strong>才是正解。以下是2026年的顶级梯子推荐。</p>\n<hr>\n<h2>2026顶级翻墙机场推荐</h2>\n<table>\n<thead>\n<tr>\n<th>机场名称</th>\n<th>热门指数</th>\n<th>官网地址</th>\n<th>最低价格</th>\n<th>流量范围</th>\n<th>特点</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>扬帆云</td>\n<td>⭐⭐⭐⭐⭐</td>\n<td><a href=\"https://affgo.cc/yafa\">扬帆云官网 </a></td>\n<td>15元/月</td>\n<td>100GB-500GB</td>\n<td>高速稳定，推荐首选</td>\n</tr>\n<tr>\n<td>尔湾云</td>\n<td>⭐⭐⭐⭐⭐</td>\n<td><a href=\"https://affgo.cc/ewan\">尔湾云官网 </a></td>\n<td>24元/月</td>\n<td>100GB-500GB</td>\n<td>性价比首选，流量不清零</td>\n</tr>\n<tr>\n<td>速云梯</td>\n<td>⭐⭐⭐⭐⭐</td>\n<td><a href=\"https://affgo.cc/suyu\">速云梯官网 </a></td>\n<td>19元/月</td>\n<td>100GB-1200GB</td>\n<td>8K视频解锁，游戏加速</td>\n</tr>\n<tr>\n<td>疾风云</td>\n<td>⭐⭐⭐⭐☆</td>\n<td><a href=\"https://affgo.cc/jife\">疾风云官网 </a></td>\n<td>19元/月</td>\n<td>100GB-1200GB</td>\n<td>大流量，流媒体优选</td>\n</tr>\n<tr>\n<td>优信云</td>\n<td>⭐⭐⭐⭐☆</td>\n<td><a href=\"https://affgo.cc/uxin\">优信云官网 </a></td>\n<td>15元/月</td>\n<td>100GB-600GB</td>\n<td>小众稳定，带宽充沛</td>\n</tr>\n</tbody>\n</table>\n<h3>1. 扬帆云 - 2026魔法梯子推荐首选</h3>\n<p><strong><a href=\"https://affgo.cc/yafa\">扬帆云官网 </a></strong></p>\n<p><a href=\"https://affgo.cc/yafa\"><img src=\"https://community-all-backup.s3.dualstack.us-east-1.amazonaws.com/original/2X/b/b0845043595d29dfe22c88645f930f0939ce3b9b.jpeg\" alt> </a></p>\n<p>扬帆云由海外团队运营，主打Shadowsocks+V2Ray协议，提供多线入口和IEPL专线，100多条节点线路覆盖美国、新加坡、台湾、香港、日本及全球小众地区。</p>\n<ul>\n<li><strong>核心优势</strong>: 解锁Netflix、Disney+、YouTube Premium，4K秒开；月付15元起，年付七折优惠；支持永久有效按流量计费套餐；支持24H不满意退款；支持Clash、Shadowrocket等主流翻墙插件客户端。</li>\n<li><strong>套餐价格</strong>:</li>\n</ul>\n<table>\n<thead>\n<tr>\n<th>套餐</th>\n<th>价格</th>\n<th>每月流量</th>\n<th>特点</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>初级套餐</td>\n<td>15元/月</td>\n<td>100GB</td>\n<td>预算友好</td>\n</tr>\n<tr>\n<td>中级套餐</td>\n<td>30元/月</td>\n<td>200GB</td>\n<td>稳定日常使用</td>\n</tr>\n<tr>\n<td>高级套餐</td>\n<td>40元/月</td>\n<td>400GB</td>\n<td>深度科学上网用户</td>\n</tr>\n</tbody>\n</table>\n<ul>\n<li><strong>评测体验</strong>: 扬帆云节点丰富，晚高峰稳定，是<strong>梯子推荐</strong>中的首选。</li>\n<li><strong>优惠活动</strong>: 年付享七折优惠。</li>\n</ul>\n<hr>\n<h3>2. 尔湾云 - 最稳定的便宜外网梯子</h3>\n<p><strong><a href=\"https://affgo.cc/ewan\">尔湾云官网 </a></strong></p>\n<p><a href=\"https://affgo.cc/ewan\"><img src=\"https://community-all-backup.s3.dualstack.us-east-1.amazonaws.com/original/2X/8/8b37db9fe3d0faaf9a489d7205b0215b7caabd41.jpeg\" alt> </a></p>\n<p>尔湾云专注于SSR和V2Ray，采用GBP隧道中转和IEPL专线加速，海外团队运营，节点覆盖美国、法国、新加坡、日本、马来西亚、香港、台湾等地。</p>\n<ul>\n<li><strong>核心优势</strong>: 月付24元起，流量月底不清零；解锁Netflix、ChatGPT、TikTok；一键导入Clash等插件。</li>\n<li><strong>套餐价格</strong>:</li>\n</ul>\n<table>\n<thead>\n<tr>\n<th>套餐</th>\n<th>价格</th>\n<th>每月流量</th>\n<th>特点</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>基础版</td>\n<td>24元/月</td>\n<td>100GB</td>\n<td>稳定首选</td>\n</tr>\n<tr>\n<td>标准版</td>\n<td>39元/月</td>\n<td>200GB</td>\n<td>日常使用</td>\n</tr>\n<tr>\n<td>高级版</td>\n<td>49元/月</td>\n<td>400GB</td>\n<td>高性价比</td>\n</tr>\n</tbody>\n</table>\n<ul>\n<li><strong>评测体验</strong>: 尔湾云低价稳定，适合学生，是<strong>魔法梯子</strong>的入门之选。</li>\n<li><strong>优惠活动</strong>: 流量全到账，月底不清零。年付七折 优惠码 SS12</li>\n</ul>\n<hr>\n<h3>3. 速云梯 - 2026稳定高速的翻墙机场</h3>\n<p><strong><a href=\"https://affgo.cc/suyu\">速云梯官网 </a></strong></p>\n<p><a href=\"https://affgo.cc/suyu\"><img src=\"https://community-all-backup.s3.dualstack.us-east-1.amazonaws.com/original/2X/2/2d5213089df499c9010e32f4745f12d6905d946f.jpeg\" alt> </a></p>\n<p>速云梯主打SS/V2Ray协议，全球部署超3000台服务器，100+节点覆盖美国、日本、香港等地，配备BGP中转和IPLC专线。</p>\n<ul>\n<li><strong>核心优势</strong>: 支持8K视频，是顶级的<strong>流媒体解锁机场</strong>，解锁Netflix、Hulu、Disney+；月付19元起，流量充足；AES-256加密，无日志运营。</li>\n<li><strong>套餐价格</strong>:</li>\n</ul>\n<table>\n<thead>\n<tr>\n<th>套餐</th>\n<th>价格</th>\n<th>每月流量</th>\n<th>特点</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>入门版</td>\n<td>19.99元/月</td>\n<td>100GB</td>\n<td>适合轻度用户</td>\n</tr>\n<tr>\n<td>标准版</td>\n<td>39.99元/月</td>\n<td>350GB</td>\n<td>中度使用优选</td>\n</tr>\n<tr>\n<td>旗舰版</td>\n<td>99.99元/月</td>\n<td>1200GB</td>\n<td>重度用户首选</td>\n</tr>\n</tbody>\n</table>\n<ul>\n<li><strong>评测体验</strong>: 速云梯稳定性一流，游戏加速和4K视频体验极佳，专线节点抗封锁突出。</li>\n<li><strong>优惠活动</strong>: 年付享7折，优惠码 <strong>YYY11</strong>（截止2025年2月1日）。</li>\n</ul>\n<hr>\n<h3>4. 疾风云 - 最佳流媒体解锁机场</h3>\n<p><strong><a href=\"https://affgo.cc/jife\">疾风云官网 </a></strong></p>\n<p><a href=\"https://affgo.cc/jife\"><img src=\"https://community-all-backup.s3.dualstack.us-east-1.amazonaws.com/original/2X/1/14930628a5231dbf6fbf707125648ca906100ee2.jpeg\" alt> </a></p>\n<p>疾风云支持SSR和V2Ray，配备BGP中转和IPLC专线，100多节点覆盖美国、法国、德国、日本、新加坡、泰国、马来西亚、香港、台湾等地。</p>\n<ul>\n<li><strong>核心优势</strong>: 月付14元起，旗舰版1200GB；支持Netflix、Disney+、ChatGPT，8K无压力；优惠折扣活动多，支持24小时不满意退款。</li>\n<li><strong>套餐价格</strong>:</li>\n</ul>\n<table>\n<thead>\n<tr>\n<th>套餐</th>\n<th>价格</th>\n<th>每月流量</th>\n<th>特点</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>入门版</td>\n<td>19元/月</td>\n<td>100GB</td>\n<td>超低价入门</td>\n</tr>\n<tr>\n<td>标准版</td>\n<td>28元/月</td>\n<td>200GB</td>\n<td>均衡选择</td>\n</tr>\n<tr>\n<td>旗舰版</td>\n<td>98元/月</td>\n<td>1200GB</td>\n<td>大流量优选</td>\n</tr>\n</tbody>\n</table>\n<ul>\n<li><strong>评测体验</strong>: 疾风云兼顾低价和大流量，是<strong>流媒体解锁机场</strong>的性价比标杆。</li>\n<li><strong>优惠活动</strong>: 年付享7折，优惠码 <strong>jf2025</strong>。</li>\n</ul>\n<hr>\n<h3>5. 优信云 - 稳定VPN梯子推荐</h3>\n<p><strong><a href=\"https://affgo.cc/uxin\">优信云官网 </a></strong></p>\n<p><a href=\"https://affgo.cc/uxin\"><img src=\"https://community-all-backup.s3.dualstack.us-east-1.amazonaws.com/original/2X/0/00064b4cf577a409ae297aeab30f622e4a9b0844.jpeg\" alt> </a></p>\n<p>优信云是新兴Shadowsocks/Trojan协议机场服务商，除了公网和直连节点还提供IPLC高速专线，支持24小时不满意退款。</p>\n<ul>\n<li><strong>核心优势</strong>: 解锁国际流媒体平台和ChatGPT、TikTok、YouTube；月付15元起，性价比高；支持24小时退款。</li>\n<li><strong>套餐价格</strong>:</li>\n</ul>\n<table>\n<thead>\n<tr>\n<th>套餐</th>\n<th>价格</th>\n<th>每月流量</th>\n<th>特点</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>基础版</td>\n<td>15元/月</td>\n<td>100GB</td>\n<td>小众稳定</td>\n</tr>\n<tr>\n<td>标准版</td>\n<td>30元/月</td>\n<td>200GB</td>\n<td>日常优选</td>\n</tr>\n<tr>\n<td>高级版</td>\n<td>50元/月</td>\n<td>600GB</td>\n<td>高流量选择</td>\n</tr>\n</tbody>\n</table>\n<ul>\n<li><strong>评测体验</strong>: 优信云低调稳定，是<strong>VPN梯子</strong>中的潜力股，适合追求隐私的用户。</li>\n<li><strong>优惠活动</strong>: 年付85折，优惠码 yx85</li>\n</ul>\n<hr>\n<h2>机场科普</h2>\n<h3>什么是机场梯子</h3>\n<p>机场节点梯子是提供科学上网服务的网络供应商，其主要服务项目是提供Shadowsocks、V2ray、Trojan等翻墙协议的节点服务器。这些机场因早期使用Shadowsocks和ShadowsocksR（简写为SS/SSR）协议，而小飞机又是Shadowsocks软件的图标，因此得名“机场”。这些节点服务器订阅文件输入到“飞机”里，就是可以帮助用户绕过网络封锁的“航线”。</p>\n<h3>什么是VPN</h3>\n<p>VPN（虚拟私人网络）是一种内置了加密通讯协议的客户端，用于保护个人数字通讯隐私和数据加密，它的协议设计并不是为了翻墙。</p>\n<p>当用户连接到VPN服务器时，所有的网络数据都会通过加密隧道传输，这意味着即使在公共Wi-Fi网络上，黑客也难以窃取用户的敏感信息，如密码、个人信息和银行数据。VPN在移动设备上尤为重要，因为它可以防止在公共Wi-Fi上连接时受到数据泄露和网络攻击。</p>\n<h3>机场和VPN的区别</h3>\n<p>当谈到机场和VPN的区别时，虽然它们都可用于科学上网，但在功能和使用方面存在明显区别。</p>\n<ul>\n<li>\n<p>首先，机场的主要目的是为了翻墙，因此对线路节点做了协议优化，以实现更适合大数据高速传输的效果。这使得在访问被限制的网站时，机场相比VPN在数据传输速度和稳定性方面表现更出色。</p>\n</li>\n<li>\n<p>其次，专业VPN在数据加密防护方面拥有极高的级别，保障用户的数字通讯隐私。然而，对于普通用户来说，机场使用的TLS加密协议已足够满足基本隐私保护需求，尤其考虑到与VPN相比，机场在数据传输速度上具有显著优势。</p>\n</li>\n<li>\n<p>对于中国大陆用户，机场采用了动态分流自动均衡规则，智能地区分境内境外的IP访问路径，并针对节点服务器的压力进行智能分配，从而保证了访问速度。相比之下，VPN的高级别加密处理所有的访问链接，可能影响网路浏览体验。</p>\n</li>\n<li>\n<p>最后，使用方式也有区别。VPN通常需要安装不同供应商开发的软件才能使用，而机场只需将节点订阅链接复制到喜欢的开源软件即可。这使得用户能够灵活地随时切换不同机场节点，实现更高效和便捷的上网体验。</p>\n</li>\n</ul>\n<h3>机场节点梯子的主要优点</h3>\n<ul>\n<li>\n<p>性价比高： 这些机场梯子加速器价格相比 ExpressVPN这些便宜很多，但并不意味着节点梯子服务质量不行，恰恰相反，我们购买同样或更低价格的套餐（使用折扣优惠码），可以获得这些便宜机场梯子的顶级套餐，延迟低、速度快的香港、台湾、日本、韩国、新加坡等地VPN节点都能用，而 ExpressVPN 提供给中国大陆翻墙用户的节点延迟都偏高，有时候需要等待很长时间才能连接到VPN服务器。</p>\n</li>\n<li>\n<p>稳定性好：这些魔法上网的梯子加速器都采用专门的翻墙协议，可以有效地抗防火长城的封锁，如果你之前没有听说过 Shadowsocks、V2ray、Trojan 这些词汇，相信我，使用过这些节点梯子之后一定会惊艳到你。这些翻墙协议专门针对防火长城开发，有专门的开发者进行更新迭代，相比传统的VPN万年不更新一次线路和协议，优势就不言而喻了。</p>\n</li>\n<li>\n<p>速度快：这些翻墙机场不仅有针对性的VPN协议，线路节点也是经过优化的，使用对中国国内友好的翻墙线路，延迟低、速度快，甚至部分翻墙梯子采用内网专线进行网络加速，不经过 GFW 防火长城，即使是敏感时期，当使用其他家VPN的线路被封锁时，专线翻墙加速器依然可以畅享高速的Google、youtube等上外网浏览体验。</p>\n</li>\n<li>\n<p>节点覆盖全：这些翻墙VPN梯子重视中国用户，提供的也是中国用户喜欢的VPN服务器节点：香港、台湾、日本、韩国、新加坡、美国机场服务器节点，可解锁当地 Netflix、HBO、Disney+ 等流媒体服务，甚至有的会提供 土耳其、阿根廷、巴基斯坦、菲律宾 等小众梯子节点，帮助用户以极低的价格去购买 Netflix、Steam、Spotify 等服务。</p>\n</li>\n<li>\n<p>客户端支持好：这些翻墙VPN即拥有自己开发的VPN客户端，用户也可以自由的选择流行的第三方翻墙客户端，全部适用于手机和PC电脑下载安装，通过导入订阅链接的方式使用，非常快速方便。Windows、Mac、Android 用户推荐使用 Clash 小猫咪梯子 客户端， iOS 用户推荐使用 Shadowrocket 小火箭梯子 或者 Stash。</p>\n</li>\n</ul>\n<h3>机场和VPN怎么选</h3>\n<p>综合而言，机场和VPN都在帮助用户绕过网络封锁、访问被限制的网站和保护隐私方面发挥重要作用，可以根据各自特点的不同，选择最符合个人需求场景的服务提供商就可以了，但是要注意以下几点：</p>\n<p>搭建机场技术难度并不高，很多个人自建机场圈钱跑路，使用户遭受损失。所以，尽量选择运营时间长、节点丰富、稳定可靠，在市场有一定口碑的高性价比可靠机场；</p>\n<p>不管是用机场节点，还是 VPN，尽量先选择1–3月的短期套餐。毕竟，服务商太多了，在不熟悉了解前，尽量谨慎选择；</p>\n<p>很多只在简中圈推广号称永久免费的XX-VPN，其实就是套壳了内置的机场节点协议的小程序，开发成本极低，这种所谓的“VPN”或者“加速器”，在隐私安全保护和通讯数据加密方面，和专业的 VPN 大厂相比要差太多。而且永久免费，他们搭成本进来图你的啥需要仔细想想；</p>\n<p>不要选择所谓的一元机场和月抛机场，虽然便宜但是线路质量无法保障，虽然不怕机场主</p>\n<h2>如何选择适合你的翻墙机场？</h2>\n<p>选择<strong>翻墙机场</strong>并非“一刀切”，需要根据个人需求权衡以下几个方面：</p>\n<ul>\n<li><strong>预算有限</strong>: 尔湾云和扬帆云是<strong>机场推荐</strong>中的实惠选择，适合学生或偶尔使用外网的用户。它们的流量虽不算多，但对于日常浏览网页、查资料已足够。</li>\n<li><strong>稳定性优先</strong>: 速云梯和扬帆云提供IPLC专线和BGP中转支持，节点覆盖广泛，即使在网络高峰期或敏感时期也能保持连接稳定。如果你需要长时间在线（如跨境电商、远程办公），这两款是不错的选择。</li>\n<li><strong>流媒体解锁</strong>: 速云梯和疾风云是<strong>流媒体解锁机场</strong>的佼佼者，支持Netflix、Disney+甚至8K视频播放。它们的旗舰套餐流量充足（1200GB），延迟低，适合影迷或需要高清体验的用户。</li>\n<li><strong>特殊时期</strong>: 在网络封锁加剧时，IPLC专线（如速云梯）表现出色，能有效绕过限制。</li>\n<li><strong>网络环境</strong>: 如果你使用移动或教育网，选BGP中转线路更优，能适配不同运营商，减少延迟和丢包。电信用户可测试各机场节点，选择延迟最低的线路。</li>\n</ul>\n<p><strong>额外建议</strong>: 便宜梯子人多易堵，速云梯的高价（18元/月）换来的是顶级稳定性。建议根据使用频率选择月付或年付，同时准备备用机场。</p>\n<hr>\n<h2>如何使用翻墙机场？</h2>\n<p>使用<strong>魔法梯子</strong>比传统VPN稍复杂，但上手后非常简单。以下是详细步骤：</p>\n<ol>\n<li><strong>注册购买</strong>: 访问机场官网（<a href=\"https://affgo.cc/yafa\">如扬帆云官网 </a>），注册账号并选择套餐。支付后，你会获得用户面板，包含订阅链接、流量统计和使用说明。</li>\n<li><strong>下载客户端</strong>: PC推荐 V2rayN 或 Clash，Android 用 Clash 或 Surfboard，iOS 用 Shadowrocket（需海外 Apple ID）。各家翻墙机场官网均提供下载及使用说明。</li>\n<li><strong>导入订阅</strong>: 登录面板，复制订阅链接，打开客户端，粘贴链接并更新，节点列表会自动加载。</li>\n<li><strong>连接测试</strong>: 选择低延迟节点（如“日本-50ms”），点击连接，验证谷歌或YouTube是否可用。</li>\n</ol>\n<p><strong>常见问题</strong>:</p>\n<ul>\n<li><strong>连接失败</strong>: 检查订阅是否过期，或换节点测试。</li>\n<li><strong>速度慢</strong>: 优先选IPLC节点（如速云梯）。</li>\n<li><strong>注意事项</strong>: 订阅链接勿公开，发现异常及时重置。</li>\n</ul>\n<p><strong>新手建议</strong>: 新手不要上来就订年付套餐，按月订阅购买套餐先行试用。</p>\n<hr>\n<h2>小贴士</h2>\n<p>以下是实用建议，帮助你优化使用体验：</p>\n<ul>\n<li><strong>线路选择</strong>: IPLC专线抗封锁强，BGP中转适配性好，公网直连最便宜。</li>\n<li><strong>速度评测</strong>: 50Mbps以上且无断流即可满足4K需求，用客户端测速筛选最佳节点。</li>\n<li><strong>协议选择</strong>: SS简单，V2Ray丰富，Trojan伪装强，Hysteria适合复杂网络。</li>\n<li><strong>备用方案</strong>: 重度用户请备用机场，应对突发情况。</li>\n<li><strong>客服与社区</strong>: 通常机场官网都提供翻墙插件及教程，如果你完全小白，那就选有客服的机场。</li>\n</ul>\n<p><strong>小技巧</strong>: 定期更新订阅，关注官网公告，避免节点失效。</p>\n<hr>\n<h2>结语</h2>\n<p>2026年，这些稳定的手机电脑科学上外网的梯子加速器凭借各自优势，成为<strong>翻墙机场</strong>中的顶尖选择。无论你是新手还是老手，这些<strong>VPN梯子</strong>都能满足需求。快选一款<strong>魔法梯子</strong>，畅享高速、无界网络吧！</p>\n<hr>\n<p>免责声明： 本文所介绍的机场梯子VPN请只限用于正常外贸商务、新媒体、游戏娱乐、学习交流，切勿用在违法犯罪用途，用户请自觉遵守当地法律法规，出现一切后果本项目作者概不负责。</p>\n<p>2026梯子推荐，翻墙机场 ，机场推荐 ，SS/SSR/机场，机场加速器购买，V2ray机场梯子，Trojan机场 ，Clash节点，好用的便宜梯子，翻墙梯子，VPN梯子 ，稳定梯子 ，手机电脑梯子，外网梯子，魔法梯子，油管梯子，科学上网</p>\n</div>","title":"最新科学上网魔法梯子推荐：稳定的PC手机翻墙机场节点VPN","last_reply_at":"2026-04-05T02:36:20.360Z","good":false,"top":false,"reply_count":2,"visit_count":183,"create_at":"2026-04-04T13:05:07.059Z","author":{"loginname":"acsor","avatar_url":"//gravatar.com/avatar/765a14152db762f75397596fb4ef38be?size=48"}},{"id":"69d0b0b1f4e6809d9f4753be","author_id":"68a69f72f13576f34f083621","tab":"share","content":"<div class=\"markdown-text\"><p><strong>越来越多的上班族、外贸从业者、程序员、设计师和游戏玩家都需要一台可靠的 PC 电脑梯子来突破网络限制。无论是访问 Google Scholar 查找资料、用 ChatGPT/Claude 高效编程、登录 GitHub 拉取代码、解锁 YouTube 4K 视频，还是在外贸业务中稳定运行 TikTok 广告和 WhatsApp 沟通，一款好用的电脑跨境加速器都能大幅提升效率。本文聚焦 PC 电脑用户需求，精选 7 款经过长期实测、稳定不跑路的国外电脑梯子软件（机场节点），全部支持 Windows/Mac/Linux 系统，提供免费试用或低价月付入口，同时附上最详细的 pc 电脑梯子怎么用教程，帮助你快速上手。</strong></p>\n<p><a href=\"https://p.inari.site/usr/1819/698d26e2168ce.png\"><img src=\"https://p.inari.site/usr/1819/698d26e2168ce.png\" alt=\"Picture2.png\"></a></p>\n<p>以下机场均采用 SSR/V2Ray/Trojan 等先进协议，节点覆盖香港、台湾、日本、美国、新加坡等主流地区，支持 Clash for Windows、V2rayN、Clash Verge 等主流 PC 客户端一键导入，晚高峰稳定不掉线，完美解锁 Netflix、Disney+、ChatGPT、TikTok 等服务。</p>\n<h2>1.TinnyRick —— 新人首选高性价比跨境加速器</h2>\n<p><a href=\"https://affgo.cc/ewan\"><strong>官方网站注册</strong></a></p>\n<p>成立于 2023 年，节点覆盖香港、日本、美国、新加坡、法国等地区，提供 SSR/Trojan 协议。PC 端支持 Clash、V2rayN 一键导入，速度稳定，适合外贸和学习用户。支持支付宝微信支付，月付流量充足，新用户注册支持24小时不满意退款。</p>\n<h2>2.扬帆云 —— 专线品质，晚高峰最稳</h2>\n<p><a href=\"https://affgo.cc/yafa\"><strong>官方网站注册</strong></a></p>\n<p>2022 年老牌团队出品，采用 IPLC 专线 + 中转技术，节点分布香港、台湾、美国、日本、韩国、法国等地。解锁 Netflix、Disney+ 能力极强，PC 电脑梯子怎么用？只需复制订阅链接到 Clash for Windows，即可一键切换节点。套餐灵活，适合重度流媒体用户。</p>\n<h2>3.疾风云 —— 节点最多、覆盖最广的便宜好用机场</h2>\n<p><a href=\"https://affgo.cc/jife\"><strong>官方网站注册</strong></a></p>\n<p>节点多达 21 个国家/地区（台湾、美国、法国、新加坡、印度、澳门等），Shadowsocks 协议稳定高效。PC 端兼容性极佳，支持 Windows/Mac/Linux 全平台客户端。价格亲民，常有免费试用活动，是预算有限但想体验国外电脑梯子软件的首选。</p>\n<h2>4.梯云纵 —— 运营七年老牌，综合实力最强</h2>\n<p>七年老机场，节点遍布亚洲、美洲，支持 Netflix、HBO、Disney+、TikTok、ChatGPT 全解锁。通用订阅格式完美兼容 V2rayN、Clash 系列客户端，PC 电脑梯子推荐免费试用的话，梯云纵经常提供新用户免费体验包，稳定性极高，几乎无断流投诉。</p>\n<h2>5.Coconut —— 新锐专线机场，ChatGPT 专属优化</h2>\n<p>2023 年成立，采用 Shadowsocks+IPLC/IEPL 专线，节点覆盖香港、日本、韩国、新加坡、美国、德国、荷兰。特别针对 ChatGPT、MidJourney 等 AI 工具优化，延迟极低。PC 端一键导入订阅，适合程序员和 AI 重度用户。</p>\n<h2>6.龙卷风机场 —— 东南亚节点丰富，低延迟游戏加速</h2>\n<p>2024 年新机场，Trojan 协议节点覆盖泰国、新加坡、越南、马来西亚、土耳其、阿根廷等 16 国。PC 电脑梯子哪个好用？玩国际服游戏选龙卷风准没错，低延迟 + 高稳定，支持支付宝微信，注册即送免费试用流量。</p>\n<h2>7.可乐云 —— 按流量计费，不限时长最灵活</h2>\n<p>按量付费、不限设备、不限时间，国内中转优化 + 全流媒体解锁，节点包括香港、台湾、日本、新加坡、美国。每个地区独立入口服务器，晚高峰速度极佳。适合偶尔使用但追求极致性价比的 PC 用户。</p>\n<h2>PC 电脑梯子怎么用？最详细的新手教程（3 分钟上手）</h2>\n<p>很多朋友问 “pc 电脑梯子怎么用”，其实机场比传统 VPN 更灵活，操作也非常简单： 注册并购买套餐 进入机场官网，注册账号，选择月付或按量套餐（建议新人先选最低价或免费试用）。 下载 PC 客户端 Windows 推荐：Clash for Windows 或 V2rayN Mac 推荐：ClashX 或 V2rayU Linux 推荐：Clash for Linux 导入订阅节点 在机场个人中心复制 “订阅链接”，打开客户端 → 添加订阅 → 粘贴链接 → 更新订阅。 选择节点并连接 在节点列表中选择延迟最低的（建议先用内置测速功能筛选），点击连接即可。连接成功后，全局或规则模式任选（新手建议规则模式，只加速国外网站）。 验证是否成功 打开浏览器访问 <a href=\"http://google.com\">google.com</a> 或 <a href=\"http://youtube.com\">youtube.com</a>，若正常加载即成功。 整个过程无需任何技术基础，机场通常还提供图文/视频教程，比传统国外电脑梯子软件更灵活、速度更快。</p>\n<p><strong>PC 梯子哪个好用？以上 7 款国外电脑梯子软件（跨境加速器）都是经过无数用户实测的优质选择，无论是稳定性、速度还是解锁能力都远超普通免费梯子。建议立即访问官网注册免费试用，先亲身体验再决定——选对一款好用的 PC 电脑梯子，能让你的工作效率和娱乐体验提升数倍。</strong></p>\n</div>","title":"PC 梯子哪个好用？七款海外电脑梯子软件推荐 + 免费试用 + 跨境加速器详细教程","last_reply_at":"2026-04-05T02:36:03.758Z","good":false,"top":false,"reply_count":2,"visit_count":853,"create_at":"2026-04-04T06:33:21.956Z","author":{"loginname":"acsor","avatar_url":"//gravatar.com/avatar/765a14152db762f75397596fb4ef38be?size=48"}},{"id":"69d13273f4e68069c8475424","author_id":"69c0fd9fcd2d7137962cfede","tab":"ask","content":"<div class=\"markdown-text\"><p>谢谢谢谢</p>\n</div>","title":"33025690-244b-4102-8d28-2aa1242e23aa","last_reply_at":"2026-04-04T15:46:59.568Z","good":false,"top":false,"reply_count":0,"visit_count":39,"create_at":"2026-04-04T15:46:59.568Z","author":{"loginname":"wildgo","avatar_url":"//gravatar.com/avatar/d3b55e46394968d1e2b0cfd2bba9b3fb?size=48"}},{"id":"69d12e38f4e680623c475423","author_id":"69c0fd9fcd2d7137962cfede","tab":"ask","content":"<div class=\"markdown-text\"><p>谢谢谢谢</p>\n</div>","title":"表格测试12345678","last_reply_at":"2026-04-04T15:28:56.004Z","good":false,"top":false,"reply_count":0,"visit_count":35,"create_at":"2026-04-04T15:28:56.004Z","author":{"loginname":"wildgo","avatar_url":"//gravatar.com/avatar/d3b55e46394968d1e2b0cfd2bba9b3fb?size=48"}},{"id":"69d1271ef4e6807b9147541a","author_id":"69c0fd9fcd2d7137962cfede","tab":"ask","content":"<div class=\"markdown-text\"><p>谢谢谢谢</p>\n</div>","title":"表格测试12345678","last_reply_at":"2026-04-04T14:58:38.766Z","good":false,"top":false,"reply_count":0,"visit_count":38,"create_at":"2026-04-04T14:58:38.766Z","author":{"loginname":"wildgo","avatar_url":"//gravatar.com/avatar/d3b55e46394968d1e2b0cfd2bba9b3fb?size=48"}},{"id":"69d126f6f4e6807535475419","author_id":"69c0fd9fcd2d7137962cfede","tab":"share","content":"<div class=\"markdown-text\"><p>这是使用Postman工具调用CNode社区API接口的测试帖子，用于验证接口可用性.</p>\n</div>","title":"Postman练手测试","last_reply_at":"2026-04-04T14:57:58.995Z","good":false,"top":false,"reply_count":0,"visit_count":36,"create_at":"2026-04-04T14:57:58.995Z","author":{"loginname":"wildgo","avatar_url":"//gravatar.com/avatar/d3b55e46394968d1e2b0cfd2bba9b3fb?size=48"}},{"id":"69d12601f4e6806edb475415","author_id":"69c0fd9fcd2d7137962cfede","tab":"share","content":"<div class=\"markdown-text\"><p>大家好，我最近在学习使用Postman进行接口测试，过程中遇到了很多问题，也总结了一些经验。\n今天想分享一下我用Postman调用GitHub API创建Gist的过程，记录一下遇到的问题和解决方法，希望对同样在学习接口测试的小伙伴有帮助。</p>\n</div>","title":"学习Postman接口测试心得分享","last_reply_at":"2026-04-04T14:53:53.068Z","good":false,"top":false,"reply_count":0,"visit_count":42,"create_at":"2026-04-04T14:53:53.068Z","author":{"loginname":"wildgo","avatar_url":"//gravatar.com/avatar/d3b55e46394968d1e2b0cfd2bba9b3fb?size=48"}},{"id":"69cb6db7cd2d719ccb2cfff2","author_id":"58cff90ef7abd67436265bc8","tab":"share","content":"<div class=\"markdown-text\"><p>之前是挺多人讨论 nodejs，前端这些。\n现在剩下了 ai，连招聘也只剩下几个。\n全是梯子广告</p>\n</div>","title":"5 年没回 CNode 水，发现变了","last_reply_at":"2026-04-04T05:45:32.973Z","good":false,"top":false,"reply_count":1,"visit_count":216,"create_at":"2026-03-31T06:46:15.326Z","author":{"loginname":"Lizhooh","avatar_url":"https://avatars.githubusercontent.com/u/19299088?v=4&s=120"}},{"id":"6959e255cd2d718fdf2cf487","author_id":"5340213b9f9849b9220006d9","tab":"share","content":"<div class=\"markdown-text\"><p>现在应该都是用 AI 写代码了，然后为了节约成本，我经常找便宜的 AI 中转站，然后发现每家的计费逻辑都不一样：有的是 1:7 兑换，有的是 1:1 积分制，有的倍率是 1，有的又是 3。每次选的时候，光折算真实价格就要来回计算对比，非常心累。</p>\n<p>于是我自己整了个 AI 中转站比价网站 <a href=\"https://www.getcheapai.com\">getcheapai.com</a></p>\n<ul>\n<li>无论中转站计费方式如何，我全部统一换算成了每百万 Token 的真实人民币价格</li>\n<li>目前收录了十几家主流或者知名的中转站</li>\n<li>每 6 小时更新一次价格确保实时性</li>\n</ul>\n<p>站内的中转站链接带有我的 AFF，因为这个网站跑在 Cloudflare Workers 里，每个月要花 5 美元。如果介意的话，可以复制链接去掉 AFF。</p>\n</div>","title":"为了写代码时省点钱，我撸了个 AI 中转站比价网站 getcheapai.com","last_reply_at":"2026-03-21T14:03:20.113Z","good":false,"top":false,"reply_count":2,"visit_count":2543,"create_at":"2026-01-04T03:45:25.836Z","author":{"loginname":"lmk123","avatar_url":"https://avatars.githubusercontent.com/u/5035625?v=4&s=120"}},{"id":"69afc9e7cd2d71bf242cfde0","author_id":"59ef17a09cf198a85bd2e243","tab":"share","content":"<div class=\"markdown-text\"><p>本文带你零基础、零代码，快速借助 Coze 平台搭建一个漂流瓶匿名社交智能体，全程操作简单易懂，跟着步骤走就能完成。</p>\n<p><strong>核心功能</strong></p>\n<ul>\n<li><strong>扔瓶子</strong>：用户可通过智能体扔出漂流瓶，可用于日常吐槽、分享每日动态、交流经验、倾诉心情等，实现匿名表达。</li>\n<li><strong>捡瓶子</strong>：用户可通过智能体随机捡起一个漂流瓶，查看他人分享的内容，感受陌生人的情绪与故事，完成匿名社交互动。</li>\n</ul>\n<h1>一、准备工作：免费注册 Coze 账号</h1>\n<p>访问官网免费注册使用：<a href=\"https://www.coze.cn/home\">https://www.coze.cn/home</a></p>\n<h1>二、创建智能体</h1>\n<p>进入 Coze 平台后，点击创建智能体，自定义智能体名称（示例：「YY漂流瓶」），创建完成后进入详情页进行后续设置，操作界面如下：</p>\n<p><img src=\"https://s3.cichangelte.com/cichangelte/2026/03/08/d30cb90c-4c32-42db-9ad3-6aabbffa0ffb.png\" alt=\"创建智能体\"></p>\n<h2>2.1 人设与回复逻辑（直接复制使用）</h2>\n<p>在智能体「人设与回复」模块，复制以下内容粘贴，无需修改，可直接适配漂流瓶核心功能：</p>\n<pre class=\"prettyprint language-plaintext\"><code># 角色：\n\n你是YY漂流瓶，主要功能就2个，用户可以丢一个漂流瓶；用户可以捞起一个漂流瓶。\n\n以实现漂流瓶的匿名社交功能。\n\n\n## 技能：\n\n使用以下技能之前，都需要保证 token 变量有值，没有token或无效，需要先调用插件“apifm &#x2F; authorize”获取token，获取成功后，输出登录成功的消息，告知当前登录的用户编号\n\n插件参数说明：\n- sysUuid 传 sys_uuid 变量的值\n\n###  扔瓶子\n\n如果无法提取到用户经纬度数据，经纬度参数传0，调用插件 bottleMsg_publish 完成扔瓶子，成功后提示用户成功\n\n###  捞瓶子\n调用插件 bottleMsg_salvage \n\n## 限制：\n- 只能回复和和上面技能有关的问题\n</code></pre><h2>2.2 设置变量</h2>\n<p>变量设置用于存储用户信息和交互所需参数，步骤如下：</p>\n<ol>\n<li>\n<p>进入「记忆 → 变量」页面，勾选启用 sys_uuid、sys_longitude、sys_latitude 三个系统级变量，分别用于存储用户唯一标识、用户所在经度、用户所在纬度。</p>\n</li>\n<li>\n<p>添加用户变量：新增 token 变量，用于存储用户登录凭证，保障登录状态与功能正常使用。</p>\n</li>\n</ol>\n<p>变量设置完成后效果如下：</p>\n<p><img src=\"https://s3.cichangelte.com/cichangelte/2026/03/10/be65569a-5f84-4339-b1e2-5a7b42389de2.png\" alt=\"设置预览\"></p>\n<h2>2.3 添加插件</h2>\n<p>插件是实现漂流瓶核心功能的关键，进入「技能 → 插件」页面，点击「+」按钮，搜索「apifm」，添加以下3个插件，缺一不可：</p>\n<ul>\n<li>apifm / authorize</li>\n<li>apifm base / bottleMsg_publish</li>\n<li>apifm base / bottleMsg_salvage</li>\n</ul>\n<p><strong>插件功能说明</strong></p>\n<ul>\n<li>apifm / authorize：实现用户自动注册登录功能，生成用户唯一凭证，保障用户记忆和个性化服务正常运行。</li>\n<li>apifm base / bottleMsg_publish：实现「扔瓶子」功能，接收用户输入内容并完成漂流瓶发布。</li>\n<li>apifm base / bottleMsg_salvage：实现「捡瓶子」功能，随机获取其他用户发布的漂流瓶内容。</li>\n</ul>\n<p><strong>插件参数设置</strong></p>\n<p>每个插件右侧均有「齿轮」图标，点击即可进入设置界面，按以下要求配置（关键步骤，请勿出错）：</p>\n<ol>\n<li>apifm / authorize 插件设置设置界面如下：</li>\n</ol>\n<ul>\n<li>\n<p>sysUuid 参数：直接选中引用系统参数的值（无需手动输入）；</p>\n</li>\n<li>\n<p>domain：填写自己的api工厂后台专属域名，填写完成后关闭右侧开关（关闭后，AI将直接使用填写的域名）；</p>\n</li>\n<li>\n<p>merchantKey：填写自己的api工厂后台商户密钥，填写完成后关闭右侧开关（关闭后，AI将直接使用填写的密钥）。</p>\n</li>\n</ul>\n<p><img src=\"https://s3.cichangelte.com/cichangelte/2026/03/10/2f4319cf-d107-4406-9ea2-901759ef85f7.png\" alt=\"设置预览\"></p>\n<ol>\n<li>bottleMsg_publish 和 bottleMsg_salvage 插件设置设置界面如下：</li>\n</ol>\n<ul>\n<li>\n<p>token 参数：直接选中引用系统参数的值（无需手动输入）；</p>\n</li>\n<li>\n<p>domain：填写自己的api工厂后台专属域名，填写完成后关闭右侧开关（关闭后，AI将直接使用填写的域名）。</p>\n</li>\n</ul>\n<p><img src=\"https://s3.cichangelte.com/cichangelte/2026/03/10/364ef93a-c225-4994-a00c-942b8e53f333.png\" alt=\"设置预览\"></p>\n<pre class=\"prettyprint\"><code>💡测试账号说明：如果没有自己的api工厂专属域名和商户密钥，可使用以下测试账号进行调试，直接复制填写即可：\ndomain： wxapi\nmerchantKey： 1ecf17ea389ebb5ccd5e258e390d3696\n</code></pre><h2>2.4 其他设置</h2>\n<p>平台默认设置已可满足漂流瓶基本使用需求，无需额外修改；若需优化体验，可按需调整「开场白」「语音音色」「交互风格」等，让智能体更贴合个人需求或业务场景。</p>\n<h1>三、在线测试与效果预览</h1>\n<p>设置完成后，可通过平台右侧实时测试窗口，模拟用户「扔瓶子」「捡瓶子」操作，边测试边调整参数，直至智能体回复符合预期，测试界面如下：</p>\n<p><img src=\"https://s3.cichangelte.com/cichangelte/2026/03/10/cdc09c6a-ce62-4f78-8f34-087f977d34bd.png\" alt=\"设置预览\"></p>\n<h1>四、正式发布</h1>\n<p>测试无误后，点击页面右上角「发布」按钮，无需审核，发布后即时生效，任何人可直接访问该智能体，进行漂流瓶匿名社交互动。</p>\n<h1>五、效果展示</h1>\n<h2>5.1 扔瓶子效果</h2>\n<p>用户发送扔瓶子指令后，智能体接收内容并完成发布，反馈成功提示，效果如下：</p>\n<p><img src=\"https://s3.cichangelte.com/cichangelte/2026/03/10/6f104dec-0d43-40c2-88c6-886438ff4965.png\" alt=\"扔瓶子\"></p>\n<h2>5.2 捡瓶子效果</h2>\n<p>用户发送捡瓶子指令后，智能体随机获取一个漂流瓶内容并展示，效果如下：</p>\n<p><img src=\"https://s3.cichangelte.com/cichangelte/2026/03/10/dbfafd42-bc12-4287-8081-5c4f3e26cdc4.png\" alt=\"捡瓶子\"></p>\n<h1>总结</h1>\n<p>本教程全程零代码、零基础，通过 Coze 平台快速搭建漂流瓶匿名社交智能体，核心步骤可总结为「注册账号 → 创建智能体 → 配置人设与变量 → 添加插件并设置 → 测试 → 发布」。整个过程操作简单，无需专业技术，借助 Coze 平台的可视化操作和插件功能，即可快速实现匿名漂流瓶的核心社交功能。\n测试账号可满足调试需求，若需长期使用，建议注册自己的api工厂账号，获取专属域名和商户密钥，保障功能稳定运行。后续可根据个人需求，优化智能体的交互风格、开场白等细节，提升用户体验。无论是用于个人兴趣交流，还是小型社交场景搭建，这个智能体都能快速落地使用。</p>\n</div>","title":"小白教程：使用 Coze 构建漂流瓶匿名社交智能体","last_reply_at":"2026-03-10T07:36:07.160Z","good":false,"top":false,"reply_count":0,"visit_count":1170,"create_at":"2026-03-10T07:36:07.160Z","author":{"loginname":"gooking","avatar_url":"https://avatars.githubusercontent.com/u/7286469?v=4&s=120"}},{"id":"69ad4d4fcd2d716d0c2cfdd0","author_id":"59ef17a09cf198a85bd2e243","tab":"share","content":"<div class=\"markdown-text\"><p>本文带你零基础、零代码，用 Coze 平台快速搭建一个可直接上线使用的智能客服智能体。你只需在本文基础上优化人设、完善知识库，即可快速落地产品级客服能力。</p>\n<p><strong>核心功能</strong></p>\n<ul>\n<li>自动理解用户问题，基于知识库精准回复</li>\n<li>未知问题自动转为用户反馈并后台保存，支持微信 / 钉钉 / 邮件实时通知，持续迭代知识库</li>\n</ul>\n<h1>一、准备工作：免费注册 Coze 账号</h1>\n<p>访问官网免费注册使用：<a href=\"https://www.coze.cn/home\">https://www.coze.cn/home</a></p>\n<h1>二、创建专属知识库</h1>\n<p><img src=\"https://s3.cichangelte.com/cichangelte/2026/03/08/673644df-8c9b-488a-80d9-48592f437324.png\" alt=\"创建专属知识库\"></p>\n<p>根据业务需求自定义知识库名称，例如「智能客服知识库」。</p>\n<p>Coze 支持绝大多数文档格式，也可直接填入在线文档 URL 自动导入。</p>\n<p><strong>测试知识库示例（可直接复制）</strong></p>\n<pre class=\"prettyprint\"><code>1）质量检查和软件测试有什么区别？\nQA（质量保证）关注软件开发过程的质量；软件测试确保最终产品功能符合用户需求。\n\n2）什么是 Testware？\nTestware 是测试用例、测试数据、测试计划等测试相关工件。\n\n3）构建和发布之间有什么区别？\n构建：开发团队提供给测试团队的安装包。\n发布：测试&#x2F;开发团队交付给客户的正式安装包。\n\n4）SQA 团队在自动化中面临哪些挑战？\n自动化工具掌握、脚本复用、用例适配性、复杂用例自动化。\n\n5）什么是漏洞泄漏和漏洞释放？\n错误发布：已知缺陷但优先级低，先行交付测试。\n错误泄漏：客户发现测试团队未检出的缺陷。\n\n6）什么是数据驱动测试？\n从 csv、excel 等文件读取测试数据，在被测系统上自动化执行。\n</code></pre><h1>三、创建智能客服智能体</h1>\n<p><img src=\"https://s3.cichangelte.com/cichangelte/2026/03/08/d30cb90c-4c32-42db-9ad3-6aabbffa0ffb.png\" alt=\"创建智能客服智能体\"></p>\n<p>自定义智能体名称，例如「智能客服智能体」。</p>\n<h2>3.1 人设与回复逻辑（直接复制使用）</h2>\n<pre class=\"prettyprint\"><code># 角色\n你叫小美，是一位资深QA专家，有任何QA方面的问题都可以咨询我。\n\n## 回答主题简介\n我是杭州飞的高科技公司的客服人员，帮你提供在线咨询服务。\n\n## 工作流程\n### 步骤一：问题理解与回复分析\n1. 认真理解从知识库中召回的内容和用户输入的问题，判断是否为有效答案。\n2. 若问题模糊、信息不足，主动追问用户，确保准确理解需求。\n\n### 步骤二：回答用户问题\n1. 与QA主题无关的问题，礼貌拒绝回答。\n2. 知识库无相关内容时，统一回复：\n“对不起，我已学习的知识中不包含问题相关内容，暂时无法提供答案。如果你有相关问题，请给我们留言，我们将记录并及时处理。”\n并引导用户留下联系方式，通过 comment_add 插件提交反馈，返回记录编号作为回执。\n3. 有匹配知识时，仅提取相关内容，整理为**精准、简洁**的答案回复。\n4. 按判断返回对应文档链接，无需说明来源。\n\n## 限制\n1. 禁止回答与QA无关的问题。\n2. 统一使用Markdown格式回复。\n</code></pre><h2>3.2 引入知识库</h2>\n<p>在中间栏「知识」点击 +，绑定已创建的知识库。</p>\n<p>用户提问时，智能体会自动检索知识并整理回复。</p>\n<h2>3.3 添加留言反馈插件</h2>\n<p>在「技能 → 插件」点击 +，搜索 apifm，添加 apifm common / comment_add。</p>\n<p><strong>作用：</strong></p>\n<p>智能体无法回答时，自动保存用户问题到后台</p>\n<p>返回反馈编号给用户</p>\n<p>支持微信 / 钉钉 / 邮件实时通知管理员，用于迭代知识库</p>\n<h2>3.4 其他设置</h2>\n<p>默认即可满足使用；可按需调整开场白、语音音色、交互风格等，让智能体更贴合业务。</p>\n<h1>四、在线测试与效果预览</h1>\n<p><img src=\"https://s3.cichangelte.com/cichangelte/2026/03/08/fb3dad8e-9764-442d-ad2d-12d6bdf70002.png\" alt=\"设置预览\"></p>\n<p>右侧为实时测试窗口，边测边调，直到回复符合预期。</p>\n<h1>五、正式发布</h1>\n<p>点击右上角「发布」，无需审核、即时生效，任何人可直接访问使用。</p>\n<h1>六、效果展示</h1>\n<h2>场景 1：知识库匹配 → 精准回复</h2>\n<p><img src=\"https://s3.cichangelte.com/cichangelte/2026/03/08/fa20b34f-200b-4241-873e-533857bc1120.png\" alt=\"问题一\"></p>\n<p><img src=\"https://s3.cichangelte.com/cichangelte/2026/03/08/77d4f3b6-0fee-4a07-af5c-faf6c3728878.png\" alt=\"答复一\"></p>\n<h2>场景 2：无知识 → 自动保存反馈并通知</h2>\n<p><img src=\"https://s3.cichangelte.com/cichangelte/2026/03/08/cdd8fd7a-04d5-4ae4-90ef-fd427234bd1b.png\" alt=\"要求提供联系方式\"></p>\n<p><img src=\"https://s3.cichangelte.com/cichangelte/2026/03/08/76a0a239-0a0e-466a-9446-64ee3d8675c5.png\" alt=\"收录成功\"></p>\n<p><img src=\"https://s3.cichangelte.com/cichangelte/2026/03/08/3cc640e4-aab5-4a91-ae5a-0f40c6163640.png\" alt=\"后台效果\"></p>\n<p><img src=\"https://s3.cichangelte.com/cichangelte/2026/03/08/8e067c28-4b81-4a66-883c-9c0ada21e3f6.png\" alt=\"微信提醒\"></p>\n<h1>总结</h1>\n<p>借助 Coze 平台，我们仅用不到 10 分钟就完成了从注册、建库、配置到发布的全流程，快速拥有了一个具备自动问答、未知问题反馈、实时通知、可直接商用的智能客服智能体。整套方案零代码、低成本、易维护，既能大幅降低人工客服压力，又能通过用户反馈持续迭代知识库，让智能体越用越聪明。无论是个人测试、团队效率提升还是企业业务落地，这套流程都具备极强的实用性与可复制性，是快速实现 AI 客服落地的最佳实践之一。</p>\n</div>","title":"10 分钟极速上手：使用 Coze 快速搭建可商用级智能客服智能体","last_reply_at":"2026-03-08T10:19:59.130Z","good":false,"top":false,"reply_count":0,"visit_count":1142,"create_at":"2026-03-08T10:19:59.130Z","author":{"loginname":"gooking","avatar_url":"https://avatars.githubusercontent.com/u/7286469?v=4&s=120"}},{"id":"69a551e2cd2d7169382cfd7d","author_id":"59ef17a09cf198a85bd2e243","tab":"share","content":"<div class=\"markdown-text\"><p>在餐饮、校园、社区小店等线下消费场景中，会员卡（饭卡）储值消费系统是提升运营效率、沉淀私域用户的核心工具。很多中小商户想搭建一套适配自身场景的储值消费系统，却常常被复杂的开发流程、高昂的定制成本拦住脚步。今天就从实操角度，聊聊如何基于 Uniapp 快速搭建一套轻量化的会员卡储值消费系统，兼顾实用性与易用性。\n为什么选择 Uniapp 开发储值消费系统？\nUniapp 的跨端特性是核心优势 —— 一套代码可同时适配微信小程序、App、H5 等多端，无需为不同终端单独开发，大大降低了开发和维护成本。对于聚焦线下消费场景的储值消费系统来说，多端适配能覆盖用户的不同使用习惯：商户可通过后台管理，用户则能通过小程序快速完成充值、消费，无需下载额外 App，体验更轻量化。\n储值消费系统的核心功能设计与实现思路\n一套实用的会员卡储值消费系统，无需追求 “大而全”，聚焦核心场景即可满足中小商户的需求，核心可围绕这几个维度设计：</p>\n<ol>\n<li>自助充值与消费：减少人工干预，提升效率\n线下消费场景中，人工充值、记账不仅效率低，还容易出现错账、漏账问题。在系统设计时，可开发自助充值模块 —— 用户通过小程序绑定会员卡后，自主选择充值金额、支付方式完成储值；消费时只需出示核销码或刷卡，系统自动扣除对应金额，全程无需店员操作。同时，系统需内置消费规则校验，比如最低消费、储值余额不足提醒等，既保障商户资金安全，也让用户消费更顺畅。</li>\n<li>会员折扣体系：增强用户粘性\n单纯的储值功能难以留住用户，会员等级与折扣体系是提升复购的关键。在系统中可设计分级会员机制，比如根据储值金额或消费次数划分普通会员、银卡会员、金卡会员，不同等级对应不同消费折扣。开发时可将折扣规则配置化，商户无需修改代码，就能在后台调整不同等级的折扣比例、生效时间，适配节日促销、日常优惠等不同场景。</li>\n<li>消费记录溯源：透明化提升信任\n用户对储值资金的 “安全感”，来自清晰的消费明细。系统需实现消费、储值记录的实时查询功能，每条记录包含时间、金额、消费门店、交易类型等信息，用户可随时查看，商户也能通过后台导出明细对账。技术层面可通过数据库结构化存储交易数据，搭配前端列表渲染和筛选功能，让记录查询更便捷。</li>\n<li>动态消息通知：重要信息不遗漏\n商户的优惠活动、系统公告、用户的充值到账提醒、消费通知等，都需要及时触达。系统可集成消息推送功能，支持公告置顶、精准推送，比如用户储值后自动发送到账提醒，商户发布新优惠时推送给对应等级的会员，提升信息触达效率。\n轻量化系统的落地实践：兼顾实用性与易维护性\n中小商户的系统需求核心是 “好用、好维护”，因此在开发时需避免过度复杂的架构设计：\n前端基于 Uniapp 的组件化开发，复用充值、消费、记录查询等核心组件，降低开发成本；\n后端采用轻量化框架，聚焦数据存储、交易逻辑校验，无需搭建复杂的分布式架构；\n界面设计贴合线下消费场景的使用习惯，简化操作流程，无论是店员还是用户，无需培训就能快速上手。\n这套基于 Uniapp 开发的会员卡储值消费系统，正是围绕上述思路打造 —— 聚焦线下消费的核心痛点，用轻量化的技术方案实现自助储值、会员折扣、消费溯源、消息通知等核心功能，既满足商户数字化管理的需求，也让用户的充值消费体验更便捷。\n开源项目参考：站在巨人的肩膀上开发\n如果想快速落地这套系统，无需从零编写代码，可参考以下开源项目，结合自身场景做二次开发：</li>\n</ol>\n<p><a href=\"https://github.com/gooking/mealcard\">GITHUB</a>\n<a href=\"https://gitee.com/javazj/mealcard\">码云镜像地址</a>\n<a href=\"https://gitcode.com/gooking2/mealcard\">GitCode</a></p>\n<p>这些开源项目提供了完整的 Uniapp 前端代码和后端逻辑，涵盖了储值、消费、会员管理等核心功能，可直接部署试用，也能根据商户的具体需求（比如增加门店管理、多端核销等）进行定制开发。\n总结\n搭建一套轻量化的会员卡储值消费系统，核心是聚焦线下消费的真实场景，用适配的技术方案解决效率、信任、用户粘性等核心问题。Uniapp 的跨端优势让系统适配成本更低，而开源项目则能大幅缩短开发周期，中小商户无需投入高昂成本，也能实现线下消费的数字化管理，助力私域流量运营和客户留存。</p>\n</div>","title":"基于Uniapp的会员卡储值消费系统开发实践","last_reply_at":"2026-03-02T09:01:22.122Z","good":false,"top":false,"reply_count":0,"visit_count":1164,"create_at":"2026-03-02T09:01:22.122Z","author":{"loginname":"gooking","avatar_url":"https://avatars.githubusercontent.com/u/7286469?v=4&s=120"}},{"id":"69a52216cd2d711f582cfd5c","author_id":"5110f2bedf9e9fcc584e4677","tab":"share","content":"<div class=\"markdown-text\"><p><a href=\"http://WorldEnd.ai\">WorldEnd.ai</a> 利用最新的大模型来预测世界末日可能出现的各种形式 —— 分析全球风险，并对人类的长期发展轨迹做出发人深省的预测。\n这并非为了制造恐慌，而是为了探索、提升风险意识，并就未来展开更深入的对话。</p>\n<p>Website: <a href=\"https://worldend.ai\">https://worldend.ai</a>\nGitHub: <a href=\"https://github.com/nswbmw/worldend.ai/\">https://github.com/nswbmw/worldend.ai</a></p>\n<h2>屏幕截图</h2>\n<p><img src=\"https://github.com/nswbmw/worldend.ai/raw/master/screenshots/dark.png\" alt=\"dark\"></p>\n<p><img src=\"https://github.com/nswbmw/worldend.ai/raw/master/screenshots/light.png\" alt=\"light\"></p>\n<h2>技术栈</h2>\n<ul>\n<li><a href=\"https://github.com/hoa-js/hoa\">Hoa</a> - 轻量级 Web 框架</li>\n<li>Cloudflare Workers - 边缘计算平台</li>\n<li>Cloudflare KV - 缓存</li>\n<li>Cloudflare D1 - 数据库</li>\n<li>Cloudflare R2 - 存储</li>\n</ul>\n</div>","title":"WorldEnd.ai —— AI 生成的世界末日预言","last_reply_at":"2026-03-02T05:37:26.584Z","good":false,"top":false,"reply_count":0,"visit_count":1068,"create_at":"2026-03-02T05:37:26.584Z","author":{"loginname":"nswbmw","avatar_url":"https://avatars0.githubusercontent.com/u/4279697?v=4&s=120"}},{"id":"69730c33cd2d712a1a2cfbd2","author_id":"60460ff34655eaadc021a4db","tab":"share","content":"<div class=\"markdown-text\"><h1>铜钟 Tonzhon 音乐平台官网：<a href=\"https://tonzhon.whamon.com/\">https://tonzhon.whamon.com/</a></h1>\n<p>铜钟 Tonzhon 是一个主打「听歌」功能的 web app, 致力于为人们带来卓越的听歌体验。铜钟有着丰富的音乐资源，干净清爽的 UI 和方便的交互。在铜钟上，你不仅可以方便地找到并聆听你喜欢的歌曲，还可以将它们保存下来。</p>\n<p>铜钟上的一切内容都是与音乐直接相关的，没有广告，社交和直播，不会干扰你的听歌心情。在铜钟上，你可以沉浸到属于你自己一个人的那片天地，忘却世间的纷纷扰扰…</p>\n<p>铜钟 Tonzhon 也推出了 App，小程序 和 铜钟 for Mac or Windows，都在 <a href=\"https://tonzhon.whamon.com\">https://tonzhon.whamon.com</a> 的侧边栏里，欢迎大家试用。</p>\n<h1>GitHub: <a href=\"https://github.com/enzeberg/tonzhon-music\">https://github.com/enzeberg/tonzhon-music</a></h1>\n<p>欢迎大家提需求、提 issue、提 PR…</p>\n</div>","title":"听歌用铜钟 Tonzhon，写 Node.js 牛逼哄哄！","last_reply_at":"2026-01-26T14:55:24.494Z","good":false,"top":false,"reply_count":1,"visit_count":1852,"create_at":"2026-01-23T05:50:43.532Z","author":{"loginname":"enzeberg","avatar_url":"https://avatars.githubusercontent.com/u/18072932?v=4&s=120"}},{"id":"60534c9adac542387be2833c","author_id":"60460ff34655eaadc021a4db","tab":"share","content":"<div class=\"markdown-text\"><h1>铜钟 Tonzhon 音乐平台官网：<a href=\"https://tonzhon.whamon.com/\">https://tonzhon.whamon.com/</a></h1>\n<p>GitHub: <a href=\"https://github.com/enzeberg/tonzhon-music\">https://github.com/enzeberg/tonzhon-music</a></p>\n<p><img src=\"//static.cnodejs.org/FokK9_au0Oxlmg5X_IAfcswMOrAt\" alt=\"860_140_r25.png\"></p>\n<h2>关于铜钟</h2>\n<p>铜钟 Tonzhon 是一个专注于「听歌」的音乐网站 (Web App), 致力于为人们带来卓越的听歌体验。铜钟有着丰富的音乐资源，简洁清爽的 UI 和方便的交互。在铜钟上，你不仅可以方便地找到并聆听你喜欢的歌曲，还可以将它们保存下来。</p>\n<p>铜钟上的一切内容都是与音乐直接相关的，没有社交，没有广告，不会干扰你的听歌心情。在铜钟上，你可以沉浸到属于你自己一个人的那片天地，忘却世间的纷纷扰扰…</p>\n<h2>功能</h2>\n<ul>\n<li>搜索歌曲</li>\n<li>播放歌曲 (支持播放列表)</li>\n<li>滚动歌词</li>\n<li>保存歌曲</li>\n<li>创建歌单</li>\n<li>发现歌单，播放歌单，收藏歌单</li>\n<li>导入专辑</li>\n</ul>\n<h2>特点</h2>\n<ul>\n<li>歌曲丰富，找歌方便</li>\n<li>播放器带感，听歌方便</li>\n<li>界面简洁，重点突出</li>\n<li>交互方便</li>\n<li>专注于音乐，没有干扰</li>\n<li>没有社交</li>\n<li>没有广告</li>\n</ul>\n<h2>隐藏操作</h2>\n<ul>\n<li>双击歌曲可播放</li>\n</ul>\n<h2>快捷键</h2>\n<ul>\n<li>空格键: 播放 / 暂停</li>\n</ul>\n<h2>技术</h2>\n<ul>\n<li>Express.js</li>\n<li>React</li>\n</ul>\n<p>欢迎大家交流看法！</p>\n</div>","title":"分享一下我用 Node.js 写的音乐网站","last_reply_at":"2026-01-23T06:00:11.973Z","good":false,"top":false,"reply_count":21,"visit_count":19107,"create_at":"2021-03-18T12:50:34.145Z","author":{"loginname":"enzeberg","avatar_url":"https://avatars.githubusercontent.com/u/18072932?v=4&s=120"}},{"id":"697055f0cd2d71365b2cfb93","author_id":"6951f394cd2d7153a82cf13a","tab":"share","content":"<div class=\"markdown-text\"><p>最近 Claude Code skills 很火，对我来说和 agnet 、扣子没啥区别。\n能火我感觉主要是扩大了人群使用范围，小白也上手。\n每个行业都有 N 多个 skills ，想着做一个导航网站，把鱼龙混杂的 skills 精选出来。\n工具目的是解决问题，实用好用才是王道。\n去年 12 月注册的域名，纠结拖延快一个月，终于第一版打磨 5 天，要上线了。\n好多功能还没加，还有很多 BUG ，希望大家能多给给意见。</p>\n<p>下面体验：\n<a href=\"https://agent-skills.cc/\">Agent – Claude Code skills 精选导航站</a></p>\n</div>","title":"最近 skills 很火，我从收集的6w+ agnet-skills中精选出 1000+好用/实用/有趣的 claude code skills，今天更新中","last_reply_at":"2026-01-21T04:28:32.120Z","good":false,"top":false,"reply_count":0,"visit_count":1886,"create_at":"2026-01-21T04:28:32.120Z","author":{"loginname":"xiaolige","avatar_url":"https://avatars.githubusercontent.com/u/251593309?v=4&s=120"}},{"id":"682a3b1a982e400de6722c81","author_id":"60d169c1248d04e60a4ae5de","tab":"ask","content":"<div class=\"markdown-text\"><p>最近在找工作，感觉很卷，真的完蛋了吗</p>\n</div>","title":"35岁的前端真的完蛋了吗？","last_reply_at":"2026-01-17T13:06:21.877Z","good":false,"top":false,"reply_count":19,"visit_count":8015,"create_at":"2025-05-18T19:55:06.731Z","author":{"loginname":"dyjiang","avatar_url":"https://avatars.githubusercontent.com/u/37732251?v=4&s=120"}},{"id":"5ed4f1c682b588109b647030","author_id":"53e1802fbd3cc3e50ba9e311","tab":"share","content":"<div class=\"markdown-text\"><p>Deno 中文社区来了，<a href=\"https://deno.js.cn\">https://deno.js.cn</a></p>\n<p>------------ 分割线 -----------</p>\n<p>10 年前的 2009 年 Node.js 首次发布，我从一名 Java 程序员转行为了 JavaScript 程序员。ry 也成为了我心中的偶像之一。</p>\n<p>10 年后的 2019 年 Node.js 与 Deno 之父 ry 首次来中国旅游，期间给我发了一封邮件，邀请我在北京喝咖啡，并讨论一下 Deno 的未来开发计划。</p>\n<p><img src=\"//static.cnodejs.org/FrE4iRKmfLPym1cu1-BWCS64G9ay\" alt=\"justjavac 与 nodejs/deno 之父 ry\"></p>\n<p>去年我开始在国内写 Deno 技术文章，今年我成为了 Deno 核心代码的贡献者。完成了多个 WHATWG 规范兼容性的实现，并为 VSCode 开发了支持 Deno 的扩展（vscode-deno）。</p>\n<p>在 Deno 1.0 正式版发布前夕，我为 Deno 开发的 VS Code 扩展也被移入到了官方仓库。<a href=\"https://github.com/denoland/vscode_deno/commit/37c7ad34248506bf778d89b3ab755f6920c705cf\">https://github.com/denoland/vscode_deno/commit/37c7ad34248506bf778d89b3ab755f6920c705cf</a>，目前依然由我在维护。</p>\n<p>欢迎来 <a href=\"https://deno.js.cn/\">Deno 中文社区</a>交流。</p>\n<p>帖子索引：</p>\n<ul>\n<li><a href=\"https://deno.js.cn/t/topic/32\">了不起的 Deno 入门篇</a></li>\n<li><a href=\"https://deno.js.cn/t/topic/35\">了不起的 Deno 实战教程</a></li>\n<li><a href=\"https://deno.js.cn/t/topic/37\">Deno bytes 模块全解析</a></li>\n<li><a href=\"https://deno.js.cn/t/topic/38\">Deno 入门手册：附大量 TypeScript 代码实例</a></li>\n</ul>\n<p><em>★,°</em>:.☆(￣▽￣)/$:<em>.°★</em> 。</p>\n</div>","title":"Deno 中文社区来了 deno.js.cn","last_reply_at":"2026-01-12T14:06:40.749Z","good":true,"top":false,"reply_count":13,"visit_count":14293,"create_at":"2020-06-01T12:17:10.825Z","author":{"loginname":"justjavac","avatar_url":"https://avatars.githubusercontent.com/u/359395?v=4&s=120"}},{"id":"68d2861ff135766239083a29","author_id":"59ef17a09cf198a85bd2e243","tab":"share","content":"<div class=\"markdown-text\"><p>本文将对一款基于 uni-app 开发的废品回收类多端应用，从多端支持范围、核心功能模块及部分界面展示进行客观说明，相关资源信息也将一并呈现。</p>\n<h1>一、多端支持范围</h1>\n<p>该应用基于 uni-app 技术开发，支持打包为多终端形态，具体覆盖以下场景：\nH5 端\n多平台小程序（微信、支付宝、小红书、抖音等）\nApp 端（适配 Android 与 iOS 两大移动操作系统）</p>\n<h1>二、核心功能模块说明</h1>\n<p>当前版本应用包含两大核心功能模块，各模块的作用与操作逻辑如下：</p>\n<ol>\n<li>废品回收商家入驻模块\n此模块主要服务于废品回收商家的平台入驻需求，入驻后可实现以下操作：\n接收用户发起的回收订单；\n完成回收服务后，在系统内录入回收总量及对应回收金额。\n同时，用户可依据所在城市维度及当前定位，获取附近已入驻商家的推荐结果，进而选择 “预约上门回收” 或 “自行到店回收” 两种服务方式。</li>\n<li>用户回收预约模块\n该模块为用户提供废品回收预约的全流程功能，具体操作步骤包括：\n选择预约上门时间、废品类型，填写预计回收总量，上传废品照片及补充描述信息，提交后即完成回收预约；\n回收服务完成后，用户可获得相应收益与积分；\n用户可通过应用内指定界面，提交收益提现申请。</li>\n<li>后续功能说明\n除上述已实现的核心模块外，其他功能将以 “后续版本发布说明” 为准，具体更新内容需参考官方后续公示的信息。</li>\n</ol>\n<h1>三、相关资源获取地址</h1>\n<p>该应用的开发资源及代码可通过以下平台获取，供技术研究或参考使用：\n<a href=\"https://github.com/gooking/recycle\">Github 地址</a>\n<a href=\"https://gitee.com/javazj/recycle\">码云镜像地址</a>\n<a href=\"https://gitcode.com/gooking2/recycle\">GitCode 镜像地址</a></p>\n</div>","title":"基于 uni-app 开发的废品回收类多端应用功能与界面说明","last_reply_at":"2026-01-12T12:55:52.254Z","good":false,"top":false,"reply_count":2,"visit_count":4060,"create_at":"2025-09-23T11:35:59.039Z","author":{"loginname":"gooking","avatar_url":"https://avatars.githubusercontent.com/u/7286469?v=4&s=120"}},{"id":"67bf20fd2b5f0569b8344fea","author_id":"67a4287f2b5f050e26344a9a","tab":"share","content":"<div class=\"markdown-text\"><p>清华大学发布：DeepSeek如何赋能职场应用？——从提示语技巧到多场景应用（文末可下载PDF）\n下载见：<a href=\"https://aitanjin.ai-51.com/topic/29042\">清华大学发布：DeepSeek如何赋能职场应用？——从提示语技巧到多场景应用（文末可下载PDF）</a></p>\n<p><img src=\"//static.cnodejs.org/FuzoluooNJUZgNtezTrB2ykuTMYn\" alt=\"1215750e19033045e4db727531ac484a228941.jpeg\"></p>\n<p>下载见：<a href=\"https://aitanjin.ai-51.com/topic/29042\">清华大学发布：DeepSeek如何赋能职场应用？——从提示语技巧到多场景应用（文末可下载PDF）</a>\n——来自「AI探金」社区</p>\n</div>","title":"清华大学发布：DeepSeek如何赋能职场应用？——从提示语技巧到多场景应用（文末可下载PDF）","last_reply_at":"2026-01-09T07:44:43.051Z","good":false,"top":false,"reply_count":1,"visit_count":2863,"create_at":"2025-02-26T14:11:09.541Z","author":{"loginname":"bosscoming","avatar_url":"//gravatar.com/avatar/dbcc675b407301c301ecba00f2236244?size=48"}},{"id":"695f922dcd2d7182502cf648","author_id":"64eb5eca75a2d7e2161ac346","tab":"share","content":"<div class=\"markdown-text\"><p>全栈开发在线接单</p>\n<p>专注解决前后端各类开发问题，承接多端定制开发与BUG修复，支持远程一对一技术服务，先做满意再付款，诚信合作。</p>\n<p>前端精通 Vue2/Vue3、React、React Native、Uniapp、Taro 等主流框架，可定制 PC 网页、小程序、APP 及 Electron 桌面端；熟练运用 Nuxt.js、Next.js 进行服务端渲染开发，掌握 WebGL 技术实现交互特效。</p>\n<p>服务端擅长 Java、Nest.js、Node.js、Golang 技术栈，可承接后端架构搭建、接口开发与管理系统开发。</p>\n<p>合作流程规范，可协助梳理需求、出具专属技术方案，高效响应各类开发需求，欢迎咨询洽谈。</p>\n</div>","title":"全栈开发在线接单","last_reply_at":"2026-01-08T11:17:01.517Z","good":false,"top":false,"reply_count":0,"visit_count":1960,"create_at":"2026-01-08T11:17:01.517Z","author":{"loginname":"it_zhiijia","avatar_url":"//gravatar.com/avatar/fc34ad5413a9b07a5056361686b7d66e?size=48"}},{"id":"692578af05080cbccbc2b202","author_id":"5110f2bedf9e9fcc584e4677","tab":"share","content":"<div class=\"markdown-text\"><p>我使用 Koa 很多年了，一直很喜欢它简洁的设计哲学。近几年在 Cloudflare Worker 上开发较多，接触到了 Hono。Hono 也是一个不错的框架，但在深入使用后，我对它的一些设计理念并不是很认同，于是萌生了自己造个轮子的想法。</p>\n<p>我为新框架设定了三条核心原则：</p>\n<ol>\n<li>微内核架构：与 Koa 类似，保留了洋葱模型的中间件设计，同时还补充了插件系统</li>\n<li>符合直觉的 API 设计：摒弃 Koa 的 delegates 思路，API 严格区分 ctx/ctx.req/ctx.res，更加符合语义</li>\n<li>环境无关性：可在 Node.js、Bun、Deno 以及 Cloudflare Worker、Vercel 等边缘环境运行</li>\n</ol>\n<p>于是 Hoa 诞生了。目前我跟另一个维护者已经为 Hoa 补充了 30+ 常用中间件，我也已经将手头大部分项目从 Koa 迁移至 Hoa。今天分享出来，希望更多人去使用，也期待收到更多反馈，共同把 Hoa 框架打磨得更好。</p>\n<ul>\n<li>GitHub: <a href=\"https://github.com/hoa-js/hoa\">hoa</a></li>\n<li>官网: <a href=\"https://hoa-js.com\">hoa-js.com</a></li>\n</ul>\n<h3>特点</h3>\n<ul>\n<li>⚡ Minimal - Only ~4.4KB (gzipped).</li>\n<li>🚫 Zero Dependencies - Built on modern Web Standards with no external dependencies.</li>\n<li>🛠️ Highly Extensible - Features a flexible extension and middleware system.</li>\n<li>😊 Standards-Based - Designed entirely around modern Web Standard APIs.</li>\n<li>🌐 Multi-Runtime - The same code runs on Cloudflare Workers, Deno, Bun, Node.js, and more.</li>\n<li>✅ 100% Tested – Backed by a full-coverage automated test suite.</li>\n</ul>\n<h3>安装</h3>\n<pre class=\"prettyprint language-bash\"><code>npm i hoa --save\n</code></pre><h3>快速开始</h3>\n<pre class=\"prettyprint language-js\"><code>import { Hoa } from &#x27;hoa&#x27;\nconst app = new Hoa()\n\napp.use(async (ctx, next) =&gt; {\n  ctx.res.body = &#x27;Hello, Hoa!&#x27;\n})\n\nexport default app\n</code></pre><h3>License</h3>\n<p>MIT</p>\n</div>","title":"Hoa - 一个极简 Web 框架","last_reply_at":"2025-12-30T03:31:53.848Z","good":false,"top":false,"reply_count":3,"visit_count":2635,"create_at":"2025-11-25T09:36:47.042Z","author":{"loginname":"nswbmw","avatar_url":"https://avatars0.githubusercontent.com/u/4279697?v=4&s=120"}},{"id":"693a77f7d36b80ca695c861f","author_id":"6859311cf13576707e082674","tab":"share","content":"<div class=\"markdown-text\"><p>多语言在线代码执行平台<a href=\"https://runcode.blendviewer.com/\">RunCode</a>，支持 60+ 种编程语言，AI辅助编程，智能混合执行架构，即写即运行。</p>\n<ul>\n<li>🌐 <strong>智能混合执行</strong> - 浏览器 WASM + 云端容器，自动选择最佳执行方式</li>\n<li>🚀 <strong>60+ 语言支持</strong> - Python, JavaScript, TypeScript, C/C++, Rust, Go, Java, Haskell, Shell 等</li>\n<li>⚡ <strong>即时执行</strong> - 热门语言零延迟，浏览器直接运行</li>\n<li>🎨 <strong>现代 UI</strong> - shadcn/ui + Tailwind CSS</li>\n<li>💻 <strong>专业编辑器</strong> - Monaco Editor</li>\n<li>🌙 <strong>主题切换</strong> - 深色/浅色模式</li>\n</ul>\n<p><img src=\"//static.cnodejs.org/FrlaY59V8xx-Gz5tg6HIzAg7lGbK\" alt=\"Screenshot_11-12-2025_154256_runcode.blendviewer.com.jpeg\"></p>\n<p><img src=\"//static.cnodejs.org/Fskxk2lNsK5faNGRCEYqdRw4AtEF\" alt=\"Screenshot_11-12-2025_154427_runcode.blendviewer.com.jpeg\"></p>\n<p><img src=\"//static.cnodejs.org/FrL38YUIait9pAm-OiUBDjFvJ0C-\" alt=\"Screenshot_11-12-2025_154449_runcode.blendviewer.com.jpeg\"></p>\n</div>","title":"一个神奇的在线代码执行平台：RunCode","last_reply_at":"2025-12-11T07:51:19.516Z","good":false,"top":false,"reply_count":0,"visit_count":2138,"create_at":"2025-12-11T07:51:19.516Z","author":{"loginname":"openrc","avatar_url":"//gravatar.com/avatar/b73609b0c88e29e1fae0aad98d378dfb?size=48"}},{"id":"693a607ad36b80a7d95c860c","author_id":"68e4cde5f1357670d9083ce3","tab":"share","content":"<div class=\"markdown-text\"><p>这些年折腾云服务器踩过不少坑：实名卡审核、账号风控、线路不稳、价格虚高……尤其做跨境/自动化/部署项目的，真的经不起服务商“突然抽风”。</p>\n<p>后来总结出一个最稳的方案：</p>\n<p>用大厂（Aliyun/AWS）的稳定性，但通过更快、更灵活的渠道开通。\n不需要实名、不等审核、价格也比官网低很多，还能用加密货币避风控。</p>\n<p>我们团队现在长期用的就是这种方式，跑项目一年多都很稳，所以分享给需要低风控、快开通、稳定线路的技术同学参考：</p>\n<p>👉 BaseCloud — 大厂云的快速免实名入口\n<a href=\"https://www.basecloud.cc/?utm_source=ondeseek&amp;utm_medium=forum&amp;utm_campaign=forum\"></a><a href=\"https://basecloud.cc\">https://basecloud.cc</a></p>\n<p>不是硬推，只是减少大家踩坑的成本。技术人时间最贵。</p>\n</div>","title":"🚀如何不踩坑选 VPS？我自己的经验分享","last_reply_at":"2025-12-11T06:11:06.730Z","good":false,"top":false,"reply_count":0,"visit_count":1959,"create_at":"2025-12-11T06:11:06.730Z","author":{"loginname":"daoke","avatar_url":"//gravatar.com/avatar/4c367fc7dde1e6d7698ace1493330f83?size=48"}},{"id":"6927dcac05080c3871c2b255","author_id":"68e4cde5f1357670d9083ce3","tab":"share","content":"<div class=\"markdown-text\"><p>做跨境团队最头疼的就是支付问题：广告账户被拒付、开卡和充值流程繁琐、账单不清晰、多平台支付难管理……</p>\n<p>**VCC虚拟信用卡（Visa/万事达）**完美解决这些问题：\n\t•\t即开即用：免实名，快速生成，多成员同时使用\n\t•\t多平台支持：FB/Google/TikTok广告、PayPal、AWS、域名、订阅全覆盖\n\t•\t机器人 + 后台：批量开卡、查账、充值自动化，团队管理更高效\n\t•\t账单透明：结算清楚，避免财务混乱\n\t•\t支持加密货币：充值快速，跨境支付无障碍\n\t•\t性价比高：稳定可靠，长期使用更划算</p>\n<p>一句话总结：\n跨境广告、电商或独立站团队，有了 VCC，支付更稳定、高效、透明，真的值得用。产品频道：<a href=\"https://t.me/+vCIqSgwsBDxiODIy\">https://t.me/+vCIqSgwsBDxiODIy</a> 联系客服：<a href=\"/user/KaiDe66BOt\">@KaiDe66BOt</a></p>\n</div>","title":"Google Gmail RCS TG大量实卡接码及各种冷门项目 支持量大用户api对接","last_reply_at":"2025-11-27T05:07:56.294Z","good":false,"top":false,"reply_count":0,"visit_count":2010,"create_at":"2025-11-27T05:07:56.294Z","author":{"loginname":"daoke","avatar_url":"//gravatar.com/avatar/4c367fc7dde1e6d7698ace1493330f83?size=48"}},{"id":"68fecf98f135765d8c084174","author_id":"59eeb8e11bbf067d5c3fa7c6","tab":"share","content":"<div class=\"markdown-text\"><p>在VonaJS框架中，AOP编程包括三方面：<code>控制器切面</code>、<code>内部切面</code>和<code>外部切面</code>。</p>\n<ol>\n<li><code>控制器切面</code>: 为 Controller 方法切入逻辑，包括：Middleware、Guard、Interceptor、Pipe和Filter</li>\n<li><code>内部切面</code>: 在 Class 内部，为任何 Class 的任何方法切入逻辑，包括：AOP Method和魔术方法</li>\n<li><code>外部切面</code>: 在不改变 Class 源码的前提下，从外部为任何 Class 的任何方法切入逻辑</li>\n</ol>\n<p>VonaJS中的<code>外部切面</code>，可以类比于Spring Boot中的<code>AOP切面</code>和<code>AOP织入</code>概念。VonaJS的<code>外部切面</code>不需要什么<code>前置通知</code>、<code>后置通知</code>、<code>异常通知</code>和<code>环绕通知</code>，只需提供一个同名方法就可以了。之所以可以这么简洁，是因为使用了洋葱圈模型。</p>\n<p>此外，VonaJS的<code>外部切面</code>支持完整的类型推断与智能代码提示，开发体感比Spring Boot优雅太多。</p>\n<p>下面，我们就来考察一下VonaJS的<code>外部切面</code>到底是个什么样？为什么可以成为AOP编程的🚀大杀器🔪</p>\n<h2>创建目标Class</h2>\n<p>可以针对任何 Class 实现外部切面。下面，以 Service 为例，在模块 demo-student 中创建一个 Service <code>test</code>，代码如下：</p>\n<pre class=\"prettyprint language-typescript\"><code>@Service()\nexport class ServiceTest extends BeanBase {\n  private _name: string;\n\n  protected __init__() {\n    this._name = &#x27;&#x27;;\n  }\n\n  protected async __dispose__() {\n    this._name = &#x27;&#x27;;\n  }\n\n  get name() {\n    return this._name;\n  }\n\n  set name(value) {\n    this._name = value;\n  }\n\n  actionSync(a: number, b: number) {\n    return a + b;\n  }\n\n  async actionAsync(a: number, b: number) {\n    return Promise.resolve(a + b);\n  }\n}\n</code></pre><h2>创建外部切面</h2>\n<p>接下来，创建一个外部切面<code>log</code>，为 Class <code>ServiceTest</code>的属性和方法分别提供扩展逻辑</p>\n<h3>1. Cli命令</h3>\n<pre class=\"prettyprint language-bash\"><code>$ vona :create:bean aop log --module=demo-student\n</code></pre><h3>2. 菜单命令</h3>\n<pre class=\"prettyprint language-bash\"><code>右键菜单 - [模块路径]: Vona Aspect&#x2F;Aop\n</code></pre><h2>AOP定义</h2>\n<pre class=\"prettyprint language-typescript\"><code>import { BeanAopBase } from &#x27;vona&#x27;;\nimport { Aop } from &#x27;vona-module-a-aspect&#x27;;\n\n@Aop({ match: &#x27;demo-student.service.test&#x27; })\nexport class AopLog extends BeanAopBase {}\n</code></pre><ul>\n<li><code>@Aop</code>: 此装饰器用于实现<code>外部切面</code></li>\n<li><code>match</code>: 用于将 Class <code>AopLog</code>与 Class <code>ServiceTest</code>关联，<code>ServiceTest</code>的 beanFullName 是<code>demo-student.service.test</code></li>\n</ul>\n<table>\n<thead>\n<tr>\n<th>名称</th>\n<th>类型</th>\n<th>说明</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>match</td>\n<td>string|regexp|(string|regexp)[]</td>\n<td>针对哪些 Class 启用</td>\n</tr>\n</tbody>\n</table>\n<h2>切面：同步方法</h2>\n<p>为<code>ServiceTest#actionSync</code>输出运行时长</p>\n<p>在 VSCode 编辑器中，输入代码片段<code>aopactionsync</code>，自动生成代码骨架:</p>\n<pre class=\"prettyprint language-typescript\"><code>action: AopAction&lt;ClassSome, &#x27;action&#x27;&gt; = (_args, next, _receiver) =&gt; {\n  return next();\n};\n</code></pre><p>调整代码，然后添加 log 逻辑</p>\n<pre class=\"prettyprint language-typescript\"><code>actionSync: AopAction&lt;ServiceTest, &#x27;actionSync&#x27;&gt; = (_args, next, _receiver) =&gt; {\n  const timeBegin = Date.now();\n  const res = next();\n  const timeEnd = Date.now();\n  console.log(&#x27;actionSync: &#x27;, timeEnd - timeBegin);\n  return res;\n};\n</code></pre><ul>\n<li><code>actionSync</code>: 提供与<code>ServiceTest</code>同名的方法<code>actionSync</code></li>\n</ul>\n<h2>切面：异步方法</h2>\n<p>为<code>ServiceTest#actionAsync</code>输出运行时长</p>\n<p>在 VSCode 编辑器中，输入代码片段<code>aopaction</code>，自动生成代码骨架:</p>\n<pre class=\"prettyprint language-typescript\"><code>action: AopAction&lt;ClassSome, &#x27;action&#x27;&gt; = async (_args, next, _receiver) =&gt; {\n  return await next();\n};\n</code></pre><p>调整代码，然后添加 log 逻辑</p>\n<pre class=\"prettyprint language-typescript\"><code>actionAsync: AopAction&lt;ServiceTest, &#x27;actionAsync&#x27;&gt; = async (_args, next, _receiver) =&gt; {\n  const timeBegin = Date.now();\n  const res = await next();\n  const timeEnd = Date.now();\n  console.log(&#x27;actionAsync: &#x27;, timeEnd - timeBegin);\n  return res;\n};\n</code></pre><ul>\n<li><code>actionAsync</code>: 提供与<code>ServiceTest</code>同名的方法<code>actionAsync</code></li>\n</ul>\n<h2>切面：getter</h2>\n<p>为<code>ServiceTest#get name</code>输出运行时长</p>\n<p>在 VSCode 编辑器中，输入代码片段<code>aopgetter</code>，自动生成代码骨架:</p>\n<pre class=\"prettyprint language-typescript\"><code>protected __get_xxx__: AopActionGetter&lt;ClassSome, &#x27;xxx&#x27;&gt; = function (next, _receiver) {\n  const value = next();\n  return value;\n};\n</code></pre><p>调整代码，然后添加 log 逻辑</p>\n<pre class=\"prettyprint language-typescript\"><code>protected __get_name__: AopActionGetter&lt;ServiceTest, &#x27;name&#x27;&gt; = function (next, _receiver) {\n  const timeBegin = Date.now();\n  const value = next();\n  const timeEnd = Date.now();\n  console.log(&#x27;get name: &#x27;, timeEnd - timeBegin);\n  return value;\n};\n</code></pre><ul>\n<li><code>__get_name__</code>: 对应<code>ServiceTest</code>的 getter 方法<code>get name</code></li>\n</ul>\n<h2>切面：setter</h2>\n<p>为<code>ServiceTest#set name</code>输出运行时长</p>\n<p>在 VSCode 编辑器中，输入代码片段<code>aopsetter</code>，自动生成代码骨架:</p>\n<pre class=\"prettyprint language-typescript\"><code>protected __set_xxx__: AopActionSetter&lt;ClassSome, &#x27;xxx&#x27;&gt; = function (value, next, _receiver) {\n  return next(value);\n}\n</code></pre><p>调整代码，然后添加 log 逻辑</p>\n<pre class=\"prettyprint language-typescript\"><code>protected __set_name__: AopActionSetter&lt;ServiceTest, &#x27;name&#x27;&gt; = function (value, next, _receiver) {\n  const timeBegin = Date.now();\n  const res = next(value);\n  const timeEnd = Date.now();\n  console.log(&#x27;set name: &#x27;, timeEnd - timeBegin);\n  return res;\n};\n</code></pre><ul>\n<li><code>__set_name__</code>: 对应<code>ServiceTest</code>的 setter 方法<code>set name</code></li>\n</ul>\n<h2>切面：<code>__init__</code></h2>\n<p>为<code>ServiceTest#__init__</code>输出运行时长</p>\n<p>在 VSCode 编辑器中，输入代码片段<code>aopinit</code>，自动生成代码骨架:</p>\n<pre class=\"prettyprint language-typescript\"><code>protected __init__: AopActionInit&lt;ClassSome&gt; = (_args, next, _receiver) =&gt; {\n  next();\n};\n</code></pre><p>调整代码，然后添加 log 逻辑</p>\n<pre class=\"prettyprint language-typescript\"><code>protected __init__: AopActionInit&lt;ServiceTest&gt; = (_args, next, _receiver) =&gt; {\n  const timeBegin = Date.now();\n  next();\n  const timeEnd = Date.now();\n  console.log(&#x27;__init__: &#x27;, timeEnd - timeBegin);\n};\n</code></pre><ul>\n<li><code>__init__</code>: 提供与<code>ServiceTest</code>同名的方法<code>__init__</code></li>\n</ul>\n<h2>切面：<code>__dispose__</code></h2>\n<p>为<code>ServiceTest#__dispose__</code>输出运行时长</p>\n<p>在 VSCode 编辑器中，输入代码片段<code>aopdispose</code>，自动生成代码骨架:</p>\n<pre class=\"prettyprint language-typescript\"><code>protected __dispose__: AopActionDispose&lt;ClassSome&gt; = async (_args, next, _receiver) =&gt; {\n  await next();\n};\n</code></pre><p>调整代码，然后添加 log 逻辑</p>\n<pre class=\"prettyprint language-typescript\"><code>protected __dispose__: AopActionDispose&lt;ServiceTest&gt; = async (_args, next, _receiver) =&gt; {\n  const timeBegin = Date.now();\n  await next();\n  const timeEnd = Date.now();\n  console.log(&#x27;__dispose__: &#x27;, timeEnd - timeBegin);\n};\n</code></pre><ul>\n<li><code>__dispose__</code>: 提供与<code>ServiceTest</code>同名的方法<code>__dispose__</code></li>\n</ul>\n<h2>切面：<code>__get__</code></h2>\n<p>为<code>ServiceTest</code>扩展魔术方法</p>\n<ul>\n<li>参见: <a href=\"https://vona.js.org/zh/guide/aop/internal/magic-method.html\">魔术方法</a></li>\n</ul>\n<p>在 VSCode 编辑器中，输入代码片段<code>aopget</code>，自动生成代码骨架:</p>\n<pre class=\"prettyprint language-typescript\"><code>protected __get__: AopActionGet&lt;ClassSome&gt; = (_prop, next, _receiver) =&gt; {\n  const value = next();\n  return value;\n};\n</code></pre><p>调整代码，然后添加自定义字段<code>red</code></p>\n<pre class=\"prettyprint language-typescript\"><code>protected __get__: AopActionGet&lt;ServiceTest&gt; = (prop, next, _receiver) =&gt; {\n  if (prop === &#x27;red&#x27;) return &#x27;#FF0000&#x27;;\n  const value = next();\n  return value;\n};\n</code></pre><ul>\n<li><code>__get__</code>: 约定的魔术方法名称</li>\n</ul>\n<p>通过接口类型合并的机制为颜色提供类型定义</p>\n<pre class=\"prettyprint language-typescript\"><code>declare module &#x27;vona-module-demo-student&#x27; {\n  export interface ServiceTest {\n    red: string;\n  }\n}\n</code></pre><h2>切面：<code>__set__</code></h2>\n<p>为<code>ServiceTest</code>扩展魔术方法</p>\n<ul>\n<li>参见: <a href=\"https://vona.js.org/zh/guide/aop/internal/magic-method.html\">魔术方法</a></li>\n</ul>\n<p>在 VSCode 编辑器中，输入代码片段<code>aopset</code>，自动生成代码骨架:</p>\n<pre class=\"prettyprint language-typescript\"><code>protected __set__: AopActionSet&lt;ClassSome&gt; = (_prop, value, next, _receiver) =&gt; {\n  return next(value);\n};\n</code></pre><p>调整代码，为自定义字段<code>red</code>设置值</p>\n<pre class=\"prettyprint language-typescript\"><code>private _colorRed: string | undefined;\n\nprotected __set__: AopActionSet&lt;ServiceTest&gt; = (prop, value, next, _receiver) =&gt; {\n  if (prop === &#x27;red&#x27;) {\n    this._colorRed = value;\n    return true;\n  }\n  return next(value);\n};\n</code></pre><ul>\n<li><code>__set__</code>: 约定的魔术方法名称</li>\n<li>如果为<code>prop</code>设置了值，返回<code>true</code>，否则调用<code>next</code>方法</li>\n</ul>\n<p>然后调整<code>__get__</code>的逻辑:</p>\n<pre class=\"prettyprint language-diff\"><code>protected __get__: AopActionGet&lt;ServiceTest&gt; = (prop, next, _receiver) =&gt; {\n- if (prop === &#x27;red&#x27;) return &#x27;#FF0000&#x27;;\n+ if (prop === &#x27;red&#x27;) return this._colorRed;\n  const value = next();\n  return value;\n}\n</code></pre><h2>切面：<code>__method__</code></h2>\n<p>为<code>ServiceTest</code>的任何方法扩展逻辑</p>\n<p>在 VSCode 编辑器中，输入代码片段<code>aopmethod</code>，自动生成代码骨架:</p>\n<pre class=\"prettyprint language-typescript\"><code>protected __method__: AopActionMethod&lt;ClassSome&gt; = (_method, _args, next, _receiver) =&gt; {\n  return next();\n};\n</code></pre><p>调整代码，然后为方法<code>actionSync</code>和<code>actionAsync</code>添加 log 逻辑</p>\n<pre class=\"prettyprint language-typescript\"><code>protected __method__: AopActionMethod&lt;ServiceTest&gt; = (method, _args, next, _receiver) =&gt; {\n  if (method !== &#x27;actionSync&#x27; &amp;&amp; method !== &#x27;actionAsync&#x27;) {\n    return next();\n  }\n  const timeBegin = Date.now();\n  function done(res) {\n    const timeEnd = Date.now();\n    console.log(&#96;method ${method}: &#96;, timeEnd - timeBegin);\n    return res;\n  }\n  const res = next();\n  if (res?.then) {\n    return res.then((res: any) =&gt; {\n      return done(res);\n    });\n  }\n  return done(res);\n};\n</code></pre><ul>\n<li><code>__method__</code>: 约定的魔术方法名称</li>\n<li><code>res?.then</code>: 判断返回值是否是 Promise 对象，进行不同处理，从而兼容<code>同步方法</code>和<code>异步方法</code></li>\n</ul>\n<h2>AOP顺序</h2>\n<p>针对同一个目标 Class，可以关联多个 AOP。所以，VonaJS 提供了两个参数，用于控制 AOP 的执行顺序</p>\n<h3>1. dependencies</h3>\n<p>比如，还有一个 AOP <code>demo-student:log3</code>，我们希望执行顺序如下：<code>demo-student:log3</code> &gt; <code>Current</code></p>\n<pre class=\"prettyprint language-diff\"><code>@Aop({\n  match: &#x27;demo-student.service.test&#x27;,\n+ dependencies: &#x27;demo-student:log3&#x27;,\n})\nclass AopLog {}\n</code></pre><h3>2. dependents</h3>\n<p><code>dependents</code>的顺序刚好与<code>dependencies</code>相反，我们希望执行顺序如下：<code>Current</code> &gt; <code>demo-student:log3</code></p>\n<pre class=\"prettyprint language-diff\"><code>@Aop({\n  match: &#x27;demo-student.service.test&#x27;,\n+ dependents: &#x27;demo-student:log3&#x27;,\n})\nclass AopLog {}\n</code></pre><h2>AOP启用/禁用</h2>\n<p>可以控制 AOP 的<code>启用/禁用</code></p>\n<h3>1. Enable</h3>\n<p><code>src/backend/config/config/config.ts</code></p>\n<pre class=\"prettyprint language-diff\"><code>&#x2F;&#x2F; onions\nconfig.onions = {\n  aop: {\n    &#x27;demo-student:log&#x27;: {\n+     enable: false,\n    },\n  },\n};\n</code></pre><h3>2. Meta</h3>\n<p>可以让 AOP 在指定的运行环境生效</p>\n<table>\n<thead>\n<tr>\n<th>名称</th>\n<th>类型</th>\n<th>说明</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>flavor</td>\n<td>string|string[]</td>\n<td>参见: <a href=\"https://vona.js.org/zh/guide/env-config/mode-flavor/introduction.html\">运行环境与Flavor</a></td>\n</tr>\n<tr>\n<td>mode</td>\n<td>string|string[]</td>\n<td>参见: <a href=\"https://vona.js.org/zh/guide/env-config/mode-flavor/introduction.html\">运行环境与Flavor</a></td>\n</tr>\n</tbody>\n</table>\n<ul>\n<li>举例</li>\n</ul>\n<pre class=\"prettyprint language-diff\"><code>@Aop({\n+ meta: {\n+   flavor: &#x27;normal&#x27;,\n+   mode: &#x27;dev&#x27;,\n+ },\n})\nclass AopLog {}\n</code></pre><h2>查看当前生效的AOP清单</h2>\n<p>可以直接在目标 Class action 中输出当前生效的 AOP 清单</p>\n<pre class=\"prettyprint language-diff\"><code>class ServiceTest {\n  protected async __dispose__() {\n+   this.bean.onion.aop.inspect();\n    this._name = &#x27;&#x27;;\n  }\n</code></pre><ul>\n<li><code>this.bean.onion</code>: 取得全局 Service 实例 <code>onion</code></li>\n<li><code>.aop</code>: 取得与 AOP 相关的 Service 实例</li>\n<li><code>.inspect</code>: 输出当前生效的 AOP 清单</li>\n</ul>\n<p>当方法被执行时，会自动在控制台输出当前生效的 AOP 清单，效果如下：</p>\n<p><img src=\"//static.cnodejs.org/Flvhc_kARVcds62MZFbz4C85m5zk\" alt=\"aop-1.png\"></p>\n<h2>资源</h2>\n<ul>\n<li>Github：<a href=\"https://github.com/vonajs/vona\">https://github.com/vonajs/vona</a></li>\n<li>文档：<a href=\"https://vona.js.org/\">https://vona.js.org/</a></li>\n</ul>\n</div>","title":"VonaJS AOP编程大杀器：外部切面","last_reply_at":"2025-11-26T09:52:16.016Z","good":false,"top":false,"reply_count":1,"visit_count":2692,"create_at":"2025-10-27T01:49:12.465Z","author":{"loginname":"zhennann","avatar_url":"https://avatars.githubusercontent.com/u/24246985?v=4&s=120"}},{"id":"68adc2daf1357650fa08374e","author_id":"68940c89f13576940b083411","tab":"share","content":"<div class=\"markdown-text\"><p>分享一个朋友的网站：<a href=\"https://www.dkluge.com/draw\">刀刻网</a>\n<img src=\"https://asset.dkluge.com/uploads/dkluge-forum-images/bfa483d97ebddd2e95aac0857098fb6c75aa2204eaa5a10c4a0343ac3e823bdb.png\" alt=\"使用引导__ (3).png\"></p>\n<p>支持 AI 生成：</p>\n<p><img src=\"https://dkluge-files-v1.oss-cn-hangzhou.aliyuncs.com/uploads/dkluge-images/ce5e1e4835aee8814d50740c3138e3fd5d5da6cb5be50c16b6f8df99a0e60216.png\" alt=\"AI 生成\"></p>\n</div>","title":"分享一个画流程图各种图的网站","last_reply_at":"2025-11-14T15:31:14.995Z","good":false,"top":false,"reply_count":2,"visit_count":4725,"create_at":"2025-08-26T14:21:14.964Z","author":{"loginname":"dk002","avatar_url":"https://avatars.githubusercontent.com/u/9065896?v=4&s=120"}},{"id":"6913f02205080c3402c2b09f","author_id":"59eeb8e11bbf067d5c3fa7c6","tab":"share","content":"<div class=\"markdown-text\"><p>VonaJS提供的I18n支持模块化体系。每个业务模块都可以单独提供自己的 I18n 语言资源。我们先了解I18n的一般用法，然后再看看如何支持Swagger多语言</p>\n<h2>初始化代码骨架</h2>\n<p>我们先在模块<code>demo-student</code>中初始化I18n的代码骨架</p>\n<h3>1. Cli命令</h3>\n<pre class=\"prettyprint language-bash\"><code>$ vona :init:locale demo-student\n</code></pre><h3>2. 菜单命令</h3>\n<pre class=\"prettyprint language-bash\"><code>右键菜单 - [模块路径]: &#96;Vona Init&#x2F;Locale&#96;\n</code></pre><h2>定义语言资源</h2>\n<p>以模块<code>demo-student</code>为例，定义模块的语言资源：</p>\n<ul>\n<li>英文</li>\n</ul>\n<p><code>src/module/demo-student/src/config/locale/en-us.ts</code></p>\n<pre class=\"prettyprint language-diff\"><code>export default {\n+ StudentName: &#x27;Student Name&#x27;,\n};\n</code></pre><ul>\n<li>中文</li>\n</ul>\n<p><code>src/module/demo-student/src/config/locale/zh-cn.ts</code></p>\n<pre class=\"prettyprint language-diff\"><code>export default {\n+ StudentName: &#x27;学生名称&#x27;,\n};\n</code></pre><h2>使用语言资源</h2>\n<p>可以通过 Scope 实例提供的<code>locale</code>对象获取模块的语言资源，支持类型化提示</p>\n<pre class=\"prettyprint language-typescript\"><code>class ControllerStudent {\n  @Web.get(&#x27;test&#x27;)\n  test() {\n    &#x2F;&#x2F; use current locale\n    const message1 = this.scope.locale.StudentName();\n    &#x2F;&#x2F; use locale en-us\n    const message2 = this.scope.locale.StudentName.locale(&#x27;en-us&#x27;);\n    &#x2F;&#x2F; use locale zh-cn\n    const message3 = this.scope.locale.StudentName.locale(&#x27;zh-cn&#x27;);\n    console.log(message1, message2, message3);\n  }\n}  \n</code></pre><h2>跨模块使用语言资源</h2>\n<pre class=\"prettyprint language-typescript\"><code>class ControllerStudent {\n  @Web.get(&#x27;test&#x27;)\n  test() {\n    &#x2F;&#x2F; use current locale\n    const message1 = this.$scope.demoStudent.locale.StudentName();\n    &#x2F;&#x2F; use locale en-us\n    const message2 = this.$scope.demoStudent.locale.StudentName.locale(&#x27;en-us&#x27;);\n    &#x2F;&#x2F; use locale zh-cn\n    const message3 = this.$scope.demoStudent.locale.StudentName.locale(&#x27;zh-cn&#x27;);\n    console.log(message1, message2, message3);\n  }\n}  \n</code></pre><h2>覆盖语言资源</h2>\n<p>可以使用<code>项目级别</code>的语言资源覆盖<code>模块级别</code>的语言资源</p>\n<ul>\n<li>英文</li>\n</ul>\n<p><code>src/backend/config/locale/en-us.ts</code></p>\n<pre class=\"prettyprint language-diff\"><code>export default {\n  modules: {\n+   &#x27;demo-student&#x27;: {\n+     StudentName: &#x27;Student Name!&#x27;,\n+   },\n  },\n};\n</code></pre><ul>\n<li>中文</li>\n</ul>\n<p><code>src/backend/config/locale/zh-cn.ts</code></p>\n<pre class=\"prettyprint language-diff\"><code>export default {\n  modules: {\n+   &#x27;demo-student&#x27;: {\n+     StudentName: &#x27;学生名称!&#x27;,\n+   },\n  },\n};\n</code></pre><h2>当前locale</h2>\n<h3>1. 获取当前locale</h3>\n<pre class=\"prettyprint language-typescript\"><code>const locale = this.ctx.locale;\n</code></pre><h3>2. 设置当前locale</h3>\n<pre class=\"prettyprint language-typescript\"><code>this.ctx.locale = &#x27;en-us&#x27;;\n</code></pre><h3>3. 获取缺省locale</h3>\n<pre class=\"prettyprint language-typescript\"><code>const localeDefault = this.$scope.i18n.config.defaultLocale;\n</code></pre><h2>获取当前locale的规则</h2>\n<p>当用户访问后端 API 时，后端会自动根据规则获取当前 locale</p>\n<h3>1. 模块配置</h3>\n<p>I18n 是由模块 a-i18n 提供的核心能力，可以在 App config 中修改模块的配置：</p>\n<p><code>src/backend/config/config/config.ts</code></p>\n<pre class=\"prettyprint language-typescript\"><code>&#x2F;&#x2F; modules\nconfig.modules = {\n  &#x27;a-i18n&#x27;: {\n    defaultLocale: &#x27;en-us&#x27;,\n    queryField: &#x27;x-vona-locale&#x27;,\n    headerField: &#x27;x-vona-locale&#x27;,\n    cookieField: &#x27;locale&#x27;,\n  },\n};\n</code></pre><table>\n<thead>\n<tr>\n<th>名称</th>\n<th>说明</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>defaultLocale</td>\n<td>Default locale</td>\n</tr>\n<tr>\n<td>queryField</td>\n<td>从request query中获取当前locale，query key默认为<code>x-vona-locale</code></td>\n</tr>\n<tr>\n<td>headerField</td>\n<td>从request header中获取当前locale，header key默认为<code>x-vona-locale</code></td>\n</tr>\n<tr>\n<td>cookieField</td>\n<td>从request cookie中获取当前locale，cookie key默认为<code>locale</code></td>\n</tr>\n</tbody>\n</table>\n<h3>2. 规则次序</h3>\n<p>系统按以下次序，依次判断当前 locale</p>\n<p><code>queryField</code> &gt; <code>headerField</code> &gt; <code>cookieField</code> &gt; <code>Header: Accept-Language</code> &gt; <code>defaultLocale</code></p>\n<h2>添加新语言</h2>\n<p>VonaJS 默认提供了两个语言:<code>en-us</code>和<code>zh-cn</code>。下面演示如何添加新语言<code>zh-tw</code></p>\n<h3>1. 添加类型定义</h3>\n<p>采用接口合并机制添加新语言的类型定义</p>\n<p>在 VSCode 编辑器中，输入代码片段<code>recordlocale</code>，自动生成代码骨架:</p>\n<pre class=\"prettyprint language-typescript\"><code>declare module &#x27;vona&#x27; {\n  export interface ILocaleRecord {\n    : never;\n  }\n}\n</code></pre><p>调整代码，然后添加<code>zh-tw</code></p>\n<pre class=\"prettyprint language-diff\"><code>declare module &#x27;vona&#x27; {\n  export interface ILocaleRecord {\n+   &#x27;zh-tw&#x27;: never;\n  }\n}\n</code></pre><h3>2. 添加语言资源</h3>\n<p>新建语言文件<code>zh-tw.ts</code>，然后添加语言资源</p>\n<p><code>src/module/demo-student/src/config/locale/zh-tw.ts</code></p>\n<pre class=\"prettyprint language-typescript\"><code>export default {\n  StudentName: &#x27;學生名稱&#x27;,\n};\n</code></pre><h2>复数</h2>\n<h3>1. 定义语言资源</h3>\n<p><code>src/module/demo-student/src/config/locale/en-us.ts</code></p>\n<pre class=\"prettyprint language-diff\"><code>export default {\n+ TestApples_: &#x27;%d apples&#x27;,\n+ TestApples_0: &#x27;no apples&#x27;,\n+ TestApples_1: &#x27;one apple&#x27;,\n};\n</code></pre><p><code>src/module/demo-student/src/config/locale/zh-cn.ts</code></p>\n<pre class=\"prettyprint language-diff\"><code>export default {\n+ TestApples_: &#x27;%d个苹果&#x27;,\n+ TestApples_0: &#x27;没有苹果&#x27;,\n};\n</code></pre><h3>2. 使用语言资源</h3>\n<pre class=\"prettyprint language-typescript\"><code>this.ctx.locale = &#x27;en-us&#x27;;\nconst apple0 = this.scope.locale.TestApples_(0);\nconst apple1 = this.scope.locale.TestApples_(1);\nconst apple2 = this.scope.locale.TestApples_(2);\nconsole.log(&#96;${apple0}, ${apple1}, ${apple2}&#96;);\n</code></pre><p>控制台输出如下：</p>\n<pre class=\"prettyprint language-bash\"><code>no apples, one apple, 2 apples\n</code></pre><ul>\n<li><code>TestApples_</code>: 缺省语言资源。语言资源添加后缀<code>_</code>，可以提示开发者该语言资源需要传入参数</li>\n<li><code>TestApples_{n}</code>: 可以针对任何具体的<code>n</code>提供独立的语言资源。系统在进行语言翻译时，如果找不到具体<code>n</code>的语言资源，就使用缺省语言资源<code>TestApples_</code></li>\n</ul>\n<h2>复数: 多参数</h2>\n<p>如果语言资源支持多参数，那么可以明确指定哪个参数支持复数</p>\n<h3>1. 定义语言资源</h3>\n<p><code>src/module/demo-student/src/config/locale/en-us.ts</code></p>\n<pre class=\"prettyprint language-diff\"><code>export default {\n+ TestNameApples_: &#x27;%s has %d apples&#x27;,\n+ TestNameApples_0_1: &#x27;%s has no apples&#x27;,\n+ TestNameApples_1_1: &#x27;%s has one apple&#x27;,\n};\n</code></pre><p><code>src/module/demo-student/src/config/locale/zh-cn.ts</code></p>\n<pre class=\"prettyprint language-diff\"><code>export default {\n+ TestNameApples_: &#x27;%s有%d个苹果&#x27;,\n+ TestNameApples_0_1: &#x27;%s没有苹果&#x27;,\n};\n</code></pre><h3>2. 使用语言资源</h3>\n<pre class=\"prettyprint language-typescript\"><code>this.ctx.locale = &#x27;en-us&#x27;;\nconst apple0 = this.scope.locale.TestNameApples_(&#x27;Tom&#x27;, 0);\nconst apple1 = this.scope.locale.TestNameApples_(&#x27;Tom&#x27;, 1);\nconst apple2 = this.scope.locale.TestNameApples_(&#x27;Tom&#x27;, 2);\nconsole.log(&#96;${apple0}, ${apple1}, ${apple2}&#96;);\n</code></pre><p>控制台输出如下：</p>\n<pre class=\"prettyprint language-bash\"><code>Tom has no apples, Tom has one apple, Tom has 2 apples\n</code></pre><ul>\n<li><code>TestNameApples_</code>: 缺省语言资源。语言资源添加后缀<code>_</code>，可以提示开发者该语言资源需要传入参数</li>\n<li><code>TestNameApples_{n}_{ordinal}</code>: <code>ordinal</code>代表参数序数</li>\n</ul>\n<h2>Swagger/Openapi</h2>\n<p>VonaJS 提供了一组工具函数，为 Swagger/Openapi 实现 I18n 国际化</p>\n<p>比如，为<code>EntityStudent</code>的字段<code>name</code>提供国际化的<code>title</code>信息</p>\n<h3>1. $localeScope</h3>\n<p>在设置字段 title 信息时，要使用<code>语言资源FullKey</code>。在实际生成 Swagger/Openapi 元数据时，系统会自动将<code>语言资源FullKey</code>翻译为指定的语言</p>\n<pre class=\"prettyprint language-diff\"><code>+ import { $localeScope } from &#x27;vona&#x27;;\n\nclass EntityStudent {\n+ @Api.field(v.title($localeScope(&#x27;demo-student&#x27;, &#x27;Name&#x27;)))\n  name: string;\n}\n</code></pre><ul>\n<li><code>v.title</code>: 设置 title 信息</li>\n<li><code>$localeScope</code>: 传入<code>模块名称</code>和<code>语言资源Key</code>，从而生成<code>语言资源FullKey</code>: <code>demo-student::Name</code></li>\n</ul>\n<h3>2. $locale</h3>\n<p>VonaJS 还提供了一个简化的工具函数<code>$locale</code></p>\n<pre class=\"prettyprint language-diff\"><code>+ import { $locale } from &#x27;..&#x2F;.metadata&#x2F;index.ts&#x27;;\n\nclass EntityStudent {\n+ @Api.field(v.title($locale(&#x27;Name&#x27;)))\n  name: string;\n}\n</code></pre><ul>\n<li><code>$locale</code>: 传入<code>语言资源Key</code>，从而生成<code>语言资源FullKey</code>: <code>demo-student::Name</code>\n<ul>\n<li>每个模块都提供了$locale 函数，因此，使用本模块的$locale 函数就可以取得模块名称</li>\n</ul>\n</li>\n</ul>\n<h2>资源</h2>\n<ul>\n<li>Github：<a href=\"https://github.com/vonajs/vona\">https://github.com/vonajs/vona</a></li>\n<li>文档：<a href=\"https://vona.js.org\">https://vona.js.org</a></li>\n</ul>\n</div>","title":"VonaJS: I18n如何支持Swagger多语言","last_reply_at":"2025-11-12T02:25:38.602Z","good":false,"top":false,"reply_count":0,"visit_count":2079,"create_at":"2025-11-12T02:25:38.602Z","author":{"loginname":"zhennann","avatar_url":"https://avatars.githubusercontent.com/u/24246985?v=4&s=120"}},{"id":"690805f3f135761521084254","author_id":"59eeb8e11bbf067d5c3fa7c6","tab":"share","content":"<div class=\"markdown-text\"><h1>验证码体系</h1>\n<p>VonaJS的内置模块<code>a-captcha</code>提供了通用的验证码体系，使用<code>Captcha Provider</code>支持各种验证码方式，并且使用<code>Captcha Scene</code>支持不同场景的验证码使用策略</p>\n<h2>特性</h2>\n<ul>\n<li><code>Captcha Provider</code>：使用<code>Captcha Provider</code>支持各种验证码方式，如：文字图形验证码、短信验证码，等等</li>\n<li><code>Captcha Scene</code>：使用<code>Captcha Scene</code>支持不同场景的验证码使用策略。比如，在某个场景下，可以在多个 Captcha Provider 中进行轮替，或者根据用户状态使用不同难度的 Captcha Provider，等等</li>\n<li><code>立即验证</code>：前端可以对用户输入的验证码进行立即验证。<code>立即验证</code>之后在提交表单时仍然要进行<code>二次验证</code></li>\n<li><code>表单验证</code>：前端可以将用户输入的验证码与表单数据一起发往后端验证</li>\n</ul>\n<h2>bean.captcha</h2>\n<p>模块<code>a-captcha</code>提供了全局 Bean <code>bean.captcha</code>，可以通过统一的方式使用所有 Provider/Scene 提供的验证码能力</p>\n<p>模块<code>a-captchasimple</code>提供了一个 Provider <code>a-captchasimple:imageText</code>，基于<a href=\"https://github.com/produck/svg-captcha\">svg-captcha</a>实现文字图片的验证码能力</p>\n<p>模块<code>a-captchasimple</code>提供了一个 Scene <code>a-captchasimple:simple</code>。该 Scene 只使用一个 Provider，即<code>a-captchasimple:imageText</code></p>\n<p>下面演示如何使用模块<code>a-captchasimple</code>提供的验证码能力</p>\n<h3>1. create</h3>\n<pre class=\"prettyprint language- typescript\"><code>&#x2F;&#x2F; create captcha\nconst captcha = await this.bean.captcha.create(&#x27;a-captchasimple:simple&#x27;);\n</code></pre><ul>\n<li>返回值类型：<code>ICaptchaData</code></li>\n</ul>\n<pre class=\"prettyprint language- typescript\"><code>export interface ICaptchaData {\n  id: string;\n  provider: keyof ICaptchaProviderRecord;\n  token?: unknown;\n  payload: unknown;\n}\n</code></pre><table>\n<thead>\n<tr>\n<th>名称</th>\n<th>说明</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>id</td>\n<td>本次验证码数据的id标识</td>\n</tr>\n<tr>\n<td>provider</td>\n<td>本次验证码所使用的Provider名称</td>\n</tr>\n<tr>\n<td>token</td>\n<td>本次验证码数据的token，用于比对用户输入值。在开发环境可以通过修改系统配置，将token发往前端，用于调试</td>\n</tr>\n<tr>\n<td>payload</td>\n<td>本次验证码的负载内容，不同的Provider有不同的payload类型</td>\n</tr>\n</tbody>\n</table>\n<h3>2. refresh</h3>\n<pre class=\"prettyprint language- typescript\"><code>&#x2F;&#x2F; refresh captcha\nconst captchaNew = await this.bean.captcha.refresh(captchaId, &#x27;a-captchasimple:simple&#x27;);\n</code></pre><ul>\n<li>如果一个 Scene 配置了多个 Provider，那么在刷新 capthca 时可以基于策略选取不同的 Provider</li>\n</ul>\n<h3>3. verify</h3>\n<pre class=\"prettyprint language- typescript\"><code>&#x2F;&#x2F; verify captcha\nconst passed = await this.bean.captcha.verify(captchaId, &#x27;1234&#x27;, &#x27;a-captchasimple:simple&#x27;);\n</code></pre><h3>4. verifyImmediate</h3>\n<p>前端可以对用户输入的验证码进行<code>立即验证</code>。<code>立即验证</code>之后在提交表单时仍然要进行<code>二次验证</code></p>\n<pre class=\"prettyprint language- typescript\"><code>&#x2F;&#x2F; verifyImmediate captcha\nconst tokenOrFalse = await this.bean.captcha.verifyImmediate(captchaId, &#x27;1234&#x27;);\n</code></pre><ul>\n<li>如果立即验证失败，返回<code>false</code></li>\n<li>如果立即验证成功，返回<code>二次token</code></li>\n<li>前端需要将<code>二次token</code>与表单数据一起发往后端进行<code>二次验证</code></li>\n</ul>\n<h2>interceptor.captchaVerify</h2>\n<p>模块<code>a-captcha</code>提供了一个局部拦截器<code>a-captcha:captchaVerify</code>，可以针对 API 启用验证码校验</p>\n<p><code>src/suite/a-home/modules/home-user/src/controller/passport.ts</code></p>\n<pre class=\"prettyprint language- diff\"><code>import { Core } from &#x27;vona-module-a-core&#x27;;\n\nclass ControllerPassport {\n  @Web.post(&#x27;login&#x27;)\n+ @Core.captchaVerify({ scene: &#x27;a-captchasimple:simple&#x27; })\n  async login(@Arg.body() data) {}\n}  \n</code></pre><ul>\n<li><code>@Core.captchaVerify</code>: 用于使用局部拦截器<code>a-captcha:captchaVerify</code>，传入需要使用的 Scene 名称</li>\n<li>该拦截器支持<code>表单验证</code>和<code>二次验证</code></li>\n</ul>\n<h2>Captcha API</h2>\n<p>模块<code>a-captcha</code>提供了一组<code>开箱即用</code>的 Captcha API，对<code>bean.captcha</code>的能力进行了封装</p>\n<p><code>src/suite-vendor/a-vona/modules/a-captcha/src/controller/captcha.ts</code></p>\n<table>\n<thead>\n<tr>\n<th>名称</th>\n<th>说明</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>create</td>\n<td></td>\n</tr>\n<tr>\n<td>refresh</td>\n<td></td>\n</tr>\n<tr>\n<td>verifyImmediate</td>\n<td></td>\n</tr>\n</tbody>\n</table>\n<ul>\n<li>为何没有提供<code>verify</code>API？</li>\n</ul>\n<p>因为<code>bean.captcha.verify</code>方法用于局部拦截器<code>a-captcha:captchaVerify</code></p>\n<h2>参数配置</h2>\n<p>可以在 App Config 中修改模块<code>a-captcha</code>的参数配置</p>\n<p><code>src/backend/config/config/config.ts</code></p>\n<pre class=\"prettyprint language- typescript\"><code>&#x2F;&#x2F; modules\nconfig.modules = {\n  &#x27;a-captcha&#x27;: {\n    captcha: {\n      showToken: false,\n    },\n    captchaProvider: {\n      ttl: 20 * 60 * 1000,\n      ttlSecondary: 20 * 60 * 1000,\n    },\n  },\n};\n</code></pre><table>\n<thead>\n<tr>\n<th>名称</th>\n<th>说明</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>captcha.showToken</td>\n<td>是否显示token。如果为true，就将token发往前端，用于调试。默认为false</td>\n</tr>\n<tr>\n<td>captchaProvider.ttl</td>\n<td>captcha token的过期时间</td>\n</tr>\n<tr>\n<td>captchaProvider.ttlSecondary</td>\n<td>二次token的过期时间</td>\n</tr>\n</tbody>\n</table>\n<h2>资源</h2>\n<ul>\n<li>Github：<a href=\"https://github.com/vonajs/vona\">https://github.com/vonajs/vona</a></li>\n<li>文档：<a href=\"https://vona.js.org/\">https://vona.js.org/</a></li>\n</ul>\n</div>","title":"VonaJS业务抽象层: 验证码体系","last_reply_at":"2025-11-03T01:31:31.027Z","good":false,"top":false,"reply_count":0,"visit_count":2128,"create_at":"2025-11-03T01:31:31.027Z","author":{"loginname":"zhennann","avatar_url":"https://avatars.githubusercontent.com/u/24246985?v=4&s=120"}},{"id":"65f50f03f8d693796a5ffd5b","author_id":"5926f6c7d371b6372a8afddb","tab":"share","content":"<div class=\"markdown-text\"><p>同志们，Cnode社区阔别好多年了，今天终于回来了！欢迎大家一起探讨学习JS！</p>\n</div>","title":"阔别好多年，我回来了！","last_reply_at":"2025-11-01T13:13:49.247Z","good":false,"top":false,"reply_count":8,"visit_count":3246,"create_at":"2024-03-16T03:16:19.895Z","author":{"loginname":"TongBaoWang","avatar_url":"https://avatars3.githubusercontent.com/u/28948481?v=4&s=120"}},{"id":"690335dcf13576acdc0841a2","author_id":"5ff82148a2a2130b68f6d773","tab":"share","content":"<div class=\"markdown-text\"><p><img src=\"https://raw.githubusercontent.com/MatrixAges/ai-sdk-panel/master/images/ai-sdk-panel.png\" alt=\"ai-sdk-panel 2.png\"></p>\n<p>Github： <a href=\"https://github.com/MatrixAges/ai-sdk-panel\">https://github.com/MatrixAges/ai-sdk-panel</a>\nDemo： <a href=\"https://stack.matrixages.com/ai-sdk-panel\">https://stack.matrixages.com/ai-sdk-panel</a></p>\n<p>做过好几个 AI 应用，发现自己一直在重复造轮子，为每个 AI 应用都开发一套 LLM 提供商编辑器。虽然大部分代码都是复制粘贴过往项目，但也不好管理，于是每天抽出一点时间，花了几个星期把 AI SDK Panel 这个公共组件给开发出来了。</p>\n<p>项目包含全流程的 e2e 测试，基于最新的 Vitest 4.0 Browser Mode 进行测试构建，请放心使用，同时提供了强大的定制化能力，多语言，自定义代理商等。</p>\n</div>","title":"写了N个AI应用，我开发了个极简的LLM提供商编辑器，每个AI应用都用得上","last_reply_at":"2025-10-30T09:54:36.898Z","good":false,"top":false,"reply_count":0,"visit_count":2139,"create_at":"2025-10-30T09:54:36.898Z","author":{"loginname":"MatrixAge","avatar_url":"https://avatars.githubusercontent.com/u/25472851?v=4&s=120"}},{"id":"68f97e0ef135761d470840a6","author_id":"59eeb8e11bbf067d5c3fa7c6","tab":"share","content":"<div class=\"markdown-text\"><p>在VonaJS框架中，AOP编程包括三方面：<code>控制器切面</code>、<code>内部切面</code>和<code>外部切面</code>。<code>内部切面</code>包括两个能力：<code>AOP Method</code>和<code>魔术方法</code>。这里我们简要介绍一下<code>魔术方法</code>的用法。</p>\n<h2>魔术方法</h2>\n<p><code>魔术方法</code>，允许我们在 Class 内部通过<code>__get__</code>和<code>__set__</code>切入动态属性或方法</p>\n<h2>举例：Module Scope</h2>\n<p>为了让 IOC 容器的使用更加简洁和直观，VonaJS 推荐优先使用<code>依赖查找</code>策略，从而使用更少的装饰器函数，使用更少的类型标注。通过<code>Module Scope</code>对象访问模块提供的资源，就是践行<code>依赖查找策略</code>的机制之一</p>\n<ul>\n<li>参见: <a href=\"https://vona.js.org/zh/guide/essentials/scope/introduction.html\">模块Scope</a></li>\n</ul>\n<p>比如，模块 demo-student 中有一个 model <code>student</code>，用于 crud 操作。可以这样使用 model：</p>\n<pre class=\"prettyprint language- typescript\"><code>import { ModelStudent } from &#x27;..&#x2F;model&#x2F;student.ts&#x27;;\n\nasync findMany(params) {\n  const model = this.bean._getBean(ModelStudent);\n  return await model.selectAndCount(params);\n}\n</code></pre><p>使用魔术方法：</p>\n<pre class=\"prettyprint language- typescript\"><code>async findMany(params) {\n  return await this.scope.model.student.selectAndCount(params);\n}\n</code></pre><ul>\n<li><code>this.scope.model.xxx</code>: 通过魔术方法动态获取当前模块中的 model 实例</li>\n</ul>\n<h2>举例：CRUD(魔术方法)</h2>\n<p>Vona ORM 采用魔术方法的机制进一步简化操作数据的代码</p>\n<ul>\n<li>参见: <a href=\"https://vona.js.org/zh/guide/techniques/orm/crud-magic.html\">CRUD(魔术方法)</a></li>\n</ul>\n<p>比如，通过字段<code>id</code>查询学生信息，代码如下：</p>\n<pre class=\"prettyprint language- typescript\"><code>async findOne(id) {\n  return await this.scope.model.student.get({ id });\n}\n</code></pre><p>使用魔术方法：</p>\n<pre class=\"prettyprint language- typescript\"><code>async findOne(id) {\n  return await this.scope.model.student.getById(id);\n}\n</code></pre><ul>\n<li>系统自动从 method name <code>getById</code>中解析出参数<code>id</code>，然后调用实际的 CRUD 方法，这里就是: <code>get({ id })</code></li>\n</ul>\n<h2>创建Class</h2>\n<p>可以在任何 Class 中实现魔术方法。下面，以 Service 为例，在模块 demo-student 中创建一个 Service <code>color</code>，代码如下：</p>\n<ul>\n<li>如何创建 Service，参见: <a href=\"https://vona.js.org/zh/guide/essentials/api/service.html\">Service</a></li>\n</ul>\n<pre class=\"prettyprint language- typescript\"><code>import { BeanBase } from &#x27;vona&#x27;;\nimport { Service } from &#x27;vona-module-a-bean&#x27;;\n\n@Service()\nexport class ServiceColor extends BeanBase {}\n</code></pre><h2><code>__get__</code></h2>\n<p>然后，通过<code>__get__</code>实现颜色值的获取</p>\n<h3>1. 添加代码骨架</h3>\n<p>在 VSCode 编辑器中，输入代码片段<code>aopmagicget</code>，自动生成代码骨架:</p>\n<pre class=\"prettyprint language- diff\"><code>@Service()\nexport class ServiceColor extends BeanBase {\n+ protected __get__(prop: string) {}\n}\n</code></pre><h3>2. 实现自定义逻辑</h3>\n<pre class=\"prettyprint language- diff\"><code>@Service()\nexport class ServiceColor extends BeanBase {\n+ private _colors = {\n+   red: &#x27;#FF0000&#x27;,\n+   green: &#x27;#00FF00&#x27;,\n+   blue: &#x27;#0000FF&#x27;,\n+ };\n\n  protected __get__(prop: string) {\n+   return this._colors[prop];\n  }\n}\n</code></pre><h3>3. 添加类型合并</h3>\n<p>通过接口类型合并的机制为颜色提供类型定义</p>\n<pre class=\"prettyprint language- typescript\"><code>export interface ServiceColor {\n  red: string;\n  green: string;\n  blue: string;\n}\n</code></pre><h3>4. 使用魔术方法</h3>\n<pre class=\"prettyprint language-typescript\"><code>async test() {\n  console.log(this.scope.service.color.red);\n  console.log(this.scope.service.color.green);\n  console.log(this.scope.service.color.blue);\n}\n</code></pre><h2><code>__set__</code></h2>\n<p>然后，通过<code>__set__</code>实现颜色值的设置</p>\n<h3>1. 添加代码骨架</h3>\n<p>在 VSCode 编辑器中，输入代码片段<code>aopmagicset</code>，自动生成代码骨架:</p>\n<pre class=\"prettyprint language- diff\"><code>@Service()\nexport class ServiceColor extends BeanBase {\n+ protected __set__(prop: string, value: any): boolean {\n+   return false;\n+ }\n}\n</code></pre><h3>2. 实现自定义逻辑</h3>\n<pre class=\"prettyprint language- diff\"><code>@Service()\nexport class ServiceColor extends BeanBase {\n  private _colors = {\n    red: &#x27;#FF0000&#x27;,\n    green: &#x27;#00FF00&#x27;,\n    blue: &#x27;#0000FF&#x27;,\n+   black: &#x27;&#x27;,\n  };\n\n  protected __set__(prop: string, value: any): boolean {\n+   if (this._colors[prop] === undefined) return false;\n+   this._colors[prop] = value;\n+   return true;\n  }\n}\n</code></pre><ul>\n<li>如果为<code>prop</code>设置了值，返回<code>true</code>，否则返回<code>false</code></li>\n</ul>\n<h3>3. 添加类型合并</h3>\n<p>通过接口类型合并的机制为颜色提供类型定义</p>\n<pre class=\"prettyprint language- diff\"><code>export interface ServiceColor {\n  red: string;\n  green: string;\n  blue: string;\n+ black: string;\n}\n</code></pre><h3>4. 使用魔术方法</h3>\n<pre class=\"prettyprint language-typescript\"><code>async test() {\n  this.scope.service.color.black = &#x27;#000000&#x27;;\n  console.log(this.scope.service.color.black);\n}\n</code></pre><h2>资源</h2>\n<ul>\n<li>Github：<a href=\"https://github.com/vonajs/vona\">https://github.com/vonajs/vona</a></li>\n<li>文档：<a href=\"https://vona.js.org/\">https://vona.js.org/</a></li>\n</ul>\n</div>","title":"VonaJS AOP编程：魔术方法","last_reply_at":"2025-10-23T00:59:58.507Z","good":false,"top":false,"reply_count":0,"visit_count":2142,"create_at":"2025-10-23T00:59:58.507Z","author":{"loginname":"zhennann","avatar_url":"https://avatars.githubusercontent.com/u/24246985?v=4&s=120"}},{"id":"5b13b00f8a4f51e140d944b9","author_id":"5b13af8c29e6e510415b273c","tab":"share","content":"<div class=\"markdown-text\"><p>关于WordPress独立网站或个人博客的国外虚拟托管主机购买推荐，免备案。</p>\n<p>网站管理平台（如WordPress）、域名domain和虚拟主机空间hosting是构成一个独立博客或网站的三个重要组成部分</p>\n<p><em>域名的话，非常推荐在很受用户好评的<a href=\"https://www.namesilo.com/?rid=adf2827hj\"><strong>namesilo</strong></a>注册购买(拿去用，1美元注册优惠码：webcom)，简单好用便宜靠谱，不建议选择使用购买主机时送的第一年免费的域名，都是套路呀</em></p>\n<p>这个页面主要简单介绍和推荐几个好用的优质国外WordPress虚拟主机，不要用免费的，所谓的&quot;免费&quot;都不过是幌子而已，也不要用国内的主机，还得备案等，不多解释。</p>\n<p><em>WordPress是目前最主流最成熟的网站搭建平台，根据wordpress.com的介绍，42% 的网页是在 WordPress 平台上构建的。 越来越多的博主、小型企业和《财富》500 强公司使用 WordPress，其数量超过了其他所有选项的总和。wordpress.com本身就是用wordpress系统搭建的免费博客网站，所以你打算搭建个人的独立博客或网站的话，WordPress肯定会是一个非常不错的平台</em></p>\n<p>搭建Wordpress独立博客或网站对于新手来说可能一开始会因为陌生而有些困难，其实操作熟练之后会很简单，wp网站系统完善到现在已经非常成熟和强大了，主要是要先准备好靠谱的域名和主机就行了，不要用免费的域名或虚拟主机，这样会免去很多不必要的麻烦（主要是免费的东西太浪费时间和精力）</p>\n<h2>几个好用的国外虚拟主机：</h2>\n<p>以下虚拟主机都支持WordPress网站的一键快速安装；都可以通过PayPal或visa等国际信用卡付款，基本上也都支持支付宝；最重要的是都可以在购买之后的规定期限内发起退款，有问题可以联系在线客服或邮件。</p>\n<ul>\n<li>\n<p><a href=\"https://www.bluehost.com/track/ykq\">bluehost</a>，公司总部在美国犹他州，2003年成立，WordPress org官方推荐第一位的主机，老牌主机服务商，名气也比较大，有超过200多万的优质网站在这里搭建，免费提供SSL(https)，不要用它提供的首年免费的域名，30天内可退款。<em>另，bluehost客服确认所谓的bluehost中国其实跟bluehost官方是两个不同的系统，虽然它们共用一个主域名，故不再推荐在bluehost中国购买，需要的直接在<a href=\"https://www.bluehost.com/track/ykq\">bluehost.com</a>官网购买，当然你自己拿主意</em></p>\n</li>\n<li>\n<p><a href=\"https://www.sugarhosts.com/members/aff.php?aff=3080\">sugarhosts</a>，糖果主机，位于英国爱尔兰，2009年成立，支持中文界面和中文客服，风格比较文艺，30天内可以退款，免费提供ssl证书，购买pro套餐按年付款的可以申请免费独立ip，其香港的主机挺快的，托管个人独立博客完全够用了，可以支付宝付款。</p>\n</li>\n<li>\n<p><a href=\"https://my.hawkhost.com/aff.php?aff=12414\">hawkhost</a>，其标志是一个老鹰，2004年在加拿大成立，主要销售共享主机，免费SSL证书，价格也比较便宜，可以支付宝，30天内可以发起退款，它提供的主机主要分布在加拿大、美国、欧洲荷兰，亚洲的中国香港和新加坡。</p>\n</li>\n<li>\n<p><a href=\"https://www.siteground.com/index.htm?afcode=d374ff711fd59832e23687367eb84f3c\">site ground</a>，<strong>非常好用，客户评价非常好，特别推荐）有点贵）</strong>，最近又涨价了，尤其是续费价格更贵（最低套餐续费价格14.99美元/月），虽然稳定，但是确实比较贵了。siteground公司在美国田纳西州，2003年成立，它也是WordPress org的官方推荐主机，针对WP特别优化，备份最近30天，共享主机shared wordpress hosting30天/一个月内可以退款，云主机cloud hosting 14天/两个星期内可退款，速度、稳定性什么的都非常好，在线客服支持非常的专业高效，很多人选择用siteground来搭建外贸网站，放在比较后面的原因是它的付款对于中国用户比较麻烦点，只接受visa/mastercard万事达卡等国际信用卡，PayPal的话需要在购买的时候联系客服，不支持支付宝。</p>\n</li>\n<li>\n<p><a href=\"https://partners.hostgator.com/KBOoA\">hostgator</a>，2003年成立，公司位于美国德克萨斯州，其标志是一条鳄鱼，购买共享主机45天内可以退款（0.01美元的订单不支持退款，如果你能买到话），提供免费SSL，价格也挺便宜的。有专门的<a href=\"https://partners.hostgator.com/9Vnb0\">中文网页</a>，可以支付宝。</p>\n</li>\n</ul>\n<p>另外简单说一下虚拟主机空间地理位置的选择，中文网站或个人博客的话，建议选择亚洲的机房，比如位于中国香港、新加坡或日本和韩国的主机，当然也只是建议。\nWordPress网站的theme主题的选择：默认的那几个主题就可以的，你也可以搜索选择自己喜欢的免费主题风格，也可以考虑使用付费主题</p>\n<p>以上哪个主机最好呢？ 尺有所短、寸有所长，不能绝对的说哪个最好用，都不错，要根据个人的需要和预算等选一个合适的就行了。</p>\n<p><em>“wordpress” “网站” “博客” “国外” “美国” “香港” “主机” “域名” “主题” “教程” “建站” “推荐” “website” “blog” “hosting” “com domain”</em></p>\n</div>","title":"几个非常好用的国外(wordpress网站)虚拟主机推荐","last_reply_at":"2025-10-17T03:49:07.713Z","good":false,"top":false,"reply_count":3,"visit_count":8209,"create_at":"2018-06-03T09:08:31.991Z","author":{"loginname":"jbxccgc","avatar_url":"https://avatars.githubusercontent.com/u/39874984?v=4&s=120"}}]}