Loading main.js with defer
What is the script “defer” attribute?
Source: https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/script.
The defer boolean attribute tells a browser that the script is meant to be executed after the
document has been parsed, but before firing the DOMContentLoaded event.
Adding the defer attribute to the JS HTML template
Note: it might be possible to accomplish the same thing with the templates.Defer directive. See
the end of Using Tailwindcss in a Hugo theme.
I’ve added defer to the script that that’s added by the Hugo js.html template. This is the
template that’s generated when a Hugo theme is created with hugo theme new.
{{- with resources.Get "js/main.js" }} {{- $opts := dict "minify" (not
hugo.IsDevelopment) "sourceMap" (cond hugo.IsDevelopment "external" "")
"targetPath" "js/main.js" }} {{- with . | js.Build $opts }} {{- if
hugo.IsDevelopment }}
<script src="{{ .RelPermalink }}" defer></script>
{{- else }} {{- with . | fingerprint }}
<script
src="{{ .RelPermalink }}"
integrity="{{ .Data.Integrity }}"
crossorigin="anonymous"
defer
></script>
{{- end }} {{- end }} {{- end }} {{- end }}
Simplifying main.js to account for deferred loading
Since defer prevents the script from being executed until the document has been parsed, and is
executed before the DOMContentLoaded event, I think I can remove the call to
document.addEventListener("DOMContentLoaded") call from the script.
Instead of:
document.addEventListener("DOMContentLoaded", function () {
const searchInput = document.getElementById("semantic-search");
// ...
}
It can be simplified to:
const searchInput = document.getElementById("semantic-search");
if (searchinput) {
// ...
}
A minor change, but one less level of nesting works for me.