[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"knowledge-\u002Fapi\u002Fknowledge\u002Fteam-documents\u002F05":3,"knowledge-related-\u002Fknowledge\u002Fteam-documents\u002F05":817,"knowledge-series-\u002Fknowledge\u002Fteam-documents\u002F05":845},{"source":4,"connector":5,"page":6},"sqlite","better-sqlite3",{"path":7,"title":8,"description":9,"category":10,"tags":11,"date":16,"pinned":17,"draft":17,"body":18,"seo":813,"stem":814,"id":815,"extension":816},"\u002Fknowledge\u002Fteam-documents\u002F05","内部插件 \u002F 工具库开发实践","在企业前端项目中，utils、hooks、libs 这类通用能力通常分散在多个仓库，常见问题包括：","团队文档",[12,13,14,15],"team","vue","performance","table","2021-08-19",false,{"type":19,"value":20,"toc":786},"minimark",[21,25,30,46,62,65,92,95,99,104,135,139,159,163,172,174,178,181,217,220,235,237,241,244,254,257,298,300,304,308,334,338,341,361,364,375,379,382,407,409,413,417,420,481,484,492,496,499,564,568,614,617,625,627,631,635,646,650,661,665,676,678,682,703,705,708,782],[22,23,8],"h1",{"id":24},"内部插件-工具库开发实践",[26,27,29],"h2",{"id":28},"_1-背景与目标","1. 背景与目标",[31,32,33,34,38,39,38,42,45],"p",{},"在企业前端项目中，",[35,36,37],"code",{},"utils","、",[35,40,41],{},"hooks",[35,43,44],{},"libs"," 这类通用能力通常分散在多个仓库，常见问题包括：",[47,48,49,53,56,59],"ul",{},[50,51,52],"li",{},"各项目重复拷贝“可能有用”的工具函数；",[50,54,55],{},"实际使用面窄，沉淀质量不高；",[50,57,58],{},"规则变更难以同步，版本漂移严重；",[50,60,61],{},"引入后无人维护，逐渐演变为“幽灵依赖”。",[31,63,64],{},"因此，建设内部工具库的核心目标是：",[47,66,67,74,80,86],{},[50,68,69,73],{},[70,71,72],"strong",{},"统一沉淀","：一处维护、多处复用；",[50,75,76,79],{},[70,77,78],{},"可治理","：有版本、有变更记录、有发布流程；",[50,81,82,85],{},[70,83,84],{},"可协作","：可评审、可测试、可追溯；",[50,87,88,91],{},[70,89,90],{},"可扩展","：逐步形成团队工程规范与能力平台。",[93,94],"hr",{},[26,96,98],{"id":97},"_2-技术选型与原则","2. 技术选型与原则",[100,101,103],"h3",{"id":102},"_21-推荐组合","2.1 推荐组合",[47,105,106,112,118,128],{},[50,107,108,111],{},[35,109,110],{},"Monorepo + pnpm workspace","：统一管理多包依赖与联调；",[50,113,114,117],{},[35,115,116],{},"TypeScript","：对外暴露稳定类型，降低接入歧义；",[50,119,120,123,124,127],{},[35,121,122],{},"Vite Library Mode","（底层使用 Rollup）：生成 ",[35,125,126],{},"ESM\u002FCJS"," 产物（如确有需要再补 UMD）；",[50,129,130,131,134],{},"测试框架（如 ",[35,132,133],{},"Vitest","）+ 类型检查 + Lint：作为发布门禁。",[100,136,138],{"id":137},"_22-选型原则","2.2 选型原则",[47,140,141,147,153],{},[50,142,143,146],{},[70,144,145],{},"优先简单可维护","：先解决 80% 场景，不做过度抽象；",[50,148,149,152],{},[70,150,151],{},"以复用数据驱动收录","：只有跨项目验证过价值的能力才进入公共库；",[50,154,155,158],{},[70,156,157],{},"先规范后规模","：先定义目录、命名、发布与回滚机制，再扩大模块范围。",[100,160,162],{"id":161},"_23-暂缓项说明","2.3 暂缓项说明",[47,164,165],{},[50,166,167,168,171],{},"暂不引入 ",[35,169,170],{},"Rust"," 等异构语言封装。对于前端工具库，过早引入跨语言链路会增加构建复杂度与维护成本；仅在明确性能瓶颈且收益可量化时评估。",[93,173],{},[26,175,177],{"id":176},"_3-包设计与功能边界","3. 包设计与功能边界",[31,179,180],{},"建议将“工具库”拆分为多个职责清晰的包，避免单包无限膨胀：",[47,182,183,189,195,205,211],{},[50,184,185,188],{},[35,186,187],{},"@org\u002Futils","：通用函数（日期、数值、字符串、节流、防抖等）；",[50,190,191,194],{},[35,192,193],{},"@org\u002Fvalidators","：校验规则与校验器（手机号、邮箱等）；",[50,196,197,200,201,204],{},[35,198,199],{},"@org\u002Fhooks","：",[35,202,203],{},"Vue 3"," 组合式逻辑（分页、加载态、弹窗状态管理等）；",[50,206,207,210],{},[35,208,209],{},"@org\u002Frequest","（规划中）：HTTP 客户端工厂（拦截器、重试、错误策略）；",[50,212,213,216],{},[35,214,215],{},"@org\u002Ftracking","（规划中）：埋点上报适配层。",[31,218,219],{},"收录边界建议：",[47,221,222,225,232],{},[50,223,224],{},"与具体业务强耦合的逻辑不进入公共库；",[50,226,227,228,231],{},"与 UI 框架强绑定的组件单独维护（如后续拆分 ",[35,229,230],{},"ui-library","）；",[50,233,234],{},"每个导出函数必须有类型声明、示例和最小测试用例。",[93,236],{},[26,238,240],{"id":239},"_4-工程结构建议monorepo","4. 工程结构建议（Monorepo）",[31,242,243],{},"可参考如下目录结构：",[245,246,252],"pre",{"className":247,"code":249,"language":250,"meta":251},[248],"language-text","packages\u002F\n  utils\u002F\n  validators\u002F\n  hooks\u002F\n  request\u002F\n  tracking\u002F\n","text","",[35,253,249],{"__ignoreMap":251},[31,255,256],{},"每个包建议至少包含：",[47,258,259,265,280,286,292],{},[50,260,261,264],{},[35,262,263],{},"src\u002F","：源码；",[50,266,267,270,271,38,274,38,277,231],{},[35,268,269],{},"package.json","：导出字段（",[35,272,273],{},"exports",[35,275,276],{},"types",[35,278,279],{},"sideEffects",[50,281,282,285],{},[35,283,284],{},"tsconfig.json","：包级类型配置；",[50,287,288,291],{},[35,289,290],{},"README.md","：安装、示例、变更说明；",[50,293,294,297],{},[35,295,296],{},"CHANGELOG.md","：版本变更记录。",[93,299],{},[26,301,303],{"id":302},"_5-构建发布与版本治理","5. 构建、发布与版本治理",[100,305,307],{"id":306},"_51-构建建议","5.1 构建建议",[47,309,310,321,327],{},[50,311,312,313,316,317,320],{},"产物优先提供 ",[35,314,315],{},"ESM"," 与 ",[35,318,319],{},"CJS","，满足主流工程环境；",[50,322,323,324,326],{},"标记 ",[35,325,279],{},"，帮助 Tree Shaking；",[50,328,329,330,333],{},"保证 ",[35,331,332],{},".d.ts"," 声明文件随产物一并发布。",[100,335,337],{"id":336},"_52-版本策略","5.2 版本策略",[31,339,340],{},"采用语义化版本（SemVer）：",[47,342,343,349,355],{},[50,344,345,348],{},[35,346,347],{},"MAJOR","：不兼容变更；",[50,350,351,354],{},[35,352,353],{},"MINOR","：向后兼容的新功能；",[50,356,357,360],{},[35,358,359],{},"PATCH","：向后兼容的问题修复。",[31,362,363],{},"发布前应明确：",[47,365,366,369,372],{},[50,367,368],{},"变更影响范围；",[50,370,371],{},"是否需要迁移说明；",[50,373,374],{},"是否需要提供回滚版本。",[100,376,378],{"id":377},"_53-发布门禁建议","5.3 发布门禁（建议）",[31,380,381],{},"在 CI 中至少串联以下检查：",[383,384,385,394,399,404],"ol",{},[50,386,387,390,391],{},[35,388,389],{},"lint"," + ",[35,392,393],{},"typecheck",[50,395,396],{},[35,397,398],{},"test",[50,400,401],{},[35,402,403],{},"build",[50,405,406],{},"变更日志校验（确保每次发布有记录）",[93,408],{},[26,410,412],{"id":411},"_6-安装与分发方式","6. 安装与分发方式",[100,414,416],{"id":415},"_61-方式一通过私有-npm-源安装推荐","6.1 方式一：通过私有 npm 源安装（推荐）",[31,418,419],{},"适合团队常规协作，统一依赖来源与版本审计。",[245,421,425],{"className":422,"code":423,"language":424,"meta":251,"style":251},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","# 配置作用域私有源（示例）\nnpm config set @your-scope:registry https:\u002F\u002Fnexus.example.com\u002Frepository\u002Fnpm-private\u002F\n\n# 安装\npnpm add @your-scope\u002Ffunctional-helpers\n","bash",[35,426,427,436,456,463,469],{"__ignoreMap":251},[428,429,432],"span",{"class":430,"line":431},"line",1,[428,433,435],{"class":434},"sutJx","# 配置作用域私有源（示例）\n",[428,437,439,443,447,450,453],{"class":430,"line":438},2,[428,440,442],{"class":441},"sbgvK","npm",[428,444,446],{"class":445},"s_sjI"," config",[428,448,449],{"class":445}," set",[428,451,452],{"class":445}," @your-scope:registry",[428,454,455],{"class":445}," https:\u002F\u002Fnexus.example.com\u002Frepository\u002Fnpm-private\u002F\n",[428,457,459],{"class":430,"line":458},3,[428,460,462],{"emptyLinePlaceholder":461},true,"\n",[428,464,466],{"class":430,"line":465},4,[428,467,468],{"class":434},"# 安装\n",[428,470,472,475,478],{"class":430,"line":471},5,[428,473,474],{"class":441},"pnpm",[428,476,477],{"class":445}," add",[428,479,480],{"class":445}," @your-scope\u002Ffunctional-helpers\n",[31,482,483],{},"说明：",[47,485,486,489],{},[50,487,488],{},"推荐使用“作用域级别 registry”而不是全局切换源，避免影响公共包下载；",[50,490,491],{},"私服建议启用 HTTPS、访问控制与审计日志。",[100,493,495],{"id":494},"_62-方式二指定-tarball-地址","6.2 方式二：指定 tarball 地址",[31,497,498],{},"适用于试点阶段或临时验证，不希望调整全局源配置。",[245,500,504],{"className":501,"code":502,"language":503,"meta":251,"style":251},"language-json shiki shiki-themes material-theme-lighter github-light github-dark","{\n  \"dependencies\": {\n    \"@your-scope\u002Ffunctional-helpers\": \"https:\u002F\u002Fnexus.example.com\u002Frepository\u002Fnpm-private\u002F@your-scope\u002Ffunctional-helpers\u002F-\u002Ffunctional-helpers-1.0.0.tgz\"\n  }\n}\n","json",[35,505,506,512,531,554,559],{"__ignoreMap":251},[428,507,508],{"class":430,"line":431},[428,509,511],{"class":510},"sP7_E","{\n",[428,513,514,518,522,525,528],{"class":430,"line":438},[428,515,517],{"class":516},"s39Yj","  \"",[428,519,521],{"class":520},"sseR_","dependencies",[428,523,524],{"class":516},"\"",[428,526,527],{"class":510},":",[428,529,530],{"class":510}," {\n",[428,532,533,536,540,542,544,548,551],{"class":430,"line":458},[428,534,535],{"class":516},"    \"",[428,537,539],{"class":538},"sZMiF","@your-scope\u002Ffunctional-helpers",[428,541,524],{"class":516},[428,543,527],{"class":510},[428,545,547],{"class":546},"sjJ54"," \"",[428,549,550],{"class":445},"https:\u002F\u002Fnexus.example.com\u002Frepository\u002Fnpm-private\u002F@your-scope\u002Ffunctional-helpers\u002F-\u002Ffunctional-helpers-1.0.0.tgz",[428,552,553],{"class":546},"\"\n",[428,555,556],{"class":430,"line":465},[428,557,558],{"class":510},"  }\n",[428,560,561],{"class":430,"line":471},[428,562,563],{"class":510},"}\n",[100,565,567],{"id":566},"_63-方式三离线文件依赖隔离网络-特殊-ci","6.3 方式三：离线文件依赖（隔离网络 \u002F 特殊 CI）",[245,569,571],{"className":501,"code":570,"language":503,"meta":251,"style":251},"{\n  \"dependencies\": {\n    \"@your-scope\u002Ffunctional-helpers\": \"file:.\u002Ffunctional-helpers-1.0.0.tgz\"\n  }\n}\n",[35,572,573,577,589,606,610],{"__ignoreMap":251},[428,574,575],{"class":430,"line":431},[428,576,511],{"class":510},[428,578,579,581,583,585,587],{"class":430,"line":438},[428,580,517],{"class":516},[428,582,521],{"class":520},[428,584,524],{"class":516},[428,586,527],{"class":510},[428,588,530],{"class":510},[428,590,591,593,595,597,599,601,604],{"class":430,"line":458},[428,592,535],{"class":516},[428,594,539],{"class":538},[428,596,524],{"class":516},[428,598,527],{"class":510},[428,600,547],{"class":546},[428,602,603],{"class":445},"file:.\u002Ffunctional-helpers-1.0.0.tgz",[428,605,553],{"class":546},[428,607,608],{"class":430,"line":465},[428,609,558],{"class":510},[428,611,612],{"class":430,"line":471},[428,613,563],{"class":510},[31,615,616],{},"适用场景：",[47,618,619,622],{},[50,620,621],{},"受网络策略限制，构建节点无法访问私服；",[50,623,624],{},"CI 通过缓存机制提前准备好发布包。",[93,626],{},[26,628,630],{"id":629},"_7-质量保障与协作规范","7. 质量保障与协作规范",[100,632,634],{"id":633},"_71-文档与示例","7.1 文档与示例",[47,636,637,640,643],{},[50,638,639],{},"每个包提供最小可运行示例；",[50,641,642],{},"关键 API 给出输入\u002F输出示例与边界行为说明；",[50,644,645],{},"明确“稳定 API”与“实验性 API”。",[100,647,649],{"id":648},"_72-贡献流程","7.2 贡献流程",[47,651,652,655,658],{},[50,653,654],{},"统一分支策略与提交规范（Conventional Commits）；",[50,656,657],{},"PR 必须包含：变更说明、测试结果、影响评估；",[50,659,660],{},"发布由 CI 执行，尽量避免本地手工发布。",[100,662,664],{"id":663},"_73-兼容与回滚","7.3 兼容与回滚",[47,666,667,670,673],{},[50,668,669],{},"重大升级前给出迁移指南；",[50,671,672],{},"保留最近稳定版本的回滚通道；",[50,674,675],{},"对高风险改动提供灰度接入方案。",[93,677],{},[26,679,681],{"id":680},"_8-后续规划","8. 后续规划",[47,683,684,694,697,700],{},[50,685,686,687,38,690,693],{},"按复用度逐步引入 ",[35,688,689],{},"request",[35,691,692],{},"tracking"," 等基础能力；",[50,695,696],{},"对接内部脚手架，支持初始化时按需安装工具包；",[50,698,699],{},"建立版本更新提醒机制（如在 CI 检测可升级版本）；",[50,701,702],{},"周期性清理低使用率 API，控制包体积与维护成本。",[93,704],{},[26,706,707],{"id":707},"参考文献",[383,709,710,722,731,740,755,764,773],{},[50,711,712,713,716],{},"pnpm 官方文档",[714,715],"br",{},[717,718,719],"a",{"href":719,"rel":720},"https:\u002F\u002Fpnpm.io\u002F",[721],"nofollow",[50,723,724,725,727],{},"Vite 文档：Library Mode",[714,726],{},[717,728,729],{"href":729,"rel":730},"https:\u002F\u002Fvite.dev\u002Fguide\u002Fbuild.html#library-mode",[721],[50,732,733,734,736],{},"TypeScript 官方文档",[714,735],{},[717,737,738],{"href":738,"rel":739},"https:\u002F\u002Fwww.typescriptlang.org\u002Fdocs\u002F",[721],[50,741,742,743,745,749,751],{},"npm 文档：scope 与 registry 配置",[714,744],{},[717,746,747],{"href":747,"rel":748},"https:\u002F\u002Fdocs.npmjs.com\u002Fcli\u002Fv10\u002Fusing-npm\u002Fscope",[721],[714,750],{},[717,752,753],{"href":753,"rel":754},"https:\u002F\u002Fdocs.npmjs.com\u002Fcli\u002Fv10\u002Fusing-npm\u002Fconfig#registry",[721],[50,756,757,758,760],{},"SemVer 官方规范",[714,759],{},[717,761,762],{"href":762,"rel":763},"https:\u002F\u002Fsemver.org\u002F",[721],[50,765,766,767,769],{},"Conventional Commits",[714,768],{},[717,770,771],{"href":771,"rel":772},"https:\u002F\u002Fwww.conventionalcommits.org\u002F",[721],[50,774,775,776,778],{},"Sonatype Nexus Repository（npm）",[714,777],{},[717,779,780],{"href":780,"rel":781},"https:\u002F\u002Fhelp.sonatype.com\u002Fen\u002Fnpm-registry.html",[721],[783,784,785],"style",{},"html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":251,"searchDepth":438,"depth":438,"links":787},[788,789,794,795,796,801,806,811,812],{"id":28,"depth":438,"text":29},{"id":97,"depth":438,"text":98,"children":790},[791,792,793],{"id":102,"depth":458,"text":103},{"id":137,"depth":458,"text":138},{"id":161,"depth":458,"text":162},{"id":176,"depth":438,"text":177},{"id":239,"depth":438,"text":240},{"id":302,"depth":438,"text":303,"children":797},[798,799,800],{"id":306,"depth":458,"text":307},{"id":336,"depth":458,"text":337},{"id":377,"depth":458,"text":378},{"id":411,"depth":438,"text":412,"children":802},[803,804,805],{"id":415,"depth":458,"text":416},{"id":494,"depth":458,"text":495},{"id":566,"depth":458,"text":567},{"id":629,"depth":438,"text":630,"children":807},[808,809,810],{"id":633,"depth":458,"text":634},{"id":648,"depth":458,"text":649},{"id":663,"depth":458,"text":664},{"id":680,"depth":438,"text":681},{"id":707,"depth":438,"text":707},{"title":8,"description":9},"knowledge\u002Fteam-documents\u002F05","knowledge\u002Fknowledge\u002Fteam-documents\u002F05.md","md",{"items":818},[819,824,829,833,837,841],{"path":820,"title":821,"description":822,"category":10,"score":823},"\u002Fknowledge\u002Fteam-documents\u002F19","GridView 宫格加载渲染优化","系统首页 GridView 宫格模块接口耗时不高，但首次进入总耗时接近 22s。复盘耗时分层定位过程、代码层面的瓶颈（约 2000 行、100 个 tab 重复节点）、优化手段与最终指标对比。",15,{"path":825,"title":826,"description":827,"category":10,"score":828},"\u002Fknowledge\u002Fteam-documents\u002F13","新商家系统性能优化实践","商家系统新版本上线后，团队持续针对构建效率与用户体验做了一轮系统性优化。本文记录核心方案与落地结果，供后续版本复用。",12,{"path":830,"title":831,"description":832,"category":10,"score":828},"\u002Fknowledge\u002Fteam-documents\u002F04","老系统升级与兼容改造实践","公司原有业务系统采用 Node + jQuery 架构，长期运行后暴露出典型遗留系统问题：",{"path":834,"title":835,"description":836,"category":10,"score":828},"\u002Fknowledge\u002Fteam-documents\u002F21","vxe-table 行 Hover 联动高亮","近期需求是双表格联动高亮：",{"path":838,"title":839,"description":840,"category":10,"score":828},"\u002Fknowledge\u002Fteam-documents\u002F01","执行价格弹窗：表头 \u002F 表体合并与可配置表格","业务需要在「执行价格」类弹窗中展示多块价格配置（基础、颜色、规格、行业等）。每块区域具备：",{"path":842,"title":843,"description":844,"category":10,"score":828},"\u002Fknowledge\u002Fteam-documents\u002F02","防篡改水印","在各类管理后台、SaaS 平台或内部系统中，页面水印已经是非常常见的能力：一方面在截图时携带账号、姓名、时间等信息，降低截图外传的风险；另一方面在上传图片或文档预览时，通过水印标记上传者与时间，满足审计和合规需求。",{"series":846,"title":847,"items":848,"index":465,"prev":922,"next":923},"team-documents","team documents",[849,851,853,857,859,860,864,868,872,876,880,884,888,890,894,898,902,906,910,912,916,918],{"path":838,"title":839,"date":850,"pinned":17},"2024-07-27",{"path":842,"title":843,"date":852,"pinned":17},"2024-01-09",{"path":854,"title":855,"date":856,"pinned":17},"\u002Fknowledge\u002Fteam-documents\u002F03","键盘弹起导致底部被顶起问题（H5 适配）","2024-09-17",{"path":830,"title":831,"date":858,"pinned":17},"2024-12-12",{"path":7,"title":8,"date":16,"pinned":17},{"path":861,"title":862,"date":863,"pinned":17},"\u002Fknowledge\u002Fteam-documents\u002F06","企业微信与小程序工单问题","2025-10-01",{"path":865,"title":866,"date":867,"pinned":17},"\u002Fknowledge\u002Fteam-documents\u002F07","企业微信群工具打开缓慢原因分析","2020-04-12",{"path":869,"title":870,"date":871,"pinned":17},"\u002Fknowledge\u002Fteam-documents\u002F08","属性排序需求","2024-06-16",{"path":873,"title":874,"date":875,"pinned":17},"\u002Fknowledge\u002Fteam-documents\u002F09","同业主重复单提醒规则","2020-06-07",{"path":877,"title":878,"date":879,"pinned":17},"\u002Fknowledge\u002Fteam-documents\u002F10","图片上传前的自定义水印实践","2021-06-10",{"path":881,"title":882,"date":883,"pinned":17},"\u002Fknowledge\u002Fteam-documents\u002F11","系统下单（重复单提示框）异常复盘","2023-11-21",{"path":885,"title":886,"date":887,"pinned":17},"\u002Fknowledge\u002Fteam-documents\u002F12","系统自动更新说明","2025-05-26",{"path":825,"title":826,"date":889,"pinned":17},"2025-04-08",{"path":891,"title":892,"date":893,"pinned":17},"\u002Fknowledge\u002Fteam-documents\u002F14","选项卡切换与 Loading 状态封装","2019-11-03",{"path":895,"title":896,"date":897,"pinned":17},"\u002Fknowledge\u002Fteam-documents\u002F15","移动端返回事件触发两次问题复盘","2021-03-09",{"path":899,"title":900,"date":901,"pinned":17},"\u002Fknowledge\u002Fteam-documents\u002F16","在线协作表格接入实践","2023-10-27",{"path":903,"title":904,"date":905,"pinned":17},"\u002Fknowledge\u002Fteam-documents\u002F17","支付中转页面升级实践","2022-10-15",{"path":907,"title":908,"date":909,"pinned":17},"\u002Fknowledge\u002Fteam-documents\u002F18","中英文输入法下搜索触发冲突复盘","2024-09-01",{"path":820,"title":821,"date":911,"pinned":17},"2026-03-17",{"path":913,"title":914,"date":915,"pinned":17},"\u002Fknowledge\u002Fteam-documents\u002F20","H5 GPS 定位问题说明","2023-08-31",{"path":834,"title":835,"date":917,"pinned":17},"2024-08-31",{"path":919,"title":920,"date":921,"pinned":17},"\u002Fknowledge\u002Fteam-documents\u002F22","企业微信 uni-app H5：OAuth 回退白屏与列表缓存","2023-08-17",{"path":830,"title":831,"date":858,"pinned":17},{"path":861,"title":862,"date":863,"pinned":17}]