[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-excel-export-performance-en":3,"blog-adjacent-excel-export-performance-en":29,"blog-related-excel-export-performance-en":66},{"id":4,"slug":5,"title":6,"excerpt":7,"content":8,"cover":9,"tone":10,"author":11,"publishedAt":12,"updatedAt":12,"readingMinutes":13,"featured":14,"tags":15,"category":19,"seoSettings":28},37,"excel-export-performance","Why Report Exports Are So Slow","Freezing the browser while exporting a hundred thousand rows is rarely a file-writing problem. It is about queries and memory.","\u003Cp>In any admin system, export is the feature people complain about. Users click and watch a spinner for a minute, sometimes until the request times out. We have optimised over a dozen exports and the causes cluster in three places.\u003C\u002Fp>\n\u003Ch2>Three typical causes\u003C\u002Fh2>\n\u003Cp>Loading everything into memory at once. A hundred thousand rows across twenty columns becomes hundreds of megabytes once materialised.\u003C\u002Fp>\n\u003Cp>Querying inside a loop. Each row hits a related table, so ten thousand rows means ten thousand queries.\u003C\u002Fp>\n\u003Cp>Synchronous export. The request stays open while the file builds, the gateway times out, and the work continues invisibly in the background.\u003C\u002Fp>\n\u003Ch2>How we rebuild it\u003C\u002Fh2>\n\u003Cp>Stream the output: query and write in chunks so memory stays bounded.\u003C\u002Fp>\n\u003Cp>Batch-load related data up front and join it in memory instead of per row.\u003C\u002Fp>\n\u003Cp>For large files, switch to an async job: return a task id immediately and notify the user when the file is ready.\u003C\u002Fp>\n\u003Cp>Export looks trivial but tests queries, memory and UX at once. Making it solid noticeably raises trust in the whole backend.\u003C\u002Fp>","","indigo","佳益方圆团队","2026-07-25T16:31:00+08:00",1,false,[16,17,18],"Reporting","Export","Performance",{"id":13,"parentId":20,"slug":21,"name":22,"description":23,"icon":24,"cover":9,"tone":25,"kind":26,"sortOrder":27,"count":20},0,"engineering","Engineering","Hands-on engineering practices in architecture, performance optimization, AI integration and cross-platform delivery from our R and D team.","cpu","blue","article",60,{},{"previous":30,"next":48},{"id":31,"slug":32,"title":33,"excerpt":34,"content":9,"cover":9,"tone":35,"author":11,"publishedAt":36,"updatedAt":36,"readingMinutes":13,"featured":14,"tags":37,"category":41},16,"payment-terms-before-kickoff","Settle Payment Terms Before the Kickoff","Most disputes are not about bad delivery. They are about money that was never described clearly.","cyan","2026-07-27T15:18:00+08:00",[38,39,40],"Startup","Contracts","Collections",{"id":42,"parentId":20,"slug":43,"name":44,"description":45,"icon":46,"cover":9,"tone":25,"kind":26,"sortOrder":47,"count":20},6,"founder-notes","Founder Notes","Reflections from the founding team on business, management and product, documenting the growth of a software company.","pen-tool",10,{"id":49,"slug":50,"title":51,"excerpt":52,"content":9,"cover":9,"tone":53,"author":11,"publishedAt":54,"updatedAt":55,"readingMinutes":13,"featured":14,"tags":56,"category":59},9,"tech-open-day-2026","Tech Open Day: Explaining Architecture Decisions to Customers","We opened an internal architecture review to customers and explained every trade-off in language they could understand. It is part of building long-term trust.","teal","2026-07-24T16:30:00+08:00","2026-10-18T15:58:14.758+08:00",[57,58],"Tech Open Day","Customer Communication",{"id":60,"parentId":20,"slug":61,"name":62,"description":63,"icon":64,"cover":9,"tone":25,"kind":26,"sortOrder":65,"count":20},4,"team-culture","Team and Culture","Company events, tech sharing, team building and hiring culture that show the daily life of the Jiayifangyuan team.","users",30,[67,76,88],{"id":65,"slug":68,"title":69,"excerpt":70,"content":9,"cover":9,"tone":35,"author":11,"publishedAt":71,"updatedAt":71,"readingMinutes":13,"featured":14,"tags":72,"category":75},"integration-api-pitfalls","Five Traps in Enterprise System Integration","However complete the API documentation is, integration usually stalls on field semantics, timeouts and repeated pushes.","2026-10-17T09:00:00+08:00",[73,74,22],"Integration","APIs",{"id":13,"parentId":20,"slug":21,"name":22,"description":23,"icon":24,"cover":9,"tone":25,"kind":26,"sortOrder":27,"count":20},{"id":13,"slug":77,"title":78,"excerpt":79,"content":9,"cover":9,"tone":35,"author":11,"publishedAt":80,"updatedAt":81,"readingMinutes":82,"featured":83,"tags":84,"category":87},"why-enterprise-systems-age","Why Enterprise Systems Start to Age After Three Years","A system can pass acceptance with every feature checked, then feel awkward three years later. The problem is rarely the code — it is the changes that were never considered at delivery.","2026-10-16T09:30:00+08:00","2026-10-18T15:58:14.648+08:00",2,true,[85,86],"System Evolution","Architecture",{"id":13,"parentId":20,"slug":21,"name":22,"description":23,"icon":24,"cover":9,"tone":25,"kind":26,"sortOrder":27,"count":20},{"id":89,"slug":90,"title":91,"excerpt":92,"content":9,"cover":9,"tone":25,"author":11,"publishedAt":93,"updatedAt":93,"readingMinutes":13,"featured":14,"tags":94,"category":98},31,"idempotent-design-basics","Idempotency: Duplicate Submissions Are Not Just Double Clicks","Retries, redelivery and impatient users all send the same request more than once. Idempotency belongs in the API design.","2026-10-05T10:13:00+08:00",[95,96,97],"API Design","Idempotency","Reliability",{"id":13,"parentId":20,"slug":21,"name":22,"description":23,"icon":24,"cover":9,"tone":25,"kind":26,"sortOrder":27,"count":20}]