小程序页面来源追踪:从启动参数到路由封装的完整解决方案
1. 从一次“用户从哪里来”的困惑说起做小程序开发尤其是涉及到用户行为分析、数据统计或者一些需要根据用户进入路径做差异化处理的场景时有一个问题会频繁地冒出来“当前这个用户到底是从哪个页面、哪个渠道点进来的”这听起来像是个简单的问题不就是获取上一个页面吗但实际做起来你会发现小程序的页面栈和路由机制远比你想象的要复杂和“狡猾”。我最近就遇到一个典型的业务需求在一个电商小程序里商品详情页需要根据用户是从“首页推荐”点击进来还是从“搜索列表”点击进来展示不同的营销信息或优惠券。如果是从首页来的可能是新用户需要展示新人专享价如果是从搜索来的说明用户目的明确可以展示“满减”或“包邮”信息。一开始我理所当然地想到了用wx.navigateTo传递参数或者在onLoad里尝试获取上一个页面的信息。结果发现当用户通过分享卡片、小程序码、公众号菜单甚至是手机桌面快捷方式进入时这些常规方法统统失效。页面来源变成了一团迷雾。这正是wx.getLaunchOptionsSync()这个API的价值所在。它不是一个普通的页面路由API而是小程序启动时的“时光胶囊”封装了小程序被打开那一刻的完整场景信息。搞清楚它和页面级参数获取的区别是解决“来源”问题的关键第一步。这篇文章我就结合踩过的坑和实战经验把小程序获取页面来源这件事从原理到实操再到那些官方文档里不会写的细节给你彻底讲明白。2. 核心概念辨析启动参数 vs. 页面参数在深入代码之前我们必须先厘清两个最容易混淆的概念小程序的启动和页面的加载。这是理解来源获取的基石。2.1 什么是“启动”什么又是“页面”你可以把小程序的启动想象成一家商店的“开业”。用户通过点击聊天框的分享卡片、扫描门店的小程序码、从公众号文章跳转或者直接在微信下拉列表里找到你的小程序图标并点击——这些动作都触发了小程序的“开业”仪式。这个“开业”瞬间所产生的信息就是启动参数。而“页面加载”则是顾客进入商店后从一个货架页面走到另一个货架页面的过程。比如从首页(index)点击商品跳转到详情页(detail)这个过程是通过wx.navigateTo或组件navigator实现的此时可以携带的参数我们称之为页面参数。wx.getLaunchOptionsSync()管的是“开业”时的信息而页面onLoad函数里的options参数通常只管理“店内走动”时传递的信息。很多开发者试图在详情页的onLoad里用getCurrentPages()回溯上一个页面来获取来源这在用户从首页直接进入时可能有效但如果用户是第一次通过扫描带参数的小程序码进入详情页那么页面栈里只有详情页自己你根本回溯不到所谓的“上一个页面”。2.2wx.getLaunchOptionsSync()的“管辖范围”这个API返回的是一个对象我们最需要关注的是里面的scene场景值和query启动参数字段。scene (场景值)这是一个数字代码它精确地告诉你用户是以何种“姿势”打开小程序的。例如1001: 发现栏小程序主入口。1011: 扫描二维码。1044: 带参数的小程序卡片分享。1089: 微信聊天主界面下拉“最近使用”栏基础库2.2.4版本起。 通过场景值你可以宏观地判断入口类型。微信官方有完整的场景值列表但在实际开发中我们通常只关心几个核心场景。query (启动查询参数)这是一个对象包含了启动时附带的参数。这是获取具体来源信息的黄金钥匙。参数从哪里来主要来自以下几个渠道小程序码在生成小程序码时传入的scene参数在启动后会被解析到query中。注意这里有个转换生成时叫scene接收时在query里。例如你生成一个sceneid123fromad的小程序码用户扫描后在query里你会得到{id: “123”, from: “ad”}。分享卡片使用wx.shareAppMessage分享时在path中设置的query参数。例如path: ‘pages/detail/detail?id100shareUid456’。公众号菜单/模板消息在配置时设置的跳转路径和参数。外部链接通过wx.openEmbeddedMiniProgram或云开发静态网站跳转时携带的参数。关键点wx.getLaunchOptionsSync()获取到的query只在小程序冷启动即从完全关闭状态打开时有效且每个小程序实例生命周期内只生效一次。如果用户已经打开了小程序然后通过分享卡片进入一个新页面这时新页面onLoad里的options参数是分享时带的参数而getLaunchOptionsSync()返回的依然是第一次冷启动时的参数不会变。这就是为什么不能单纯用它来追踪所有“页面来源”它追踪的是“小程序来源”。3. 实战构建一个健壮的来源追踪方案理解了原理我们来搭建一个能在大多数情况下准确判断来源的实战方案。我们的目标是在任意一个页面都能知道用户最初是从哪里进入小程序的以及当前页面是从哪里跳转过来的。3.1 方案设计全局AppData 页面路由拦截单纯依赖一个API是不够的。我采用的是一种混合方案在App的onLaunch中捕获并存储启动来源这是最原始、最可靠的“入口溯源”。封装路由方法在每次跳转时记录“上一页”信息这解决了小程序内部导航的来源问题。在页面中综合判断两种来源优先使用页面跳转来源若没有则降级使用启动来源。3.2 第一步在App.onLaunch中固化启动来源我们在app.js的onLaunch函数里第一时间把启动信息存到全局的AppData中。// app.js App({ globalData: { launchOptions: null // 用于存储启动参数 }, onLaunch(options) { // 同步API立即获取并存储 const launchOptions wx.getLaunchOptionsSync(); this.globalData.launchOptions launchOptions; // 打印日志便于调试 console.log([App] 冷启动场景值 scene:, launchOptions.scene); console.log([App] 冷启动参数 query:, launchOptions.query); console.log([App] 启动路径 path:, launchOptions.path); // 你也可以在这里根据scene做一些初始化操作比如不同场景下发不同的欢迎弹窗 this._handleLaunchScene(launchOptions.scene); }, _handleLaunchScene(scene) { // 示例处理特定场景 const sceneMap { 1011: 扫描二维码进入, 1044: 通过分享卡片进入, 1089: 从最近使用列表进入 }; if (sceneMap[scene]) { console.log([App] 进入方式: ${sceneMap[scene]}); // 可以在此处触发全局事件或设置全局状态 } } });为什么一定要在onLaunch里做因为getLaunchOptionsSync()必须在onLaunch或onShow生命周期中调用才能拿到本次启动的参数。放在globalData里就相当于为这次小程序会话建立了一个“出生档案”所有页面都可以随时查阅。3.3 第二步封装路由方法记录页面级来源小程序原生的wx.navigateTo等跳转方法不会自动帮你记录来源。我们需要封装一层在跳转时把当前页面的信息“捎”给下一个页面。// utils/route.js /** * 增强版跳转函数携带来源信息 * param {Object} options 与原wx.navigateTo参数一致可额外包含 _fromPage 信息 */ export function navigateTo(options) { const pages getCurrentPages(); const currentPage pages[pages.length - 1]; // 当前页面实例 let url options.url; // 获取当前页面的路由标识例如 ‘pages/index/index’ const fromRoute currentPage ? currentPage.route : ‘unknown’; // 如果url已经带有参数则追加否则新增 const separator url.includes(‘?’) ? ‘’ : ‘?’; // 将来源信息作为参数传递。这里用 _from 作为键名避免与业务参数冲突。 url ${url}${separator}_from${encodeURIComponent(fromRoute)}; // 如果需要传递更多信息如页面对象上的自定义数据可以这样处理 // const fromData currentPage.data.someInfo; // if (fromData) { // url _fromData${encodeURIComponent(JSON.stringify(fromData))}; // } // 调用原生API wx.navigateTo({ ...options, url: url }); } // 同理可以封装 redirectTo, switchTab, reLaunch 等 // 注意switchTab 和 reLaunch 会清空页面栈传递来源意义不大通常只需处理 navigateTo 和 redirectTo在页面中我们就不再使用wx.navigateTo而是使用自己封装的navigateTo// pages/index/index.js import { navigateTo } from ‘../../utils/route’; // 业务代码中 onTapProduct(e) { const productId e.currentTarget.dataset.id; // 使用封装后的方法跳转 navigateTo({ url: /pages/detail/detail?id${productId} }); }这样当从首页跳转到详情页时详情页的onLoad函数的options参数里就会多一个_from字段其值是‘pages/index/index’。3.4 第三步在目标页面中综合判断来源现在我们可以在任意页面例如商品详情页编写一个通用的来源判断逻辑。// pages/detail/detail.js const app getApp(); Page({ data: { productInfo: null, entrySource: ‘unknown’ // 用于在页面上展示或逻辑判断的来源 }, onLoad(options) { const { id, _from } options; // _from 是封装路由传递的页面来源 const { globalData } app; const launchQuery globalData.launchOptions ? globalData.launchOptions.query : {}; // 核心判断逻辑 let finalSource ‘unknown’; // 优先级1页面跳转携带的来源最精确的上一页 if (_from) { finalSource page_${_from}; // 例如 ‘page_pages/index/index’ console.log([Detail] 来源页面跳转来自 ${_from}); } // 优先级2启动参数中携带的来源例如分享卡片、小程序码 else if (launchQuery.from) { finalSource launch_${launchQuery.from}; // 例如 ‘launch_share’ console.log([Detail] 来源冷启动参数来自 ${launchQuery.from}); } // 优先级3启动场景值宏观入口 else if (globalData.launchOptions) { const scene globalData.launchOptions.scene; const sceneMap { 1011: ‘scan’, 1044: ‘share_card’, 1089: ‘recent’ }; finalSource scene_${sceneMap[scene] || scene}; console.log([Detail] 来源启动场景场景值 ${scene}); } this.setData({ entrySource: finalSource }); // 根据最终来源执行不同的业务逻辑 this._fetchProductDetail(id, finalSource); }, _fetchProductDetail(productId, source) { // 模拟向服务器请求商品详情并附带来源信息用于数据分析或差异化返回 wx.request({ url: ‘https://your.api.com/product/detail’, data: { id: productId, source: source // 将来源信息传给后端 }, success: (res) { let productData res.data; // 根据来源前端也可以做差异化渲染 if (source.includes(‘page_pages/index/index’)) { // 来自首页可能是推荐流量展示新人标签 productData.tag ‘新人专享’; } else if (source.includes(‘launch_share’)) { // 来自分享展示“好友分享”专属价 productData.tag ‘分享特惠’; } this.setData({ productInfo: productData }); } }); } });这个逻辑确保了来源判断的优先级最精确的页面跳转来源 启动时携带的业务参数来源 宏观的场景值来源。覆盖了从内部导航到外部引流的绝大部分情况。4. 高级场景与疑难杂症处理上面的方案能解决90%的问题但小程序生态里还有一些“边角”场景需要特别处理。4.1 分享卡片进入非首页的场景这是最容易出错的地方。假设用户A将商品详情页分享给用户B。用户B点击卡片小程序冷启动直接打开了详情页。此时app.js的onLaunch中launchOptions.path是‘pages/detail/detail…’query里包含分享者设置的参数如shareUid。在详情页的onLoad中options参数也包含了同样的query。但是我们封装的_from参数是不存在的因为这不是一次内部导航而是一次冷启动直达。怎么办在我们的判断逻辑中这种情况会落入优先级2launchQuery.from。因此在生成分享卡片时我们必须在path里加入来源标识// 在详情页中设置分享 onShareAppMessage() { return { title: ‘这个商品很棒’, path: /pages/detail/detail?id${this.data.productId}fromshare_cardshareUid123 }; }这样当其他用户通过此卡片进入时launchQuery.from值为‘share_card’我们就能知道他是通过分享进来的而不是从首页浏览来的。4.2 公众号菜单、模板消息等固定入口这些入口在配置时就需要规划好参数。例如在公众号菜单配置跳转小程序时页面路径可以设置为pages/index/index?fromofficial_account_menu。这样用户点击菜单进入启动参数中就带上了from标识。我们的逻辑会通过优先级2捕获它。4.3 App.onShow 的注意事项wx.getLaunchOptionsSync()也可以在App.onShow中调用。onShow在冷启动和热启动小程序从后台切到前台时都会触发。但在热启动时getLaunchOptionsSync()返回的是上一次冷启动的参数而不是切前台时的参数。如果你需要监听用户每次将小程序切到前台时的场景比如从另一个小程序返回应该使用onShow的回调参数而不是getLaunchOptionsSync。// app.js App({ onShow(res) { // res.scene, res.query, res.path 是本次切前台时的场景信息基础库2.8.0 // 这与 getLaunchOptionsSync() 在热启动时的返回值不同 console.log(‘[App] onShow 场景值:’, res.scene); console.log(‘[App] onShow 参数:’, res.query); // 注意从另一个小程序返回时res中会有 referrerInfo 信息这是另一个重要的来源渠道 if (res.referrerInfo res.referrerInfo.appId) { console.log(‘[App] 从另一个小程序返回来源AppId:’, res.referrerInfo.appId); } } })4.4 页面栈被清空的情况使用wx.redirectTo或wx.reLaunch会替换或清空页面栈。使用我们封装的路由方法时如果原页面被重定向_from参数依然可以传递。但如果是wx.switchTab跳转到Tab页情况特殊因为Tab页的加载生命周期和普通页面不同且无法传递参数。对于Tab页的来源判断通常只能依赖全局的launchOptions或存储在全局状态管理如globalData、Vuex、MobX中的信息。5. 数据上报与业务应用获取来源的最终目的是为了用。除了前端页面做差异化展示更重要的是将来源数据上报到数据分析平台进行用户行为分析。5.1 设计上报数据模型一个完整的页面访问事件上报应该包含以下核心字段const trackEvent { event: ‘page_view’, timestamp: Date.now(), page_route: ‘pages/detail/detail’, // 当前页面路径 page_query: { id: ‘100’ }, // 当前页面参数 // 来源系统 referrer_system: { type: ‘’, // ‘page_navigate’ | ‘cold_launch’ | ‘hot_show’ from_page: ‘pages/index/index’, // 仅type‘page_navigate’时有值 launch_query: { from: ‘share’ }, // 冷启动参数 launch_scene: 1044, // 冷启动场景值 show_query: {}, // onShow参数热启动 show_scene: 1001 // onShow场景值 }, user_id: ‘xxx’, // 用户ID session_id: ‘xxx’ // 会话ID };5.2 封装统一上报函数在app.js的onLaunch中或在一个独立的日志模块里封装上报函数。在页面onLoad中调用该函数上报访问事件。// utils/analytics.js export function trackPageView(pageInstance, extraData {}) { const app getApp(); const pages getCurrentPages(); const currentPage pages[pages.length - 1]; const launchOptions app.globalData.launchOptions || {}; let referrerType ‘cold_launch’; let fromPage ‘’; // 这里可以集成第3.4节的判断逻辑更精细地确定referrerType和fromPage // ... const eventData { event: ‘page_view’, page_route: currentPage.route, page_query: currentPage.options, referrer_system: { type: referrerType, from_page: fromPage, launch_query: launchOptions.query, launch_scene: launchOptions.scene }, ...extraData }; // 调用你的上报接口例如使用wx.request或接入第三方SDK console.log(‘[Analytics]’, eventData); // wx.request({ url: ‘your_log_server’, data: eventData, method: ‘POST’ }); }5.3 业务应用场景举例精准营销如前所述根据entrySource展示不同的优惠信息。流量分析分析不同分享渠道如哪个KOC分享的卡片、不同公众号菜单带来的转化率。归因分析用户最终下单购买功劳应该算给最初的扫码推广还是算给中途看到的分享卡片准确的来源链记录能帮助进行广告归因。异常排查当某个页面出现大量错误或用户反馈时通过分析这些用户的进入来源可以快速定位问题是否与特定入口有关例如某个带特殊参数的小程序码配置错误。6. 避坑指南与性能优化在实际开发中我总结了一些容易踩坑的地方和优化建议。坑1过度依赖getLaunchOptionsSync进行页面级判断这是最常见的错误。牢记它的生命周期特性冷启动一次。不要在每个页面的onShow里都调用它来判断是否“刚进入”这得不到正确结果。正确的做法是将启动信息存储在全局如上文所述。坑2来源参数键名冲突我们在路由封装中使用了_from作为参数键名这是一种约定俗成的做法通常用下划线开头表示系统参数以减少与业务参数如id,type冲突的风险。在解析页面options时要做好过滤。坑3分享路径参数过长微信对分享卡片的路径长度有限制。如果携带的参数过多比如把整个页面对象序列化传过去可能导致分享失败。因此在路由封装中传递来源信息时应尽量精简只传递必要的标识符如页面路由而非大量数据。优化1延迟上报与批量上报为了不影响主线程性能和用户体验页面浏览事件不必实时上报。可以缓存在本地如wx.setStorageSync定时或在下一次网络请求时批量上报。优化2来源信息脱敏与安全来源参数可能包含敏感信息如分享者的用户ID。在上报或存储时需注意脱敏处理遵守数据安全规范。同时对接收到的query参数要做好校验和过滤防止XSS等攻击。优化3兼容性处理wx.getLaunchOptionsSync()在基础库 2.1.2 开始支持。对于更低版本可以使用wx.getLaunchOptions()异步API进行兼容。同样App.onShow的返回参数中的scene和query在基础库 2.8.0 开始支持如需兼容更早版本需要做降级处理。获取页面来源本质上是在理解小程序的运行生命周期和路由机制。它不是一个孤立的API调用问题而是一个需要结合全局状态管理、路由封装和数据上报的系统性工程。希望这套从原理到实战再到避坑的完整思路能帮你彻底理清这团“迷雾”让你的小程序在用户行为洞察上更加清晰、智能。

相关新闻

Spring Boot自动装配原理与生产级应用实战指南

Spring Boot自动装配原理与生产级应用实战指南

1. 项目概述:为什么我们需要一次系统性的Spring Boot复习? 又到了期末季,对于很多Java后端方向的同学来说,Spring Boot这门课绝对是复习的重中之重。它不像纯粹的理论课,背背概念就能过关;也不像基础语法&a…

2026/10/19 5:14:28 阅读更多 →
深入解析Windows $RECYCLE.BIN:从回收站机制到数据恢复实战

深入解析Windows $RECYCLE.BIN:从回收站机制到数据恢复实战

1. 项目概述:从回收站到系统探秘如果你在Windows系统里打开过C盘、D盘,大概率见过一个名为$RECYCLE.BIN的文件夹,它总是带着一个系统图标,半透明,删不掉,也打不开。很多人把它当成一个普通的“回收站”&…

2026/10/20 13:28:04 阅读更多 →
深入解析Windows回收站机制:$RECYCLE.BIN工作原理与实战管理

深入解析Windows回收站机制:$RECYCLE.BIN工作原理与实战管理

1. 项目概述:从回收站文件夹窥探Windows文件系统管理那天在整理一块移动硬盘时,我习惯性地按下了Ctrl Shift .来显示所有隐藏文件和文件夹,一个熟悉的“幽灵”文件夹$RECYCLE.BIN赫然出现在根目录。对于大多数Windows用户来说,这…

2026/10/17 3:09:30 阅读更多 →

最新新闻

LeetCode栈类题目全攻略:括号匹配、单调栈与表达式求值

LeetCode栈类题目全攻略:括号匹配、单调栈与表达式求值

最近把 LeetCode 上栈相关的题目集中刷了一遍,从最基础的括号匹配,到单调栈、表达式求值,再到把递归改成迭代的二叉树遍历,一路刷下来最大的感受是:栈这个结构看着简单,但玩法真的很多。很多题目表面包装得…

2026/10/20 14:30:54 阅读更多 →
OpenClaw安全加固指南:将DevSecOps嵌入CI/CD全流程

OpenClaw安全加固指南:将DevSecOps嵌入CI/CD全流程

简介:本资源是面向AI工程实践者与自托管开发者的安全加固实战指南,聚焦OpenClaw这一开源自托管个人AI代理的全链路安全防护。针对其易部署但权限宽松、插件生态风险高、Prompt注入防御薄弱等典型问题,提供从安装后立即执行的基础检查、核心配…

2026/10/20 14:30:54 阅读更多 →
厂商AI能力对比:7个可验证的生产级硬指标

厂商AI能力对比:7个可验证的生产级硬指标

1. 项目概述:这根本不是一场“谁家模型更大”的发布会最近在某高校实验室带一个跨平台智能体开发项目,团队里三位刚转行的开发者连续两周卡在同一个问题上:明明调用的是同一家大厂标注为“支持多模态推理”的API接口,但处理同一段…

2026/10/20 14:30:54 阅读更多 →
基于BP神经网络的发动机万有特性图拟合与Matlab实现

基于BP神经网络的发动机万有特性图拟合与Matlab实现

干过台架测试的人都有体会:折腾一个发动机的万有特性图,最费时间的不是画图本身,而是凑够那几十上百个稳态工况点。转速、转矩、燃油消耗率三个量,台架上一组一组地测、一个一个地记,有时候连续占设备两三天&#xff0…

2026/10/20 14:30:54 阅读更多 →
沐曦与红帽联手MXAIE:国产GPU的AI基础设施生态破局

沐曦与红帽联手MXAIE:国产GPU的AI基础设施生态破局

在当前AI基础软件生态快速收敛的节点上,一个国产GPU厂商和一个老牌企业级Linux发行版厂商坐到一起,搞出来的这个MXAIE方案,确实值得花点时间研究下。我做AI基础设施相关工作很多年,平时打交道最多的就是各种加速卡、驱动、容器运行…

2026/10/20 14:30:54 阅读更多 →
Web自动化测试实战:验证码分级处理与PO三层架构设计

Web自动化测试实战:验证码分级处理与PO三层架构设计

1. 从“验证码绕不过去”到“再也不用碰验证码”的转变先说个我自己项目里的真实数据。某次回归测试,因为验证码模块在凌晨3点更新了一次加密逻辑,早上9点全组的自动化用例直接挂了30%。而处理这个问题花了整整两天:一部分时间在等开发改测试…

2026/10/20 14:29:41 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/20 9:50:45 阅读更多 →