{“4efbb6b3-3786-4ba2-bc6e-299369b6149d”:{“id”:”4efbb6b3-3786-4ba2-bc6e-299369b6149d”,”type”:”Paragraph”,”value”:[{“id”:”11d5e328-6bb6-4945-a3ca-7ecc9d43aa25″,”type”:”paragraph”,”children”:[{“text”:”This document captures the current hot spots identified in the codebase together with a forward-looking set of code standards and performance practices. Use it as the baseline for implementation work, code reviews, and ongoing optimisation.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:0}},”27e80d41-a4ac-4fd7-9795-c9058e310503″:{“id”:”27e80d41-a4ac-4fd7-9795-c9058e310503″,”type”:”HeadingTwo”,”value”:[{“id”:”c43c93be-eb1d-472a-9f14-3fbffca8eeb5″,”type”:”heading-two”,”children”:[{“text”:”Observed Hot Spots & Immediate Recommendations”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:1}},”55f7f8db-a46d-4a75-b098-6a346ab219bb”:{“id”:”55f7f8db-a46d-4a75-b098-6a346ab219bb”,”type”:”Paragraph”,”value”:[{“id”:”d370de12-47c7-4a70-8bfa-0077f7ec9492″,”type”:”paragraph”,”children”:[{“text”:”Impact:”,”bold”:true},{“text”:” Addressing these areas will reduce initial bundle cost, improve navigation latency, and stabilise background fetch behaviour.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:7}},”0bb3dbc3-f28d-487d-b45c-ea2f6a8b77af”:{“id”:”0bb3dbc3-f28d-487d-b45c-ea2f6a8b77af”,”type”:”HeadingTwo”,”value”:[{“id”:”3ac30457-a410-495b-a113-e801ffdb4520″,”type”:”heading-two”,”children”:[{“text”:”Architectural & Coding Standards”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:8}},”0173eb61-8ab8-4e80-81ed-19ade0042187″:{“id”:”0173eb61-8ab8-4e80-81ed-19ade0042187″,”type”:”HeadingThree”,”value”:[{“id”:”db0a25aa-d385-42a5-b8a6-b3ca0f96257a”,”type”:”heading-three”,”children”:[{“text”:”Routing & Module Boundaries”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:9}},”19e72f72-0812-4f9c-93fa-8b65ac313553″:{“id”:”19e72f72-0812-4f9c-93fa-8b65ac313553″,”type”:”BulletedList”,”value”:[{“id”:”a454d70c-87a3-4e0f-8a53-babd6b1eb7c0″,”type”:”bulleted-list”,”children”:[{“text”:”Group routes by domain and create layout shells (e.g., MainLayout, FinanceLayout).”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:10}},”0a5fedfe-498b-4055-b3b3-64d081988ed5″:{“id”:”0a5fedfe-498b-4055-b3b3-64d081988ed5″,”type”:”BulletedList”,”value”:[{“id”:”686ed7d8-ef25-4338-b033-669a23a0bd10″,”type”:”bulleted-list”,”children”:[{“text”:”Lazy-load feature modules and prefer route-level code splitting.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:11}},”09c7c93f-c9c1-49ac-8f86-26fa3a5c44ab”:{“id”:”09c7c93f-c9c1-49ac-8f86-26fa3a5c44ab”,”type”:”BulletedList”,”value”:[{“id”:”efeb30da-2e5a-45d5-b8be-432efd1e017f”,”type”:”bulleted-list”,”children”:[{“text”:”Keep router configuration static and export it from its own module.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:12}},”a2d18242-a495-4e9a-826c-fc0b3b333a7a”:{“id”:”a2d18242-a495-4e9a-826c-fc0b3b333a7a”,”type”:”HeadingThree”,”value”:[{“id”:”35f65080-551c-45b6-ad6d-4edaeaddb175″,”type”:”heading-three”,”children”:[{“text”:”Component Patterns”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:13}},”e3860af0-056a-4cd5-9278-38ceacb9332e”:{“id”:”e3860af0-056a-4cd5-9278-38ceacb9332e”,”type”:”BulletedList”,”value”:[{“id”:”289da916-cfca-4d8a-bde6-bd0e6cd2fdba”,”type”:”bulleted-list”,”children”:[{“text”:”Use functional components with hooks; extract reusable layout fragments.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:14}},”49b36eda-12fe-4ee5-a933-f39c4dc17252″:{“id”:”49b36eda-12fe-4ee5-a933-f39c4dc17252″,”type”:”BulletedList”,”value”:[{“id”:”618634e9-3ce7-48bb-a12e-86471b25714e”,”type”:”bulleted-list”,”children”:[{“text”:”Memoise expensive derived data with useMemo/useCallback.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:15}},”88820728-8e11-498e-9451-dd436ce7da09″:{“id”:”88820728-8e11-498e-9451-dd436ce7da09″,”type”:”BulletedList”,”value”:[{“id”:”8b24990e-aea1-4672-afde-c0d73819f824″,”type”:”bulleted-list”,”children”:[{“text”:”Avoid inline functions inside large list renders.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:16}},”464f7712-e8cc-4f01-bf5b-dfd5601d8ab8″:{“id”:”464f7712-e8cc-4f01-bf5b-dfd5601d8ab8″,”type”:”HeadingThree”,”value”:[{“id”:”0aed0e79-7de0-4892-9c40-8174b62fb437″,”type”:”heading-three”,”children”:[{“text”:”State Management”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:17}},”3030f9df-38ad-4519-b81e-919f956edbf5″:{“id”:”3030f9df-38ad-4519-b81e-919f956edbf5″,”type”:”BulletedList”,”value”:[{“id”:”f0ea98ac-7aac-4265-915d-4dcf9b92f814″,”type”:”bulleted-list”,”children”:[{“text”:”Keep Redux slices serialisable and pure.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:18}},”8e34b908-aa0a-4c9e-a315-d51cfc359002″:{“id”:”8e34b908-aa0a-4c9e-a315-d51cfc359002″,”type”:”BulletedList”,”value”:[{“id”:”3f91a209-a0d7-4938-b694-113ee497e9b5″,”type”:”bulleted-list”,”children”:[{“text”:”Normalise large collections (ids + entities).”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:19}},”4bedacd1-524b-4d32-ad89-3a7c2afd08c9″:{“id”:”4bedacd1-524b-4d32-ad89-3a7c2afd08c9″,”type”:”BulletedList”,”value”:[{“id”:”fb27a187-6cd8-461c-8b11-d705b9f78d5d”,”type”:”bulleted-list”,”children”:[{“text”:”Use RTK Query or TanStack Query for remote data.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:20}},”03fbc073-20be-4e79-b5d1-a837bd114a01″:{“id”:”03fbc073-20be-4e79-b5d1-a837bd114a01″,”type”:”BulletedList”,”value”:[{“id”:”caeb2c31-fe52-4fc5-ad12-7f059810b740″,”type”:”bulleted-list”,”children”:[{“text”:”Memoise expensive selectors with createSelector.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:21}},”7fd718b6-58be-424b-afec-327bcf5e9db8″:{“id”:”7fd718b6-58be-424b-afec-327bcf5e9db8″,”type”:”HeadingThree”,”value”:[{“id”:”8d8f9936-fbd0-4b04-9077-feb2ae77b0a6″,”type”:”heading-three”,”children”:[{“text”:”Data Fetching & Caching”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:22}},”4da6e7a9-7016-4545-8fa5-c61c353e422a”:{“id”:”4da6e7a9-7016-4545-8fa5-c61c353e422a”,”type”:”BulletedList”,”value”:[{“id”:”b81d87a3-0890-434b-9217-0817b217f859″,”type”:”bulleted-list”,”children”:[{“text”:”Co-locate queries with screens; centralise API clients.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:23}},”91989e8d-d518-41a6-b3a0-65c520329d24″:{“id”:”91989e8d-d518-41a6-b3a0-65c520329d24″,”type”:”BulletedList”,”value”:[{“id”:”df76bf6a-5601-405d-a957-edf5fd22534f”,”type”:”bulleted-list”,”children”:[{“text”:”Use per-request AbortController instances.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:24}},”217c176d-21c4-4501-8faa-639bfbf8ee14″:{“id”:”217c176d-21c4-4501-8faa-639bfbf8ee14″,”type”:”BulletedList”,”value”:[{“id”:”eacdeb7c-ded3-4db8-b60d-6fe1dabaace0″,”type”:”bulleted-list”,”children”:[{“text”:”Guard loaders with cache timestamps/ETags.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:25}},”d0766c2d-77a7-46dc-b1c1-62b3a0556832″:{“id”:”d0766c2d-77a7-46dc-b1c1-62b3a0556832″,”type”:”BulletedList”,”value”:[{“id”:”ec78142e-f681-4c68-8cc9-26761545842f”,”type”:”bulleted-list”,”children”:[{“text”:”Debounce searches with useDeferredValue or useTransition.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:26}},”0412ec6e-3420-4aa7-a364-e8e8ec98f6f8″:{“id”:”0412ec6e-3420-4aa7-a364-e8e8ec98f6f8″,”type”:”HeadingThree”,”value”:[{“id”:”3d242476-db71-463d-be13-f761043ee02f”,”type”:”heading-three”,”children”:[{“text”:”Rendering & UI Performance”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:27}},”2320aab6-6b4e-4c3b-9327-38fe292e0fb6″:{“id”:”2320aab6-6b4e-4c3b-9327-38fe292e0fb6″,”type”:”BulletedList”,”value”:[{“id”:”93278bb1-92b3-483f-9e40-6a6155eabf37″,”type”:”bulleted-list”,”children”:[{“text”:”Virtualise large tables/lists.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:28}},”16bb048f-20f2-421b-b4fd-0ea55d7728c6″:{“id”:”16bb048f-20f2-421b-b4fd-0ea55d7728c6″,”type”:”BulletedList”,”value”:[{“id”:”e7ff3293-4e54-43c3-85b0-687ce5feb8f0″,”type”:”bulleted-list”,”children”:[{“text”:”Defer skeleton loaders slightly to avoid flicker.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:29}},”8e725d74-5ed5-44b4-a9fd-88e7ac0db6ea”:{“id”:”8e725d74-5ed5-44b4-a9fd-88e7ac0db6ea”,”type”:”BulletedList”,”value”:[{“id”:”0ee9bfab-637b-4068-80c0-5caaf5519707″,”type”:”bulleted-list”,”children”:[{“text”:”Remove production console.log; feature-flag diagnostics.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:30}},”078c88b2-3191-498e-be6b-5ed8e6e846d6″:{“id”:”078c88b2-3191-498e-be6b-5ed8e6e846d6″,”type”:”BulletedList”,”value”:[{“id”:”c00a3edd-198e-4377-98ae-9521470ab6f3″,”type”:”bulleted-list”,”children”:[{“text”:”Clean up third-party widgets on unmount.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:31}},”0302622c-c097-417a-ab32-972b7b2e2ae7″:{“id”:”0302622c-c097-417a-ab32-972b7b2e2ae7″,”type”:”HeadingThree”,”value”:[{“id”:”0f3d1869-f000-4b24-9345-ae8649f02226″,”type”:”heading-three”,”children”:[{“text”:”Styling & Assets”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:32}},”e6baffa9-4b13-461d-89b7-9996a6247690″:{“id”:”e6baffa9-4b13-461d-89b7-9996a6247690″,”type”:”BulletedList”,”value”:[{“id”:”16ab84a2-598d-4485-993a-55ea0ad813cf”,”type”:”bulleted-list”,”children”:[{“text”:”Use Tailwind JIT and safelist classes.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:33}},”9408a099-dcec-47a8-b4d3-360adc7f47a6″:{“id”:”9408a099-dcec-47a8-b4d3-360adc7f47a6″,”type”:”BulletedList”,”value”:[{“id”:”7cb6c156-7031-4c18-a4da-a23df2737286″,”type”:”bulleted-list”,”children”:[{“text”:”Optimise static assets (SVG symbols/sprites).”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:34}},”7e3c4604-595d-459c-91f3-aa811c797fab”:{“id”:”7e3c4604-595d-459c-91f3-aa811c797fab”,”type”:”BulletedList”,”value”:[{“id”:”5e5b38b1-3357-406f-be97-a6dba3cc9ed2″,”type”:”bulleted-list”,”children”:[{“text”:”Enforce lint + prettier + react-perf rules.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:35}},”4c436fd8-4a2e-48b1-b79a-45790848f3fc”:{“id”:”4c436fd8-4a2e-48b1-b79a-45790848f3fc”,”type”:”HeadingTwo”,”value”:[{“id”:”fcfc57e7-a781-4f79-9d31-eebdb77c28c2″,”type”:”heading-two”,”children”:[{“text”:”Build & Delivery Optimisations”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:36}},”5030c864-af87-4474-a031-0edbda85c3d6″:{“id”:”5030c864-af87-4474-a031-0edbda85c3d6″,”type”:”BulletedList”,”value”:[{“id”:”645aba81-3570-4774-a8ea-7e80da1936bf”,”type”:”bulleted-list”,”children”:[{“text”:”Extend vite.config.js with chunk splitting. “}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:37}},”f3279bee-0b2a-4352-acfc-ed5ae75b41fc”:{“id”:”f3279bee-0b2a-4352-acfc-ed5ae75b41fc”,”type”:”BulletedList”,”value”:[{“id”:”5320c3cf-525b-4415-8fa4-20df24a02d45″,”type”:”bulleted-list”,”children”:[{“text”:”Set build.target = \”es2020\” and modulePreload = true. “}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:38}},”b5b96df6-48d9-45d3-b5db-d1d62514c161″:{“id”:”b5b96df6-48d9-45d3-b5db-d1d62514c161″,”type”:”BulletedList”,”value”:[{“id”:”d3b95324-a41c-4b26-adaa-369ab74c8257″,”type”:”bulleted-list”,”children”:[{“text”:”Generate bundle analysis on CI.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:39}},”dbfb7582-552c-4b3d-a0dd-0dd0e47aad61″:{“id”:”dbfb7582-552c-4b3d-a0dd-0dd0e47aad61″,”type”:”BulletedList”,”value”:[{“id”:”8aa4a3b6-04e2-4ca2-8900-c731712ae1a5″,”type”:”bulleted-list”,”children”:[{“text”:”Configure HTTP caching with hashed chunks and versioned JSON.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:40}},”8bf40fcf-2c1a-481b-8fc9-26ecc8267730″:{“id”:”8bf40fcf-2c1a-481b-8fc9-26ecc8267730″,”type”:”HeadingTwo”,”value”:[{“id”:”7a9ffbf8-1877-47b3-9dc7-764186190955″,”type”:”heading-two”,”children”:[{“text”:”Testing, Monitoring & Tooling”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:41}},”a88a51bc-b387-468c-8f45-7e257b4e05b1″:{“id”:”a88a51bc-b387-468c-8f45-7e257b4e05b1″,”type”:”BulletedList”,”value”:[{“id”:”22683a85-ddae-4338-b1ab-dc72cb649b89″,”type”:”bulleted-list”,”children”:[{“text”:”Add React Profiler scripts and Web Vitals.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:42}},”09258a29-7a6e-4d48-a045-c46b4837e47b”:{“id”:”09258a29-7a6e-4d48-a045-c46b4837e47b”,”type”:”BulletedList”,”value”:[{“id”:”df99edd6-bf19-4e09-bda0-ac6ba343c6e1″,”type”:”bulleted-list”,”children”:[{“text”:”Run automated Lighthouse checks in CI.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:43}},”f723bd40-2f55-4789-b729-cac2f4366c53″:{“id”:”f723bd40-2f55-4789-b729-cac2f4366c53″,”type”:”BulletedList”,”value”:[{“id”:”a5f5d21d-a208-4902-99f4-d002b53606e9″,”type”:”bulleted-list”,”children”:[{“text”:”Use Playwright/Cypress smoke tests under throttled profiles.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:44}},”5d7690f5-ed81-4ae9-8bcf-a7c7943aab69″:{“id”:”5d7690f5-ed81-4ae9-8bcf-a7c7943aab69″,”type”:”BulletedList”,”value”:[{“id”:”8a727716-7454-4ece-997a-1d5fde5471f2″,”type”:”bulleted-list”,”children”:[{“text”:”Track Redux action timings in non-production builds.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:45}},”3ba31ad4-8123-45ae-9698-68db99117084″:{“id”:”3ba31ad4-8123-45ae-9698-68db99117084″,”type”:”HeadingTwo”,”value”:[{“id”:”5de2a8a9-995e-4c90-a34b-476944375a33″,”type”:”heading-two”,”children”:[{“text”:”Performance-Focused Code Review Checklist”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:46}},”9b244ed1-98b8-4765-82ad-de66aab02216″:{“id”:”9b244ed1-98b8-4765-82ad-de66aab02216″,”type”:”NumberedList”,”value”:[{“id”:”27de1a0d-8dfd-4630-9bcc-b4a1c5cda936″,”type”:”numbered-list”,”children”:[{“text”:”Are heavy components lazy-loaded and chrome encapsulated in layouts?”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:47}},”37fc8152-3fb2-45b8-a27a-7bbda0ad4cab”:{“id”:”37fc8152-3fb2-45b8-a27a-7bbda0ad4cab”,”type”:”NumberedList”,”value”:[{“id”:”cc3fe07a-0922-44ca-a796-302fcd637e9b”,”type”:”numbered-list”,”children”:[{“text”:”Do hooks list all dependencies and cancel async work properly?”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:48}},”f7d1e7d4-c65e-4ce0-a1fb-0da688702e44″:{“id”:”f7d1e7d4-c65e-4ce0-a1fb-0da688702e44″,”type”:”NumberedList”,”value”:[{“id”:”d9f15516-f22d-438d-9c70-37850ebc3002″,”type”:”numbered-list”,”children”:[{“text”:”Are reducers pure and free from storage writes?”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:49}},”a47db084-8dfe-40e4-95b3-5dc56aea3a2c”:{“id”:”a47db084-8dfe-40e4-95b3-5dc56aea3a2c”,”type”:”NumberedList”,”value”:[{“id”:”c43347df-23f1-4d76-ad1e-688f15c70737″,”type”:”numbered-list”,”children”:[{“text”:”Do lists/tables use memoisation or virtualisation?”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:50}},”be565ae6-fba8-415f-95d5-2862b93edb03″:{“id”:”be565ae6-fba8-415f-95d5-2862b93edb03″,”type”:”NumberedList”,”value”:[{“id”:”90cf250d-6cf1-434a-a82a-ec198c662e2d”,”type”:”numbered-list”,”children”:[{“text”:”Does new code respect caching layers?”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:51}},”c0a684c0-7e13-4b60-8385-fa70bdefc9cf”:{“id”:”c0a684c0-7e13-4b60-8385-fa70bdefc9cf”,”type”:”NumberedList”,”value”:[{“id”:”b63a30c1-aa4d-411e-8b98-66e1300f3b20″,”type”:”numbered-list”,”children”:[{“text”:”Are logs and test hooks behind environment guards?”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:52}},”5f44480e-a7fc-4414-9763-09dab93f54db”:{“id”:”5f44480e-a7fc-4414-9763-09dab93f54db”,”type”:”NumberedList”,”value”:[{“id”:”2e92fe70-5f34-4452-a4a0-7bcbf76c86f2″,”type”:”numbered-list”,”children”:[{“text”:”Were profiling and bundle analysis results attached to the PR?”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:53}},”981f5e33-7743-4dcc-a578-69b8e415291d”:{“id”:”981f5e33-7743-4dcc-a578-69b8e415291d”,”type”:”Paragraph”,”value”:[{“id”:”87127a53-55c0-4193-bda7-98bb4c8ecc8a”,”type”:”paragraph”,”children”:[{“text”:”Conclusion:”,”bold”:true},{“text”:”\n”},{“text”:”By consistently applying these standards, the application will remain fast as modules grow, while simplifying future performance reviews.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:54}},”3aacf47e-e0e5-40fe-9887-0f1269a08896″:{“id”:”3aacf47e-e0e5-40fe-9887-0f1269a08896″,”type”:”Paragraph”,”value”:[{“id”:”9cc77984-224d-4973-914c-13119f4177f6″,”type”:”paragraph”,”children”:[{“text”:”src/App.jsx:1–900″,”code”:true,”bold”:true},{“text”:”\n”},{“text”:” The router is assembled inside the “},{“text”:”App”,”code”:true},{“text”:” component with hundreds of eagerly imported feature modules.”},{“text”:”\n”},{“text”:” “},{“text”:”Recommendation:”,”italic”:true},{“text”:” Hoist route definitions into dedicated layout components, use “},{“text”:”React.lazy”,”code”:true},{“text”:”/”},{“text”:”Suspense”,”code”:true},{“text”:” for feature bundles, and keep a single “},{“text”:”createBrowserRouter”,”code”:true},{“text”:” instance outside the render path to avoid full router re-creation on every Redux update.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:2}},”383b4955-3f42-4633-9ae5-7c25847798e9″:{“id”:”383b4955-3f42-4633-9ae5-7c25847798e9″,”type”:”Paragraph”,”value”:[{“id”:”34046b1d-45df-42d3-9c73-cf118ab47863″,”type”:”paragraph”,”children”:[{“text”:”src/components/elements/Navbar.jsx:26–194″,”code”:true,”bold”:true},{“text”:”\n”},{“text”:” Navigation icons and the settings fetch effect are redefined on each render; the effect depends only on the pathname.”},{“text”:”\n”},{“text”:” “},{“text”:”Recommendation:”,”italic”:true},{“text”:” Memoise the icon list, broaden the dependency array to include company data, and cache expensive “},{“text”:”fetchAllSettingsAndAttendance”,”code”:true},{“text”:” calls per company.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:3}},”be7cad4f-608c-4767-90be-d751f6d93968″:{“id”:”be7cad4f-608c-4767-90be-d751f6d93968″,”type”:”Paragraph”,”value”:[{“id”:”f4d5ff15-5725-41a0-ae0b-1ad7a2055153″,”type”:”paragraph”,”children”:[{“text”:”src/features/general/generalSlice.js:4–84″,”code”:true,”bold”:true},{“text”:”\n”},{“text”:” Reducers directly write to “},{“text”:”localStorage”,”code”:true},{“text”:” on every dispatch.”},{“text”:”\n”},{“text”:” “},{“text”:”Recommendation:”,”italic”:true},{“text”:” Move storage side effects into thunks or listeners, batch writes, and keep reducers pure.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:4}},”6ef9a957-8f6f-4738-94c3-224966901dc2″:{“id”:”6ef9a957-8f6f-4738-94c3-224966901dc2″,”type”:”Paragraph”,”value”:[{“id”:”3a8aea36-e1e6-4db1-9720-faef0f4149ba”,”type”:”paragraph”,”children”:[{“text”:”src/features/projects_new/components/ProjectMainPage.jsx:29–400″,”code”:true,”bold”:true},{“text”:”\n”},{“text”:” Columns are rebuilt per render; a “},{“text”:”console.log”,”code”:true},{“text”:” lingers; dropdown fetches run even when cached.”},{“text”:”\n”},{“text”:” “},{“text”:”Recommendation:”,”italic”:true},{“text”:” Memoise column definitions with “},{“text”:”useMemo”,”code”:true},{“text”:”, remove debug logging, guard API calls with cache timestamps, and debounce navigation updates.”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:5}},”5e2c1d06-6250-46c9-b5b7-7ea3ddacb6b6″:{“id”:”5e2c1d06-6250-46c9-b5b7-7ea3ddacb6b6″,”type”:”Paragraph”,”value”:[{“id”:”b54aaa64-b470-478f-a064-697f4886d92e”,”type”:”paragraph”,”children”:[{“text”:”src/services/api.js:12–160″,”code”:true,”bold”:true},{“text”:”\n”},{“text”:” A single global “},{“text”:”AbortController”,”code”:true},{“text”:” and “last request” guard serialise API calls.”},{“text”:”\n”},{“text”:” “},{“text”:”Recommendation:”,”italic”:true},{“text”:” Replace with per-request controllers, expose cancellation to callers, and adopt an idempotent caching layer (RTK Query/TanStack Query).”}],”props”:{“nodeType”:”block”}}],”meta”:{“align”:”left”,”depth”:0,”order”:6}}}
Amdital Code Standards & Performance Optimization Guide
Written by
in
Leave a Reply