diff --git a/src/librustdoc/html/render/write_shared.rs b/src/librustdoc/html/render/write_shared.rs
index c4a6e92003184..017cc07faeafd 100644
--- a/src/librustdoc/html/render/write_shared.rs
+++ b/src/librustdoc/html/render/write_shared.rs
@@ -328,8 +328,8 @@ pub(super) fn write_shared(
v.push_str(
r#"\
]'));
-if (typeof window !== 'undefined' && window.initSearch) {window.initSearch(searchIndex)};
-if (typeof exports !== 'undefined') {exports.searchIndex = searchIndex};
+if (typeof exports !== 'undefined') exports.searchIndex = searchIndex;
+else runSearchIfFullyLoaded();
"#,
);
Ok(v.into_bytes())
diff --git a/src/librustdoc/html/static/js/main.js b/src/librustdoc/html/static/js/main.js
index 63ab56053af9f..b35fc38591c0f 100644
--- a/src/librustdoc/html/static/js/main.js
+++ b/src/librustdoc/html/static/js/main.js
@@ -188,6 +188,7 @@ function preLoadCss(cssUrl) {
function loadScript(url) {
const script = document.createElement("script");
script.src = url;
+ script.setAttribute('async', '');
document.head.append(script);
}
diff --git a/src/librustdoc/html/static/js/search.js b/src/librustdoc/html/static/js/search.js
index ccb54e14a5cb2..1c8944545c587 100644
--- a/src/librustdoc/html/static/js/search.js
+++ b/src/librustdoc/html/static/js/search.js
@@ -3354,9 +3354,7 @@ ${item.displayPath}${name}\
if (typeof window !== "undefined") {
window.initSearch = initSearch;
- if (window.searchIndex !== undefined) {
- initSearch(window.searchIndex);
- }
+ runSearchIfFullyLoaded();
} else {
// Running in Node, not a browser. Run initSearch just to produce the
// exports.
diff --git a/src/librustdoc/html/static/js/storage.js b/src/librustdoc/html/static/js/storage.js
index ac9c6f377b82a..29d190903d7ff 100644
--- a/src/librustdoc/html/static/js/storage.js
+++ b/src/librustdoc/html/static/js/storage.js
@@ -61,6 +61,15 @@ function onEach(arr, func) {
return false;
}
+let nbSearchScriptLoaded = 0;
+// eslint-disable-next-line no-unused-vars
+function runSearchIfFullyLoaded() {
+ nbSearchScriptLoaded += 1;
+ if (nbSearchScriptLoaded === 2) {
+ window.initSearch(window.searchIndex);
+ }
+}
+
/**
* Turn an HTMLCollection or a NodeList into an Array, then run a callback
* for every element. This is useful because iterating over an HTMLCollection