1. 卡片阴影在鸿蒙设备上消失的那次事故去年下半年我把一个已经跑了两年多的 React Native 业务工程往 OpenHarmony 上搬页面基本都能起来路由、状态管理、网络层都顺得很唯独在设计验收那一刻翻车了iOS 上看起来浮起来的卡片在鸿蒙设备上变成了一张贴在白底上的死板方块。同一个Card组件同一套样式表iOS 有柔和投影安卓有淡淡的层次感鸿蒙那边什么都没有。当时我以为是渲染层级被父容器裁掉了加了三层zIndex也没用后来才发现问题出在elevation与shadow*这组属性在 RNOHReact Native for OpenHarmony渲染管线里的映射差异上。这件事让我意识到Card这种看起来最没技术含量的容器组件恰恰是跨端工程里最容易暴露问题的位置。它什么业务都不做只负责圆角、投影、内边距、点击反馈、可访问性这几件事可这五件事每一件在三端都可能长得不一样。标题里说的通用绝不是把View包一层就叫通用而是要在 iOS、Android、OpenHarmony 三个渲染后端上都得到视觉一致、交互一致、行为可预期的结果。这篇内容讲的就是我怎么把这套东西做出来的Card的职责边界怎么划、props 怎么设计才不至于做成一个什么都塞的万能盒、阴影和圆角在三端怎么落地、点击反馈在鸿蒙侧为什么和安卓不同、折叠屏展开后卡片密度怎么重排、以及一个包含几百张卡片的列表为什么会因为一个内联样式对象掉帧。适合正在做 RNOH 适配、或者准备把现有 RN 组件库迁到鸿蒙上的同学看也适合只想知道卡片组件到底该暴露哪些 API的朋友。后面的所有代码都是 TypeScript 函数组件不依赖任何第三方 UI 库可以整段拷走改。2. 先界定边界Card 到底该负责什么不该负责什么很多团队做组件库第一步就做错把Card设计成一个万能容器支持title、subTitle、avatar、extra、footer、actions、cover、hoverable、bordered、size……一口气二十几个 props。结果就是每来一个新业务就要加 props组件文件从 200 行涨到 1500 行最后没人敢改。我在这个项目上做的第一件事反而是砍功能。2.1 通用不等于万能先划三条职责线我给自己定了三条线。第一条Card只管外观容器相关的东西背景色、边框、圆角、阴影层级、内边距、裁切行为。第二条Card管交互表面的语义它整体是否可点击、点击时的视觉反馈、无触摸时的状态、可访问性角色与描述。第三条Card不管内容布局标题放哪、图片放左还是放右、按钮排几个这些交给组合式子组件去做也就是Card.Header、Card.Body、Card.Footer这一类。这样切的理由很实在。外观和交互语义是跨端一致性最脆弱的部分把它们集中在一个文件里适配鸿蒙时只需要改一处而内容布局是业务千变万化的部分如果硬塞进Card的 props每加一种排版就要动一次组件库适配成本会被无限放大。我见过一个团队在迁移时因为Card里有renderHeader这种渲染函数 prop导致所有调用方都得逐个回归工作量直接翻了三倍。还有一条隐性边界Card不感知业务状态。它不知道这个订单已取消也不该知道。业务状态通过tone语义色调这种抽象的枚举传进来由Card内部映射成具体的颜色 token。比如tonedanger映射到边框红色、背景淡红至于为什么是危险Card不关心。2.2 props 设计表与默认值的取舍最终落到代码里的 props 就这些我把它整理成了表方便团队对着评审属性类型默认值设计意图childrenReactNode无卡片内容paddingnone | sm | md | lgmd用档位而非数字保证全站节奏统一radiusnone | sm | md | lgmd同上避免随手写 7、9、13 这种值elevation0 | 1 | 2 | 31阴影层级0 表示无投影纯描边卡片borderedbooleanfalse是否需要 1px 描边tonedefault | muted | danger | successdefault语义色调映射颜色 tokenonPress() void无传了才进入可交互模式onLongPress() void无长按回调disabledbooleanfalse禁用态同时影响视觉与可访问性accessibilityLabelstring无读屏描述testIDstring无自动化测试定位注意这里有两个刻意的取舍。第一padding和radius用档位不用数字因为跨端项目里最怕的就是设计稿上写 12、开发写 11、另一个页面写 14三端渲染出来再叠加像素密度差异看着就散。档位化之后间距由一个常量表统一管理改一处全站生效。第二onPress不设默认空函数而是undefined。原因后面讲点击态时会展开简单说就是Card需要知道自己到底是一张展示卡还是一个可点区域这两者的 DOM 结构、无障碍角色、按压反馈完全不同用一个默认空函数糊过去等于让所有展示卡都莫名其妙变成了按钮语义。2.3 为什么不做hoverable有人问过要不要加hoverable毕竟平板接鼠标的场景确实存在。我最后没加理由是 RNOH 的指针事件pointer events在不同版本上的支持度还在补齐onPointerEnter这类事件在部分设备上拿不到加了之后行为不确定不如交给业务层自己用Pressable包一层来处理。通用组件的底线是承诺的行为必须三端一致做不到一致的能力宁可不暴露这一点在跨端组件库上比在单端组件库上重要得多。3. 阴影与圆角的落地差异一次 overflow hidden 引发的连锁问题回到开头那次事故。我先把根因说清楚再给方案。3.1 为什么鸿蒙侧的阴影和安卓不一样RN 在 iOS 上的阴影走的是shadowColor/shadowOffset/shadowOpacity/shadowRadius这组属性本质是 CoreAnimation 的 layer 阴影Android 上这组属性长期不生效靠的是elevation走 Material 的原生阴影颜色和扩散半径基本不可控。RNOH 在实现这一层时需要把 RN 的样式属性映射到方舟 UI 框架ArkUI的渲染能力上不同版本对shadowOffset、shadowRadius的支持程度并不完全对齐。我在实测里遇到的三个现象值得记一下只写shadow*不写elevation在部分鸿蒙设备上完全不显示投影只写elevation投影出现了但方向偏下且扩散范围比安卓上大一圈视觉上更重同时写shadow*和elevation多数情况下能拿到最接近 iOS 的效果但个别版本会出现投影重叠、边缘发灰。所以我的结论是不要把阴影寄希望于一套属性通吃三端而是按平台分发并且给鸿蒙单独留一个可调分支。至于Platform.OS在 RNOH 上到底返回什么不同版本的取值可能是harmony早期版本存在回落到android的情况。稳妥做法是不硬编码判断而是写一个兜底import { Platform } from react-native; // 具体取值以工程所用的 RNOH 版本为准这里做兜底避免误判 const OS (Platform.OS as string) ?? ; export const isHarmony OS harmony || OS ohos; export const isAndroidLike OS android || (isHarmony OS android);这段代码看着有点啰嗦但它救过我一次某次升级 SDK 之后Platform.OS的取值变了isHarmony直接为false导致鸿蒙走了 iOS 分支阴影全丢。加了兜底之后至少能保证走到安卓分支视觉效果不至于崩。3.2 overflow hidden 把阴影裁掉的经典陷阱这是独立的第二个坑跟平台无关但跨端项目里出现频率极高。为了让卡片内容比如一张贴边的封面图不溢出圆角大家习惯给容器加overflow: hidden。可一旦这个容器本身同时承担阴影overflow: hidden就会把自身绘制到边界之外的阴影一并裁掉结果就是圆角生效了阴影消失了。更坑的是这个现象在 iOS 上有时看不出来因为阴影绘制层级处理不同在安卓和鸿蒙上则非常明显于是很容易被误判成鸿蒙不支持阴影。解法是把裁切和投影拆到两层外层View只负责投影和圆角的外轮廓不加overflow内层View负责裁切内容加overflow: hidden和同样的圆角。两层圆角值必须一致否则会出现 1px 的白色缝隙那是内层背景色没填满外轮廓造成的。View style{[styles.shadowWrap, shadowStyle, { borderRadius: r }]} View style{[styles.inner, { borderRadius: r, overflow: hidden, backgroundColor: bg }]} {children} /View /View这里有个细节值得单独说外层不要设backgroundColor。因为阴影的绘制依赖轮廓外层如果背景是白的投影会被自身的白色区域覆盖一部分外层透明、内层填色才是正确的层次。我踩过一次外层和内层都填了白色结果阴影只剩下一圈几乎看不见的灰边。3.3 阴影层级映射表我最终用一张表把层级固定下来业务只传elevation{1|2|3}具体数值在组件内部按平台查表不对外暴露层级使用场景iOS 半径/透明度安卓 elevation鸿蒙处理0纯描边卡片、列表内嵌块无0仅描边1常规内容卡、设置项分组8 / 0.061半径 6、透明度 0.052悬浮操作卡、轮播内卡12 / 0.083半径 10、透明度 0.073弹层内卡、强调模块18 / 0.126半径 14、透明度 0.10鸿蒙那一列要单独手调不要直接复用 iOS 的数值因为它底层渲染出来的扩散比例不一样。我实测下来同等视觉强度下鸿蒙需要把半径压到 iOS 的 0.75 倍左右、透明度再降一点看起来才和 iOS 齐平。这个系数没有理论依据纯靠对着设计稿在两台设备之间来回比对调出来的你在自己工程上大概率也要再微调一次因为设备像素密度和屏幕材质都会影响观感。const ELEVATION_MAP { 0: {}, 1: { ios: [8, 0.06], android: 1, harmony: [6, 0.05] }, 2: { ios: [12, 0.08], android: 3, harmony: [10, 0.07] }, 3: { ios: [18, 0.12], android: 6, harmony: [14, 0.10] }, } as const; function resolveShadow(level: 0 | 1 | 2 | 3, color #0B1220): ViewStyle { const conf ELEVATION_MAP[level]; if (level 0) return {}; const base isHarmony ? conf.harmony : conf.ios; const [radius, opacity] base as [number, number]; return { shadowColor: color, shadowOffset: { width: 0, height: Math.round(radius * 0.5) }, shadowOpacity: opacity, shadowRadius: radius, // 兜底部分平台只认 elevation elevation: (conf.android as number), }; }别忘了shadowOffset的height要和半径成比例固定写死4的话高密度屏上会显得投影压不住卡片像浮在半空。3.4 圆角的边界情况圆角在跨端上还有两个小问题。一是borderRadius在设置了borderWidth时某些平台上内描边会画在圆角外侧出现一圈毛边解法是把borderWidth放到内层View上而不是外层。二是当radius大于卡片高度的一半时不同平台对椭圆角的处理不一致最好在组件内部对radius和实际测量高度做一个Math.min限制。这个限制我用onLayout拿到高度后计算const [h, setH] useState(0); const safeRadius h 0 ? Math.min(r, h / 2) : r;多一次onLayout会带来一次额外的渲染所以只在radius档位为lg且卡片高度可能很矮的场景比如横滑的窄卡才启用其余走静态值避免无谓开销。4. 点击反馈与可访问性可交互卡片的两个隐藏维度卡片一旦可点性质就变了。它从一个纯展示元素变成了一个交互控件随之而来的是按压反馈、焦点语义、读屏描述这三件事而这三件事在三端上最容易做得不一致。4.1 Pressable 在鸿蒙侧的表现差异RN 里做点击反馈Pressable基本是首选它的style支持函数形式能拿到pressed状态。问题在于安卓上大家惯用的android_ripple波纹效果在 RNOH 上未必生效实测部分版本点下去毫无水花。同样失效的还有android_disableSound这类安卓专属属性。我的做法是放弃平台专属效果全部用状态驱动Pressable onPress{onPress} onLongPress{onLongPress} disabled{disabled} android_ripple{undefined} style{({ pressed }) [ styles.pressable, pressed !disabled { opacity: 0.72, transform: [{ scale: 0.994 }] }, disabled { opacity: 0.45 }, ]} {children} /Pressable这里opacity: 0.72和scale: 0.994是我反复调出来的数值。透明度压到 0.6 以下会显得闪0.8 以上又几乎看不出反馈缩放幅度超过 0.99 会让卡片在快速点击时产生明显的抖动感尤其是在长列表里。0.994 这个值的好处是几乎只在边缘产生细微位移视觉上像按下去了一点但不会影响周围元素的感知。另外还有一个不易察觉的问题Pressable的按压态在某些设备上会因为手势判定的延迟而闪一下尤其是页面本身带滚动时。如果卡片在ScrollView里建议把按压反馈的放宽判定打开让手指轻微移动时不至于立刻取消Pressable pressRetentionOffset{{ top: 12, left: 12, right: 12, bottom: 12 }} /这个参数的意思是指尖移出卡片边界 12 个点以内仍算作在卡片上按压滚动和点击之间的误判会少很多。4.2 展示卡和交互卡必须是两条渲染路径前面说onPress不设默认值原因就在这。如果onPress为undefinedCard应该渲染成一个普通View此时它没有按钮语义读屏时会把内部文本当作连续内容念出来如果onPress存在则渲染成带accessibilityRolebutton的可控件读屏会提示按钮双击激活。如果统一用Pressable包一层再传空函数后果是所有展示卡都被读屏当成了按钮读屏用户会听到一连串按钮、按钮、按钮却点不出任何反应。这类问题在视觉测试里完全发现不了只有真机开读屏才会暴露。const content ( View style{[styles.inner, innerStyle]}{children}/View ); if (!onPress !onLongPress) { return ( View style{[styles.shadowWrap, shadowStyle, { borderRadius: safeRadius }]} accessible accessibilityLabel{accessibilityLabel} testID{testID} {content} /View ); }无障碍属性这块我固定传三个accessible让整张卡作为一个整体被聚焦而不是内部每一个Text分别聚焦、accessibilityLabel如果业务没传就用兜底文案不要留空空 label 会让读屏跳过、accessibilityState把disabled透传出去。注意accessibilityState在禁用时必须显式传{ disabled: true }光靠视觉透明度降级对读屏用户毫无意义。还有一个小小的坑卡片内部的子元素如果有自己的点击区域比如右下角的详情文字按钮外层的Pressable会把它吞掉。解法是给内部按钮用onStartShouldSetResponder或者直接在外层Pressable上加判断更省事的做法是让内层按钮自己onPress里调用e.stopPropagation()类似的能力——RN 里没有标准的事件冒泡阻止 API实际实现通常是内层用独立的Pressable并给外层传入disabled动态控制。我在项目里的规范是卡片可点就不要再在卡片里放可点元素从设计层面规避这个问题比在代码里绕要干净得多。5. 多设备布局手机、平板、折叠屏下的卡片密度卡片组件的通用还体现在设备适配上。同一套 props在 6 寸手机上是一列铺满在 11 寸平板上应该变成两三列在折叠屏展开态下又需要重排。如果把这件事交给业务页面去判断每个页面都要写一遍断点维护成本爆炸。5.1 断点从哪来为什么不按设备类型判断我的做法是Card本身不做布局而是提供一个useCardGrid的辅助 hook 和CardGroup columns容器让密度决策集中在一处。断点不用设备类型平板/手机判断而是用可用宽度判断因为折叠屏展开后的宽度和一台小平板接近用设备类型判断会漏掉它。可用宽度列数卡片内边距档位说明 3601sm超窄屏压缩内边距保内容360 ~ 5991md常规手机600 ~ 8392md折叠屏展开、小平板竖屏840 ~ 11992lg平板横屏 12003lg大屏、桌面模式import { useWindowDimensions } from react-native; export function useCardColumns() { const { width } useWindowDimensions(); if (width 360) return { columns: 1, padding: sm as const }; if (width 600) return { columns: 1, padding: md as const }; if (width 840) return { columns: 2, padding: md as const }; if (width 1200) return { columns: 2, padding: lg as const }; return { columns: 3, padding: lg as const }; }用useWindowDimensions而不是自己监听Dimensions的change事件是因为前者是响应式的尺寸变化会自动触发重渲染而且不用手动解绑监听少一个内存泄漏的口子。注意宽度阈值不要用写死的像素值而是要结合PixelRatio考虑。不过在 RN 里width本身就是逻辑像素dp所以直接用数值判断是没问题的这点和 Web 上要考虑devicePixelRatio不一样容易搞混。5.2 折叠屏重排时的一个真实抖动折叠屏展开的瞬间宽度会从一个值跳到另一个值如果卡片的高度依赖宽度比如内部有aspectRatio的封面图重排过程中会出现一次明显的布局跳动——先撑高、再缩回肉眼可见。我的处理是在CardGroup里加一个短暂的过渡锁宽度变化后 180ms 内不应用新列数等布局稳定再切。const [stableColumns, setStableColumns] useState(columns); useEffect(() { const t setTimeout(() setStableColumns(columns), 180); return () clearTimeout(t); }, [columns]);180ms 这个值不是随便取的。折叠屏展开的动画时长通常在 300ms 上下但宽度实际变化集中在动画前段180ms 足够覆盖那段跳变设太长比如 400ms会让用户觉得卡片反应慢半拍设太短80ms则拦不住抖动。这个数字我在三台不同形态的设备上试过180ms 是比较通用的。当然如果你的卡片里没有宽高比元素这个锁可以不加纯粹是给有封面图的卡片准备的。6. 渲染性能一个内联样式对象拖垮的长列表做完上面这些组件在视觉和交互上算是过关了但列表页一滑就掉帧尤其是那种一屏能放五六张卡、滑到第 20 屏之后明显卡顿。扒了半天问题出在两个地方。6.1 memo 为什么失效了Card外面套了React.memo理论上 props 没变就不重渲染。但列表里写的是Card elevation{1} style{{ marginBottom: 12 }}.../Cardstyle是个每次渲染都新建的对象字面量引用地址永远不同memo的浅比较永远返回false等于没包。这是个老生常谈的坑但它在卡片组件上格外致命卡片是列表项列表项动辄上百个每次父组件因为滚动位置、加载状态、选中态更新而重渲染上百个卡片就跟着全部重渲染一遍。解法有三层。第一层把常用的间距收进Card自己的 props用枚举档位代替外部传style从接口上就堵住这个口子。第二层memo加自定义比较函数把style做一次深比较只比较一层别写递归export const Card memo(CardInner, (prev, next) { if (prev.style next.style) return true; const a prev.style as object | undefined; const b next.style as object | undefined; if (!a || !b) return false; const ka Object.keys(a); if (ka.length ! Object.keys(b).length) return false; return ka.every((k) (a as any)[k] (b as any)[k]); });第三层也是最有效的就是把卡片内部所有会新建对象的地方提到模块顶层。style{[styles.a, { borderRadius: r }]}这种写法数组每次新建、对象每次新建全都在渲染期分配内存。改成用useMemo缓存或者干脆把borderRadius通过StyleSheet.create预生成一批固定档位的样式按档位查表。6.2 阴影的绘制成本被严重低估第二个性能问题来自阴影本身。阴影是模糊计算绘制成本远高于纯色矩形。一屏里如果有十几张带elevation的卡片滚动时的合成开销会明显上升在性能弱一些的设备上直接表现为滑动粘手。优化手段是按需降级当卡片被判定为远离视口或者处于快速滚动状态时临时把elevation降到 0只保留描边。实现上我是在CardGroup层面监听滚动速度超过阈值就通过 Context 下发给所有卡片const CardPerfContext createContext({ fastScroll: false }); // 在列表容器里 const [fast, setFast] useState(false); CardPerfContext.Provider value{{ fastScroll: fast }} {items.map(...)} /CardPerfContext.Provider卡片内部const { fastScroll } useContext(CardPerfContext)然后elevation{fastScroll ? 0 : elevation}。滚动停下 200ms 后恢复阴影。用户在快速滑动时根本注意不到阴影没了但帧率能明显回来。这个技巧我在两个项目上都用了实测在中低端设备上滚动帧率提升很明显。还有一点overflow: hidden在部分平台上会触发离屏合成进一步增加开销。所以前面那个内层裁切的写法只有在内容真的会溢出时才加卡片里全是文字的话可以省掉这层overflow。7. 排查链路三类高频问题的定位顺序组件做完上线接下来就是无穷无尽的这个卡片有问题。我把遇到过的现象整理成了一套固定的排查顺序按这个顺序走能省掉大量来回试的时间。7.1 从现象到根因的排查表现象第一步查什么第二步常见根因阴影完全不显示是否同时设置了overflow: hidden平台判断分支是否走对裁切吞掉阴影 / 平台识别失败阴影有但方向、浓度不对shadowOffset.height与radius的比例是否被elevation覆盖数值未按平台调圆角失效内层是否有独立背景色且未设圆角是否被子元素撑出边界内层漏设borderRadius点击无反馈是否可交互分支走进了展示分支disabled是否被意外置 trueprops 透传链路中断点击区域偏小是否有透明区域被pointerEvents挡掉内层View是否吞了事件层级事件拦截折叠屏重排抖动是否有宽高比元素过渡锁时长未做过渡锁这个表的用法是从左往右不要跳步。我见过最典型的错误是看到阴影不显示直接去调shadowRadius加大数值试了十几次都不行其实根因是overflow: hidden跟半径一点关系没有。7.2 三次踩坑的完整复盘第一次是空白卡片。现象是卡片有圆角、有阴影、有内边距但内容区一片空白。排查顺序先在外面套个红底View确认卡片本身渲染了 → 说明卡片在是内容没出来 → 检查children发现业务传的是undefined→ 再往上追业务传的是{cond Text/}cond为false时返回false而false在 RN 里虽然不渲染但会占位。真正的根因是内层容器设了flex: 1但没有父级高度约束导致内容被压缩到 0 高。修复是把内层容器的flex: 1去掉改成内容自适应。第二次是鸿蒙上点击没反应。奇怪的是同一份代码在 iOS 和安卓上都正常。排查顺序先确认onPress有没有传到 → 打日志确认传到了 → 那就说明事件没触发 → 检查是不是被上层遮挡 → 发现卡片外层包了一个绝对定位的View用于装饰没设pointerEventsnone→ 这个装饰层把点击全挡了。这里要注意pointerEvents的默认值在不同平台上历史行为不完全一致装饰层一律显式写pointerEventsnone是最保险的。第三次是读屏把整张卡片念了两遍。根因是外层View加了accessible内层文字没有合并读屏先聚焦外层读一遍accessibilityLabel再切到内层逐个读。修复是给内层容器加importantForAccessibilityno-hide-descendants安卓侧配合外层的accessible让读屏只认外层这一个节点。这个属性在 RNOH 上的支持情况需要按版本验证如果不支持退而求其次是给内层每个Text设accessible{false}。7.3 一个容易被忽略的测试习惯上面这些问题没有一个能在模拟器上完整复现。阴影要看真机、点击要看真机、读屏必须真机。我的习惯是每做完一个卡片变体就在三台设备上各过一遍一台小屏手机、一台平板、一台折叠屏每台都开一次读屏走一遍。听起来很重但比起上线后被用户反馈再回滚这个成本几乎可以忽略。另外建议给Card加一个调试模式的开关打开后给卡片加一层醒目的虚线描边用来确认边界和点击区域。这个开关在排查点击区域偏小内容溢出这类问题时非常好用比反复改样式快得多const debugStyle __DEV__ debug ? { borderWidth: 1, borderColor: magenta, borderStyle: dashed as const } : null;这个__DEV__判断很关键生产包里必须自动失效别让调试描边跟着上线。我就见过一次忘了判断灰溜溜发了个热修。最后说个我个人在实际操作中的体会Card这种组件的价值不在于它有多复杂而在于它把跨端差异收了进来。差异不会消失只会转移位置——要么散落在几百个业务页面里每次适配鸿蒙都要全量回归要么集中在这么一个两百行的文件里改一次全站生效。我现在做新项目第一件事就是把这个文件先立起来后面所有的页面都往上面叠回头看省下的时间远超当初写它的那两天。至于后续还可以怎么扩我一般的做法是先把暗色主题的颜色 token 接进来——Card的tone映射表换成从主题上下文读取其余逻辑一行不动成本很低。
企业数字化 ERP 产品动态
相关推荐
Foundation滑块组件开发指南与最佳实践 1. Foundation滑块组件概述Foundation框架中的滑块(Slider)控件是现代Web应用中不可或缺的交互元素。作为前端开发老手,我亲历过无数表单设计场景,发现合理运用滑块控件能显著提升数据输入效率——特别是在需要快速调整数值范围的… · 2026/11/4 5:45:17
AX:面向AI Agent的Kubernetes原生运行时框架 1. 项目概述:从“ax”这个极简标题切入,我们到底在谈什么?很多人第一次看到“ax”这两个字符,第一反应是数学里的变量、坐标系里的横轴,或者某个缩写。但结合当前技术社区里高频出现的热搜词——AX、Agent Substrate、… · 2026/11/4 5:45:17
双向可控硅功率可调与过零检测电路设计实战 做恒温加热台的那个哥们上周把板子烧了,原因很朴素:过零检测的光耦限流电阻算小了,上电那一瞬间浪涌把 LED 打穿,光耦直接短路,双向可控硅门极被灌进一个持续电流,加热管满功率干烧到通红。这类事故在双向可… · 2026/11/4 5:45:17
Hermes Agent 金融投资顾问实战:3 步跑通投资组合优化与风险评估 Hermes Agent 金融投资顾问实战:3 步跑通投资组合优化与风险评估
一个季度回撤 20%,很多投资者的第一反应是慌,第二反应是翻仓位表找原因——但表上只有持仓,没有答案。Hermes Agent 是 Nous Research 开源的自进化 AI 智能体框架… · 2026/11/4 6:28:25
Hermes Agent:连接池参数怎么配,4 个指标验证调优生效 Hermes Agent:连接池参数怎么配,4 个指标验证调优生效
凌晨 3 点告警:连接池打满,接口 P99 飙到 8 秒,日志刷满 PoolTimeout。别急着拉大数字——Hermes Agent 的出站连接池和会话状态库是两处独立配置,这… · 2026/11/4 6:28:25
CTR-NitroFueled-PC ISA重写指南:老CPU(Sandy/Ivy Bridge)为何也能流畅运行游戏 【免费下载链接】CTR-NitroFueled-PC Crash Team Racing: Nitro-Fueled (PS4) running natively on Windows 10/11. Windows fork of SacredFire, built on bbport and shadPS4. No game files included. 项目地址: https://gitcode.com/gh_mirrors/ct/CTR-NitroFue… · 2026/11/4 6:28:25
Hermes Agent 配置全解:从 3 条命令到多场景定制 Hermes Agent 配置全解:从 3 条命令到多场景定制
Hermes Agent 是一个会在对话中自我进化的 AI 代理:装好之后你能把它接进命令行、Docker 和 Telegram,并随时切换模型、开关工具。下面按"先跑起来,再按场景调"的顺序讲… · 2026/11/4 6:28:25
Hermes Agent 新手指南:3 分钟装好,5 个功能跑通你的第一个智能体 Hermes Agent 新手指南:3 分钟装好,5 个功能跑通你的第一个智能体
整理 300 篇参考文献,你花了一整个周末?Hermes Agent 是一个由 Nous Research 开发的开源自进化 AI 代理:它会从你的使用中创建技能、记住你的偏好&a… · 2026/11/4 6:28:25
如何用pi-purge做提示词A/B测试:系统提示词单变量隔离实验的完整方法论 【免费下载链接】pi-purge pi extension: /purge swaps pis built-in assistant persona for your own prompt file 项目地址: https://gitcode.com/gh_mirrors/pi/pi-purge 点击查看 免费下载 为什么你的提示词对比实验总是"说不清原因"
改一句系统提示… · 2026/11/4 6:27:25
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46