Understanding Async vs. Defer Script Loading in JavaScript
Tags: webdev, javascript, programming, node
Published: 2023-12-04 08:53:01

##Script Loading Basics

Before we dive into the details of async and defer, let's revisit how scripts are traditionally loaded in HTML.

```<script src="script.js"></script>```

This simple script tag includes an external JavaScript file, script.js, in an HTML document. When the browser encounters this tag, it blocks the parsing of the HTML document and immediately fetches and executes script.js. This blocking behavior can affect page load times and user experience, especially for large scripts or slow connections.

## The Async Attribute

The async attribute is used to tell the browser that the script can be loaded asynchronously. This means that the browser will continue parsing the HTML document while simultaneously fetching and executing the script. Here's an example:

`<script src="script.js" async></script>`

When the browser encounters this async script tag, it will not block the HTML parsing. Instead, it will fetch script.js in the background and execute it as soon as it's downloaded. This is particularly useful for scripts that don't depend on the page's structure and can run independently.

## The Defer Attribute

The defer attribute, on the other hand, also allows for asynchronous script loading but with a significant difference. Scripts with the defer attribute are executed in the order they appear in the HTML document, just before the DOMContentLoaded event is fired.

`<script src="script.js" defer></script>`

When a script is deferred, it will be fetched asynchronously, but the browser will ensure that the scripts are executed in the order they appear in the HTML document. This is valuable when your scripts rely on specific elements or the page's structure because it guarantees that the necessary HTML is parsed before the script runs.


## When to Use async and defer
Choosing between async and defer depends on your script's requirements:

- Use async when your script doesn't rely on the page's structure and can run independently. This can lead to faster page load times since it doesn't block HTML parsing.
- Use defer when your script needs to manipulate or interact with the page's elements and structure. This ensures that the script runs after the HTML is parsed, reducing the likelihood of errors.

## Best Practices
Here are some best practices to consider when working with async and defer:

- Always include the src attribute: Both async and defer require the src attribute to specify the script file to load.
- Minimize script size: Regardless of loading attribute choice, aim to keep your scripts small and optimized for performance.
- Place scripts at the end: It's often a good practice to include your scripts just before the closing `</body>` tag to avoid any potential rendering issues.
- Test thoroughly: Ensure your scripts behave as expected when using async or defer by testing in various browsers and network conditions.

## Conclusion

Understanding how to load scripts asynchronously using async and defer attributes are essential for improving web page performance and user experience. Choose the loading attribute that best suits your script's requirements, and always test your code thoroughly to ensure it behaves as expected.

Incorporating these techniques into your web development projects will help you create faster and more responsive websites, ultimately enhancing the user experience.

Happy coding!

## Normal script vs async vs defer


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vd09d3p9iuigqw3ns8oo.png)