Join GitHub today
GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.
Sign upExternal script doesn't always load when added to Nuxt page via "head()" #5052
Comments
This comment has been minimized.
This comment has been minimized.
Thanks for your contribution to Nuxt.js!
Issues that are labeled as |
This comment has been minimized.
This comment has been minimized.
I also faced this issue trying to load the Stripe API (v3) in a page, often it'll say Stripe library isn't loaded. |
This comment has been minimized.
This comment has been minimized.
Apologies for not replying in time to prevent the bot from closing this issue. I just updated my test repo to Nuxt 2.6.1 and I'm still experiencing the problems described above. |
This comment has been minimized.
This comment has been minimized.
I'm having similar issue when trying to load Youtube API on one particular page. I've also tried using npm vue-script2 to have more control over external scripts loading. on mounted() of the page
getting the below error It could technically be solved if I load the script across all pages. However, I don't want user to download unnecessarily. |
This comment has been minimized.
This comment has been minimized.
Does anyone have a solution to this problem? |
This comment has been minimized.
This comment has been minimized.
Thanks for your contribution to Nuxt.js!
Issues that are labeled as |
This comment has been minimized.
This comment has been minimized.
I have the same problem with Stripe and Google maps :p, anyone have a solution to this problem ? Nuxt version: 2.6.2 Example to reproduce:
|
This comment has been minimized.
This comment has been minimized.
@DidelotK All versions are affected, AFAIK. |
This comment has been minimized.
This comment has been minimized.
@markplewis and others: It all works as expected and has to do with how html/JS works, not Nuxt. In In Basically you have to understand the difference between script added programatically (through DOM) and script that is in HTML of the page already. Former will load asynchronously while latter will load synchronously. So to make this work consistently, rather than using |
This comment has been minimized.
This comment has been minimized.
Thanks @rchl. This is the simplest example that I could come up with and it seems to be working: export default {
mounted() {
if (!process.server && !window.jQuery) {
const script = document.createElement("script");
script.onload = this.onScriptLoaded;
script.type = "text/javascript";
script.src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.slim.min.js";
document.head.appendChild(script);
} else {
this.onScriptLoaded();
}
},
methods: {
onScriptLoaded(event = null) {
if (event) {
console.log("Was added");
} else {
console.log("Already existed");
}
console.log(window.jQuery);
window.jQuery("h1").append(` <span>(CDN script has loaded)</span>`);
}
}
} |
This comment has been minimized.
This comment has been minimized.
Looks good to me. Something like BTW. |
Version
v2.4.3
Reproduction link
https://github.com/markplewis/nuxt-external-resource-loading-issue
Steps to reproduce
Clone my demo repo and then do the following:
Case 1
npm run dev
and open it up in your browser.Case 2
npm run dev
and open it up in your browser.<h1>
element.<h1>
.<h1>
.<h1>
element.<h1>
.What is expected ?
I'm trying to load an external script into a Nuxt page via the page's
head
:I expect the script to load and be available every time the page loads, regardless of whether it was served directly from the server or rendered on the client-side.
What is actually happening?
Unfortunately, the external script doesn't seem to load when the page is server-rendered - it only seems to work when the page is client-rendered. I discovered the following issues, but neither of them have helped me solve this problem:
In that first issue, manniL said the following:
What does "you can't ensure the readiness easily" mean? I'd prefer not to move this script into my layout because it will only be needed for one particular page, and I don't want to force users to download unnecessary resources.
I can avoid errors (see test case 1, above) by wrapping my calls to
window.jQuery
, like this:But this leaves me with the problem that I described in test case 2 (see above).