Optimizing TypeScript Applications for Mobile Performance
Discover techniques to enhance the performance of TypeScript applications on mobile devices.
0 likes
188 views
Rule Content
{
"title": "Optimizing TypeScript Applications for Mobile Performance",
"description": "Implement strategies to enhance the performance of TypeScript applications on mobile devices.",
"category": "TypeScript Cursor Rules",
"rules": [
{
"id": "ts-mobile-performance-001",
"name": "Minimize JavaScript Bundle Size",
"description": "Reduce the initial load time by minimizing the JavaScript bundle size through code splitting and tree shaking.",
"recommendation": [
"Implement code splitting to load only essential code upfront and fetch additional code on demand.",
"Utilize tree shaking to eliminate unused code from the JavaScript bundle."
],
"examples": [
{
"bad": "import * as utils from './utils';",
"good": "import { specificFunction } from './utils';"
}
]
},
{
"id": "ts-mobile-performance-002",
"name": "Implement Lazy Loading for Non-Critical JavaScript",
"description": "Defer the loading of non-essential JavaScript until it is needed to improve initial load times.",
"recommendation": [
"Use dynamic imports to load modules only when required.",
"Avoid loading heavy features during the initial page load."
],
"examples": [
{
"bad": "import { heavyFeature } from './heavyFeature';",
"good": "const loadHeavyFeature = async () => { const module = await import('./heavyFeature'); module.init(); };"
}
]
},
{
"id": "ts-mobile-performance-003",
"name": "Optimize Loops and Iterations",
"description": "Enhance performance by optimizing loops and iterations in the code.",
"recommendation": [
"Cache array length in loops to avoid recalculating it during each iteration.",
"Use built-in array methods like map, filter, and reduce for better performance."
],
"examples": [
{
"bad": "for (let i = 0; i < array.length; i++) { console.log(array[i]); }",
"good": "const len = array.length; for (let i = 0; i < len; i++) { console.log(array[i]); }"
}
]
},
{
"id": "ts-mobile-performance-004",
"name": "Use Async/Await Wisely",
"description": "Optimize asynchronous code to prevent blocking the event loop and improve performance.",
"recommendation": [
"Avoid using await inside loops; instead, use Promise.all to run multiple promises concurrently.",
"Ensure that asynchronous operations do not block the main thread."
],
"examples": [
{
"bad": "for (const url of urls) { const response = await fetch(url); process(response); }",
"good": "const responses = await Promise.all(urls.map(url => fetch(url))); responses.forEach(response => process(response));"
}
]
},
{
"id": "ts-mobile-performance-005",
"name": "Avoid Unnecessary Type Assertions",
"description": "Minimize the use of type assertions to maintain type safety and performance.",
"recommendation": [
"Let TypeScript infer types automatically whenever possible.",
"Use type assertions sparingly and only when necessary."
],
"examples": [
{
"bad": "const value = someValue as string;",
"good": "const value: string = someValue;"
}
]
},
{
"id": "ts-mobile-performance-006",
"name": "Use Interfaces Instead of Classes",
"description": "Prefer interfaces over classes for type definitions to improve performance.",
"recommendation": [
"Use interfaces to define object shapes and avoid unnecessary class instantiation.",
"Reserve classes for scenarios requiring instantiation and inheritance."
],
"examples": [
{
"bad": "class Person { name: string; age: number; constructor(name: string, age: number) { this.name = name; this.age = age; } }",
"good": "interface Person { name: string; age: number; }"
}
]
},
{
"id": "ts-mobile-performance-007",
"name": "Optimize Imports",
"description": "Reduce bundle size by importing only necessary modules.",
"recommendation": [
"Avoid importing entire modules; instead, import only the specific functions or variables needed.",
"Regularly audit and remove unused imports to keep the codebase clean."
],
"examples": [
{
"bad": "import * as utils from './utils';",
"good": "import { specificFunction } from './utils';"
}
]
},
{
"id": "ts-mobile-performance-008",
"name": "Use Constants for Immutable Data",
"description": "Declare variables with const when their values should not change to enable compiler optimizations.",
"recommendation": [
"Use const for variables that are not reassigned after their initial assignment.",
"Reserve let for variables that will be reassigned."
],
"examples": [
{
"bad": "let someValue = 10;",
"good": "const someValue = 10;"
}
]
},
{
"id": "ts-mobile-performance-009",
"name": "Avoid Deeply Nested Types",
"description": "Simplify type definitions to improve readability and performance.",
"recommendation": [
"Keep type definitions as flat as possible.",
"Break down complex structures into smaller, more manageable types."
],
"examples": [
{
"bad": "type DeeplyNestedType = { a: { b: { c: string; } } }",
"good": "type FlatType = { a: string; b: string; c: string; }"
}
]
},
{
"id": "ts-mobile-performance-010",
"name": "Use Memoization",
"description": "Cache the results of expensive function calls to improve performance.",
"recommendation": [
"Implement memoization for functions that perform costly computations.",
"Use existing libraries or write custom memoization functions as needed."
],
"examples": [
{
"bad": "function expensiveFunction(num: number) { // Perform expensive calculation return num * 2; }",
"good": "const memoize = (fn: Function) => { const cache: { [key: string]: any } = {}; return (...args: any[]) => { const key = JSON.stringify(args); if (cache[key]) { return cache[key]; } const result = fn(...args); cache[key] = result; return result; }; }; const memoizedFunction = memoize(expensiveFunction);"
}
]
}
]
}