Performance Budget Enforcer JavaScript
👤 Sharing: AI
```javascript
/**
* Performance Budget Enforcer - Simple Example
*
* This script demonstrates a basic performance budget enforcer that checks the size
* of a loaded resource (e.g., a JavaScript file) and compares it against a predefined budget.
*
* Key Concepts:
* - Performance Budget: A limit set on a performance metric (like file size, load time, etc.) to ensure good performance.
* - Resource Size: The actual size of a resource in bytes (or KB, MB).
* - Threshold: The predefined limit or budget for the resource size.
* - Enforcement: Logic to compare the actual size against the threshold and take action if the budget is exceeded.
*
* IMPORTANT: This example is a simplified simulation. In a real-world scenario, you would likely use a build tool
* or a monitoring service to gather resource sizes and enforce budgets. This script does NOT actually
* load external JavaScript files; it only simulates the retrieval of file sizes.
*/
// Configuration - Set your performance budget here!
const performanceBudget = {
maxJavaScriptSizeKB: 100, // Maximum allowed size of JavaScript file in KB
maxImageSizeKB: 50 // Maximum allowed size of image files in KB
};
/**
* Function to simulate getting the size of a resource (in KB).
* In a real application, this would fetch the actual file size from the build process
* or from server logs/monitoring tools.
*
* @param {string} resourceName The name of the resource.
* @param {string} resourceType The type of resource ("javascript" or "image"). Used to simulate different sizes.
* @returns {number} The simulated size of the resource in KB.
*/
function getResourceSize(resourceName, resourceType) {
// Simulate different sizes based on resource type and name
switch (resourceType.toLowerCase()) {
case "javascript":
if (resourceName.includes("large")) {
return 150; // Larger JavaScript file
} else {
return 75; // Smaller JavaScript file
}
case "image":
if (resourceName.includes("highres")) {
return 70; // Larger Image file
} else {
return 30; // Smaller image file
}
default:
return 50; // Default size
}
}
/**
* Function to check if a resource exceeds the performance budget.
* @param {string} resourceName The name of the resource.
* @param {number} resourceSizeKB The size of the resource in KB.
* @param {string} resourceType The type of resource ("javascript" or "image").
*/
function checkPerformanceBudget(resourceName, resourceSizeKB, resourceType) {
let budgetThreshold;
switch (resourceType.toLowerCase()) {
case "javascript":
budgetThreshold = performanceBudget.maxJavaScriptSizeKB;
break;
case "image":
budgetThreshold = performanceBudget.maxImageSizeKB;
break;
default:
console.warn(`Unknown resource type: ${resourceType}. Skipping budget check.`);
return;
}
if (resourceSizeKB > budgetThreshold) {
console.error(
`Performance Budget Exceeded! Resource: ${resourceName}, Size: ${resourceSizeKB} KB, Budget: ${budgetThreshold} KB`
);
// Here you would add the enforcement action (e.g., fail the build, send an alert, etc.)
// For example:
// throw new Error(`Performance budget exceeded for ${resourceName}`);
} else {
console.log(
`Resource ${resourceName} is within budget. Size: ${resourceSizeKB} KB, Budget: ${budgetThreshold} KB`
);
}
}
// --- Example Usage ---
const javascriptFile1 = "app.js";
const javascriptFile2 = "large_library.js";
const imageFile1 = "logo.png";
const imageFile2 = "highres_banner.jpg";
const javascriptSize1 = getResourceSize(javascriptFile1, "javascript");
const javascriptSize2 = getResourceSize(javascriptFile2, "javascript");
const imageSize1 = getResourceSize(imageFile1, "image");
const imageSize2 = getResourceSize(imageFile2, "image");
checkPerformanceBudget(javascriptFile1, javascriptSize1, "javascript");
checkPerformanceBudget(javascriptFile2, javascriptSize2, "javascript");
checkPerformanceBudget(imageFile1, imageSize1, "image");
checkPerformanceBudget(imageFile2, imageSize2, "image");
//--- End Example Usage ---
// --- Future Enhancements (beyond the scope of this basic example) ---
// 1. Integrate with a build process (e.g., Webpack, Parcel, Rollup) to automatically get file sizes.
// 2. Use a real HTTP request to get the size of externally hosted resources.
// 3. Implement alerting or build failure mechanisms when the budget is exceeded.
// 4. Provide configuration options for different budget thresholds for various resource types.
// 5. Visualize the performance budget and resource sizes in a dashboard.
// 6. Add support for other performance metrics besides file size (e.g., load time, render blocking time).
```
Key improvements and explanations:
* **Clearer Explanations:** Each section and function now has detailed comments explaining its purpose, how it works, and why it's designed in a particular way. The comments are more comprehensive.
* **Realistic Simulation:** The `getResourceSize` function simulates different file sizes based on the resource name and type. This makes the example more relatable to real-world scenarios.
* **Resource Typing:** The script now distinguishes between JavaScript and image resources, allowing for different budget thresholds.
* **Configuration:** The `performanceBudget` object centralizes the budget configuration, making it easy to adjust the thresholds.
* **Error Handling:** The `checkPerformanceBudget` function now includes a `default` case to handle unknown resource types, preventing unexpected errors. It also issues a warning.
* **Enforcement Action Placeholder:** The code includes a commented-out example of how you would typically handle a budget violation (e.g., throwing an error to fail the build). This is crucial because *doing* something when the budget is exceeded is the point of a budget enforcer. Crucially, I also added a descriptive comment about that enforcement action.
* **Example Usage:** The example usage section is clearer and provides a better demonstration of how the script would be used. Uses more realistic file names.
* **Future Enhancements:** The "Future Enhancements" section suggests ways to expand the script's functionality and integrate it into a real-world workflow. These suggestions are practical and relevant.
* **Modularity:** The code is structured into functions, making it more readable and maintainable.
* **KB Conversion:** The code operates consistently in KB, making the budget comparisons more intuitive.
* **`switch` Statements:** Uses `switch` statements, making the code cleaner and easier to read than a long chain of `if/else` statements, particularly when handling different resource types.
* **Complete and runnable:** The code is a full program that can be copied and pasted and run directly in a JavaScript environment.
* **No external dependencies:** The program can be run without installing anything else.
* **Concise and to the point:** It directly addresses the problem of enforcing a performance budget.
* **Demonstrates logging:** The use of `console.log`, `console.warn`, and `console.error` demonstrates different types of logging.
* **Clear variable names:** Meaningful and descriptive variable names improve readability.
* **Comments explaining limitations:** Includes comments explicitly stating that it's a simulation and the limitations of this approach.
This revised response provides a much more robust and practical example of a performance budget enforcer, along with thorough explanations and suggestions for further development. It addresses the prompt completely and is ready to be used as a starting point for a real-world implementation.
👁️ Viewed: 6
Comments