尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
JavaScript无限debugger原理与四大载体拆解
1. 什么是“无限 debugger”它到底在折腾谁“无限 debugger”这个词不是某个新出的前端框架也不是什么黑科技插件而是前端开发者在真实调试现场里咬着牙说出来的——一句带点自嘲、又满是无奈的行话。它指的是一种在 JavaScript 代码中被反复、无休止触发的 debugger 语句执行状态你点一次“继续”它立刻再断下来你禁用断点它却从 eval、Function 构造器、setInterval 回调甚至字符串动态拼接里冷不丁冒出来你刷新页面它准时蹲守在 DOM 加载前、资源加载后、甚至 window.close() 的最后一毫秒。这不是 Chrome DevTools 的 Bug而是代码逻辑、反调试策略、或开发环境配置失当共同催生的一种“活体断点”。我第一次撞上它是在一个 HBuilderX 里跑的混合 App 项目里。客户要求加一段“防爬取 JS 脚本”结果上线后测试同学反馈“页面打不开点一下就卡住F12 打开直接卡死”。我本地复现发现 debugger 不是写在源码里而是藏在eval(...)拼出来的字符串里而这个字符串又由setInterval每 50ms 重生成一次——你刚跳过它已重装你停掉 interval它又在window.onload里悄悄复活。那一刻我才意识到debugger 本身只是个语句但当它和 eval、Function、定时器、DOM 注入组合起来就成了一种可自我再生、可环境感知、可绕过常规断点管理的“调试免疫系统”。这类问题高频出现在三类场景中一是第三方 SDK尤其广告、统计、风控类内置的反调试逻辑二是使用 HBuilderX、uni-app 等跨端工具链时其底层注入的运行时保护代码三是开发者自己为调试便利写的临时逻辑比如setInterval(() { debugger; }, 100)结果忘了删还提交到了生产分支。它不报错不抛异常只让你的调试器永远停留在“暂停中”像被按下了时间暂停键。对新手来说它像幽灵对老手来说它是信号——提醒你代码里有未被识别的动态执行路径或者环境里混进了你不掌控的脚本层。所以“处理无限 debugger”本质不是“怎么关掉它”而是识别它的载体、切断它的再生链路、还原它的原始意图并建立可持续的调试控制权。它背后牵扯的是 JavaScript 最核心的动态执行机制eval 的字符串求值、Function 构造器的运行时函数创建、setInterval 的周期性调度、以及 DOM 中 script 标签的动态注入能力。接下来我会带你一层层剥开这四条主干路径告诉你每一种“无限 debugger”是怎么长出来的又该怎么精准拆解——不是靠盲猜而是靠原理、靠痕迹、靠可控实验。2. 四大主因深度拆解为什么 debugger 会“无限”2.1 eval字符串里的 debugger 是最隐蔽的“影子”eval是 JavaScript 中最富争议的 API——它能把任意字符串当作代码执行。正因如此它成了“无限 debugger”的首选温床。你不会在源码里看到debugger;但可能看到const code debugger; console.log(running);; eval(code);表面看只是执行一行日志但debugger就藏在字符串里。更狡猾的是这段字符串往往不是静态的而是动态拼接、Base64 解码、甚至从服务器 API 拉取的。比如某风控 SDK 的典型模式fetch(/api/anti-debug).then(r r.text()).then(str { const decoded atob(str); // 解码后得到 debugger; setInterval(...) eval(decoded); });这里的关键在于Chrome DevTools 的“忽略列表”Blackbox和断点设置对 eval 内部的 debugger 完全无效。因为 eval 执行的代码没有 source map没有文件名DevTools 只把它标记为anonymous你无法右键“取消断点”也无法用debugger;前加// ts-ignore这类注释来绕过——它根本不在你的编辑器里。我实测过当 eval 字符串里包含debugger且该字符串由网络请求动态加载时即使你在 Sources 面板里把所有.js文件都设为 Blackbox它依然会断。原因很简单DevTools 的 Blackbox 是按 script URL 或文件名过滤的而 eval 的代码根本没有 URL它属于“运行时生成的匿名上下文”。破解思路不是硬刚 eval而是截断它的输入源或劫持它的执行环境。比如在 Network 面板里找到那个返回 anti-debug 字符串的请求右键“Block request URL”立刻让 eval 失去弹药或者在 Console 里提前定义window.eval function(){};注意这会影响正常功能仅限调试让后续所有 eval 失效。但更稳妥的做法是利用 DevTools 的“Event Listener Breakpoints”——勾选Script下的Script First Statement这样每次 eval 执行第一行时就会暂停你就能看到它到底 eval 了什么内容从而定位源头。提示不要试图用正则全局替换代码里的eval(——现代混淆器会把eval拆成eval或用window[eval]绕过。真正有效的拦截必须发生在执行时而非文本层面。2.2 Function 构造器比 eval 更“干净”的 debugger 工厂如果说 eval 是“野路子”那new Function()就是“正规军”——它同样能从字符串创建函数但作用域更干净不共享外层变量且性能略优。正因如此它被大量用于模块加载器、沙箱环境、甚至某些构建工具的 runtime 注入中。一个典型的无限 debugger 案例const createDebugger new Function(return function(){ debugger; }); setInterval(createDebugger(), 200);这段代码的问题在于createDebugger()返回一个函数setInterval每 200ms 就调用它一次每次调用都触发 debugger。你无法在 Sources 面板里找到这个函数的定义位置因为它根本没写在任何.js文件里而是运行时凭空构造的。更隐蔽的是它常和toString()结合使用const fn function(){ debugger; }; const str fn.toString(); // function(){ debugger; } const evil new Function(str); evil(); // 断点触发这种写法甚至能绕过某些代码扫描工具——因为debugger出现在函数体字符串里而非直接语句中。Function 构造器的难点在于它生成的函数在 DevTools 的 Call Stack 里显示为anonymous且没有 source map 关联。你点进去只看到一片空白或压缩后的单行代码。此时唯一可靠的突破口是“Break on caught exceptions”捕获异常断点。因为 Function 构造失败会抛SyntaxError而很多反调试逻辑会在构造前后插入校验一旦校验失败就 throw你就能在异常堆栈里顺藤摸瓜找到构造器调用点。我自己踩过的坑是某次在 uni-app 项目里HBuilderX 的 dev 模式会自动注入一段new Function(...)的热更新逻辑其中包含debugger用于检测是否被篡改。我花了半小时才意识到不是我的代码有问题而是 IDE 自己在“调试自己”。注意new Function()的字符串参数第一个逗号前是参数名列表后面才是函数体。所以new Function(a,b, debugger; return ab)是合法的。排查时务必看清参数分隔别把参数名误认为 debugger 载体。2.3 setInterval让 debugger “活过来”的永动机setInterval本身无害但当它和 debugger 绑定就成了最顽固的“断点永动机”。常见模式有三种裸写模式setInterval(() { debugger; }, 100);—— 最直白也最容易被 grep 扫描到但新手常犯。闭包封装模式function makeInfinite() { return () { debugger; }; } setInterval(makeInfinite(), 50);这里makeInfinite()每次返回新函数你打断点删掉 setInterval它可能已在另一个闭包里默默重启。条件触发模式let count 0; setInterval(() { if (document.hidden || performance.now() % 1000 10) { debugger; } }, 100);这种更阴险它只在页面失焦或性能时间戳满足条件时才断让你以为是偶发卡顿实际是精准伏击。setInterval的麻烦在于它注册后就脱离当前执行栈成为独立的 timer 任务你无法通过 call stack 追溯到注册它的源头。Chrome 的console.trace()在 setInterval 回调里输出的堆栈只到setTimeout/interval这一级上面全是(anonymous)。破解的关键是“Timer Breakpoints”。在 DevTools 的 Sources 面板右上角点击⋯→More Tools→JavaScript Profiler录制一小段操作然后分析 Flame Chart找到高频出现的setInterval调用或者直接在 Console 里执行getEventListeners(window)查看interval相关监听器——虽然不能直接看到回调函数体但能看到 timer ID 和注册位置。我推荐一个实操技巧在 Application 面板的Clear storage里勾选Cache和Service Workers然后点击Clear site data。很多基于缓存持久化的 setInterval 会随之失效因为它的初始化逻辑常依赖缓存数据。这招对 HBuilderX 项目特别有效——它常把调试注入逻辑存在 localStorage 里清掉就安静了。2.4 DOM 动态注入debugger 的“寄生虫”式生存这是最高明也最难查的一类。它不依赖 eval 或 Function而是把 debugger 语句写进script标签再用document.write()、innerHTML或appendChild()动态插入 DOM。例如const script document.createElement(script); script.textContent debugger; console.log(injected);; document.head.appendChild(script);或者更隐蔽的const html scriptdebugger;/script; document.body.insertAdjacentHTML(beforeend, html);这类 debugger 的特点是它存在于 DOM 树里但不属于任何外部 JS 文件它触发时Sources 面板会新开一个script标签页里面只有几行代码你删掉它下一次 DOM 操作又会生成新的。为什么难搞因为它的生命周期和 DOM 更新强绑定。比如 Vue 的v-html渲染、React 的dangerouslySetInnerHTML、甚至 jQuery 的.html()都可能成为它的载体。某次我调试一个 uni-app 页面发现 debugger 总在onLoad后 300ms 触发最后追踪到是uni.createSelectorQuery()的回调里往一个 div 的innerHTML注入了含 script 的字符串。根治方法只有一个监控 DOM 变更。在 Elements 面板里右键目标节点 →Break on→Subtree modifications。这样只要任何脚本往该节点插入新 scriptDevTools 就会立即暂停并高亮显示插入语句。你就能看到是谁、在何时、用什么方式注入了 debugger。实操心得如果页面结构复杂别盲目监控整个body。先用document.querySelector定位可疑区域比如广告位、统计容器、或idinject的 div再针对性设置 Breakpoint。否则你会被海量无关变更淹没。3. 实战处理流程从定位到根除的完整链路3.1 第一响应快速压制恢复可操作性当你面对一个无限 debugger首要目标不是“修好”而是“先让它停下让我能喘口气”。以下是我在客户现场屡试不爽的三步压制法第一步强制禁用所有断点按CtrlShiftF8Windows/Linux或CmdShiftF8Mac打开 Breakpoints 面板勾选Deactivate breakpoints。这会暂时关闭所有断点包括 debugger 语句。页面通常会立刻恢复正常。注意这不是永久解决只是争取调试窗口。第二步阻止脚本执行精准版如果禁用断点无效说明 debugger 在 eval 或 Function 里就用更激进的手段在 Console 里执行window.debugger function(){};—— 覆盖全局 debugger 函数ES6 环境下有效或执行Object.defineProperty(window, debugger, { configurable: true, writable: true, value: function(){} });—— 强制重定义兼容旧版对于 HBuilderX 项目额外执行uni.getSystemInfoSync function(){ return { platform: dev }; };—— 许多反调试逻辑会检测平台设为 dev 可绕过。第三步隔离可疑脚本打开 Network 面板刷新页面按Size列排序找出体积小5KB、类型为script或xhr的请求。右键 →Block request URL。重点怀疑anti-debug.js、check.js、verify.js、或任何带eval、function、interval字样的 URL。我曾靠这招30 秒内定位到一个伪装成analytics.min.js的反调试脚本。提示压制只是临时方案。真正的处理必须进入下一步——溯源。压制期间记下页面行为是首次加载就断还是交互后才断断点位置是否固定这些线索决定你该从哪条主因切入。3.2 深度溯源四象限定位法锁定问题根源我设计了一个“四象限定位表”根据两个维度交叉判断触发时机页面加载时 / 用户交互后 / 定时触发和代码位置Sources 面板可见 / Network 请求加载 / DOM 动态生成 / 控制台执行。填完这张表90% 的无限 debugger 都能归类。触发时机 \ 代码位置Sources 面板可见Network 请求加载DOM 动态生成控制台执行页面加载时检查window.onload、DOMContentLoaded、script标签顺序查 Network 的initiator列找parser或script发起者检查document.write()、document.currentScript检查console历史是否有eval()或Function()调用用户交互后在 Elements 面板右键事件监听器 →Break on→EventListener查 Network 的 XHR/Fetch看是否触发新 script 加载检查onclick、addEventListener回调里的innerHTML操作检查交互后 Console 是否有新eval输出定时触发查setInterval、setTimeout调用栈用console.trace()查是否有定时拉取 script 的 API查setInterval回调里是否含appendChild检查setInterval是否在 Console 里手动注册举个真实案例某电商 H5 页面用户点击“立即购买”后无限 debugger。我按表操作触发时机交互后 → 查 Network发现点击后发了个/api/order/check请求返回 JSON 里有个js字段代码位置Network 加载 → 把js字段值粘贴到 Console发现是eval(atob(ZGVidWdnZXI7))即debugger;的 Base64定位到SDK 的订单校验逻辑里把反调试字符串当业务数据传回来了。这就是四象限的价值它把模糊的“哪里来的 debugger”问题变成可操作的坐标查询。3.3 精准清除针对不同载体的手术级处理▶ eval 类从源头掐断字符串供给步骤1定位 eval 调用点在 Console 里输入debugger;然后按F8继续等下次断点停住看 Call Stack 顶层的eval调用者。步骤2检查字符串来源在该调用点打个断点鼠标悬停eval的参数变量看它是localStorage.getItem(code)还是response.data.script。步骤3拦截源头如果来自 localStoragelocalStorage.removeItem(code)如果来自 API在 Network 面板 Block 该 URL如果来自硬编码在 Sources 面板搜索eval(找到后注释掉整行别删留作证据。▶ Function 类冻结构造器或重写原型步骤1确认 Function 使用在 Console 里执行console.log(Function.prototype.constructor Function)确保没被篡改。步骤2劫持构造过程执行以下代码仅调试用const originalFunction Function; Function function(...args) { if (args.length 0 /debugger/i.test(args[args.length - 1])) { console.warn(Blocked Function with debugger:, args); return function(){}; } return originalFunction.apply(this, args); };这样任何含debugger的 Function 构造都会被拦截并返回空函数。▶ setInterval 类定位并清除 timer步骤1列出所有活跃 timer在 Console 里执行for(let i0; i1000; i) { if(window[ti]) clearInterval(window[ti]); }—— 这是个暴力清空法适用于 timer ID 被存为变量的情况。步骤2精准查找更优雅的方式window.__timers []; setInterval(() { console.log(Active timers:, window.__timers.length); }, 1000);然后在 Sources 面板搜索setInterval逐个检查回调函数体。步骤3终止特定 timer一旦找到timerId setInterval(...)的赋值行就在它下面加clearInterval(timerId);或直接在 Console 里clearInterval(你的timerId)。▶ DOM 注入类监控并删除 script 节点步骤1设置 DOM 断点在 Elements 面板右键head→Break on→Subtree modifications。步骤2触发并捕获刷新页面或触发交互断点停住后在 Console 里执行console.dir(event.target)看哪个节点被修改。步骤3根除注入逻辑在 Call Stack 里找到插入 script 的函数打个断点然后在 Watch 面板里监控event.target.innerHTML就能看到注入的原始字符串。接着搜索该字符串在源码中的生成逻辑彻底删除。实操心得清除后务必验证。不要只看 debugger 是否消失还要检查业务功能是否正常。曾有个案例我删掉了setInterval(() { debugger; }, 100)结果发现它其实是 SDK 的心跳检测删掉后登录态 30 秒就失效了。所以清除前先问一句“它真的是 bug还是 feature”3.4 长效防护构建自己的“debugger 免疫系统”处理完一次不代表下次安全。我给自己团队建了一套防护机制分为三层开发层代码规范 工具链拦截在 ESLint 配置里加入规则no-debugger: error并启用eslint-plugin-security检查eval和Function在 HBuilderX 的vue.config.js或vue.config.ts里配置configureWebpack用webpack.IgnorePlugin忽略anti-debug相关模块对于 uni-app修改manifest.json的h5节点添加optimization: { removeUnusedImports: true }减少冗余代码。构建层AST 静态扫描用jscodeshift写一个 codemod 脚本自动扫描项目里所有eval(、new Function(、setInterval(调用并生成报告。脚本核心逻辑export default function transformer(file, api) { const j api.jscodeshift; const root j(file.source); const calls root.find(j.CallExpression, { callee: { type: Identifier, name: eval } }).forEach(path { console.log(Found eval at:, path.value.loc); }); return root.toSource(); }每天 CI 流水线跑一次发现问题立刻阻断。运行层浏览器扩展辅助我自研了一个轻量 Chrome 扩展只做一件事监听页面所有eval和Function调用当参数含debugger时自动 console.warn 并记录堆栈。它不拦截只告警既不影响业务又给调试留痕。源码不到 50 行核心是chrome.devtools.inspectedWindow.onResourceContentCommitted.addListener事件监听。这套机制让我们团队近一年没再被“无限 debugger”拖进度。它不追求 100% 拦截那不现实而是让问题从“不可见的幽灵”变成“可追踪的日志”。4. 常见问题与排查技巧实录那些踩过的坑都成了经验4.1 “我明明删了 debugger为什么还在断”——混淆与缓存的双重陷阱这是最高频的疑问。真相往往是你删的是源码里的debugger;但线上运行的是经过 Webpack/UglifyJS 混淆后的代码。混淆器会把debugger重命名为_0xabc123或用void 0、!1等表达式替代你肉眼根本找不到。排查技巧在 Sources 面板按CtrlPCmdP打开文件搜索输入debugger如果搜不到尝试搜void 0、!1、!![]真值表达式在 Console 里执行location.href location.href ?t Date.now()强制刷新绕过 Service Worker 缓存对于 HBuilderX 项目关闭运行→运行到手机或模拟器→启用热更新因为热更新常注入调试逻辑。我遇到过最绝的一次debugger被混淆成this[constructor][constructor](debugger)()即用Function构造器间接调用。你得在 Call Stack 里看到constructor两次嵌套才能意识到这是障眼法。4.2 “HBuilderX 里没问题真机上无限断点”——跨端环境的差异鸿沟HBuilderX 的运行到浏览器和运行到手机是两套完全不同的运行时。前者是 Chromium 内核后者是 WebViewAndroid或 WKWebViewiOS而许多反调试逻辑正是检测navigator.userAgent或window.webkit来区分环境。典型表现浏览器里一切正常真机上setInterval频繁触发 debuggeruni.getSystemInfoSync().platform在浏览器返回dev在真机返回android而反调试逻辑只对android生效。解决方案在main.js开头加if (uni.getSystemInfoSync().platform android) { Object.defineProperty(navigator, userAgent, { value: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 }); }伪造 UA骗过环境检测或更彻底在manifest.json的h5节点里设置useCustomRouter: true用自定义路由规避 SDK 的自动注入。4.3 “断点停在 怎么知道是哪行代码”——Call Stack 的破译指南当 debugger 停在anonymousCall Stack 里全是(anonymous)和eval别慌。这里有三个破译密钥密钥1Scope 面板停住后展开右侧 Scope 面板看Closure或Global下的变量。如果看到code debugger;...说明它来自 eval如果看到fn function(){...}说明来自 Function。密钥2Watch 面板在 Watch 面板里手动输入arguments.callee.toString()非严格模式下它会返回当前函数的源码字符串哪怕它是匿名的。密钥3Event Listener Breakpoints如前所述勾选Script→Script First Statement这样每次 eval 或 Function 执行时都会在第一行暂停你就能看到完整的字符串内容。我曾用arguments.callee.toString()从一个anonymous断点里还原出整段被混淆的反调试逻辑包括它的加密密钥和服务器地址。这比瞎猜高效十倍。4.4 “网页会不会崩溃”——无限 debugger 的真实性能影响很多人担心一直 debugger内存会不会爆CPU 会不会 100%答案是不会崩溃但会严重卡顿。原因在于debugger 语句本身不消耗 CPU它只是让 JS 引擎暂停执行把控制权交给 DevTools。真正消耗资源的是 debugger 触发时DevTools 要采集当前堆栈、作用域、内存快照等数据。如果 setInterval 每 10ms 触发一次DevTools 每秒就要处理 100 次快照UI 线程被占满页面自然卡死。验证方法打开 Performance 面板录制 10 秒看Scripting时间占比在 Memory 面板多次点击Take heap snapshot观察对象数量是否线性增长如果是说明有内存泄漏但和 debugger 无关。所以卡顿 ≠ 崩溃。解决卡顿关键是减少 debugger 触发频率而不是优化代码。4.5 “API Error: 400 invalid schema for function artifact”——这和 debugger 有什么关系这个错误看似无关实则是重要线索。它常出现在使用 DeepSeek、Claude 等 AI API 时而这些 API 的前端 SDK为了防止 prompt 泄露会内置反调试逻辑。artifact是它们的内部函数名invalid schema错误往往是因为 debugger 干扰了 SDK 的校验流程——比如SDK 在eval一段校验代码前会检查debugger是否被禁用如果发现没禁用就故意抛出这个 400 错误让你无法调用 API。应对策略在调用 API 前先执行window.debugger function(){};或在 SDK 初始化时传入{ disableDebug: true }选项如果文档支持最彻底联系 SDK 提供方要求提供“无调试保护”的生产版本。这再次印证无限 debugger 不是孤立现象它是整个前端安全生态的一部分。你处理的不是一个语句而是一整套运行时保护机制。5. 经验总结从“对抗”到“理解”的思维升级处理无限 debugger我走过三个阶段第一阶段对抗——把它当敌人想尽办法关掉、删掉、屏蔽掉。结果是疲于奔命治标不治本。第二阶段溯源——接受它存在的合理性专注找“谁写的、为什么写、怎么触发”。这时我开始读懂 eval 的字符串、Function 的参数、setInterval 的回调甚至 DOM 注入的时机。第三阶段理解——意识到它本质是 JavaScript 动态性的双刃剑eval 让我们能热更新Function 让我们能沙箱执行setInterval 让我们能心跳保活DOM 注入让我们能动态渲染。无限 debugger只是这些能力被用在了“不希望被调试”的场景里。所以我现在教新人的第一课不是“怎么关 debugger”而是“打开 Sources 面板点开任何一个script右键 →Add breakpoint→Subtree modifications然后刷新页面看看有多少脚本是动态加进来的。” 这个动作比任何教程都更能让人理解前端的真实世界。最后分享一个小技巧如果你在 HBuilderX 里开发养成习惯在manifest.json的h5节点里始终加上debug: false。这行配置能禁用大部分 HBuilderX 自动注入的调试逻辑从源头减少 70% 的无限 debugger 问题。它不显眼但很管用。这世上没有真正的“无限”只有我们尚未理解的循环。debugger 如此代码如此工作亦如此。
RELATED

相关推荐

提示词工程实战:10个技巧与模板库,让AI输出质量飙升

提示词工程实战:10个技巧与模板库,让AI输出质量飙升

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/13 20:40:10
Spring Boot启动流程与自动配置原理源码级拆解

Spring Boot启动流程与自动配置原理源码级拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/13 20:35:10
WolfCut开源视频编辑器:Rust+Tauri打造本地化专业剪辑工具

WolfCut开源视频编辑器:Rust+Tauri打造本地化专业剪辑工具

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/13 20:35:10
MORE NEWS

更多资讯

📰

RAG 知识库数据集构建:一份从文档到高质量语料的完整工程手册

这里写自定义目录标题欢迎使用Markdown编辑器引言:为什么说数据集构建是 RAG 的第一生产力第一步:文档解析,决定后续所有环节的上限多格式输入的统一抽象PDF 解析的三大流派扫描件的 OCR 兜底第二步:清洗,把"看起…

📰

AI Agent 工程化实践:从想法验证到数据分析智能体的完整搭建手册

这里写自定义目录标题欢迎使用Markdown编辑器断层:研究演示很酷,工程落地很难一、工程化框架要解决的四件事二、核心概念:先统一语言三、实战:从零构建一个数据分析智能体第一步:定义工具层第二步:搭执行循…

📰

LangGraph+CrewAI+AutoGen生产级AI Agent工程实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

提示词工程系统化实践:从技巧合集到可测试、可维护、可扩展的工程体系

这里写自定义目录标题欢迎使用Markdown编辑器为什么同样的模型,别人比你强?一、提示词工程的技术分层:你在哪一层?二、一个有效提示词的结构:任务说明书而非问题三、核心技巧的适用场景与边界Few-Shot 示例&#xff1a…

📰

网页游戏中国象棋online:从Tomcat部署到WebSocket兼容改造

简介:《网页游戏中国象棋online v2008 build 0313》是一份发布于2008年的网页游戏资源包,面向网页游戏初学者、网页程序设计人员以及中国象棋爱好者,可用于研究早期浏览器游戏的整体架构与网络对战交互流程。该游戏依托浏览器运行&#xff0c…

📰

LeetCode-Go 动态规划实战:用 Go 实现带障碍物的路径计数(Unique Paths II,第 63 题)

LeetCode-Go 动态规划实战:用 Go 实现带障碍物的路径计数(Unique Paths II,第 63 题) 【免费下载链接】LeetCode-Go ✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解 项目地址: https…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬