如何在Nuxt应用程序中加载外部脚本

发布于3/6/2020 来自:「前端知否」微信公众号

最近,我不得不将第三方代码段加载到我的Nuxt应用程序中。该代码段如下所示:

<link rel="stylesheet" href="https://some-website.com/stuff.css">

<div class="some-class">
<div>Some content...</div>
</div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>
<script src="https://some-other-website.com/stuff.js"></script>

我需要加载一个样式表和几个脚本。我将分享我如何使用Nuxt完成此操作以及实现此操作的不同方法。

使用vue-meta

您可以使用vue-meta的head()方法插入脚本。幸运的是,Nuxt已预装了vue-meta

这会将脚本和样式都插入页面的头部。

// nuxt.config.js OR pages/some/page.vue

export default {
head() {
return {
script: [
{
src: "https://some-website.com/stuff.js"
}
],

link: [
{
rel: "stylesheet",
href:
"https://some-site.com/stuff.css"
}
]
}
}
}

您可以在nuxt.config.js上直接执行此操作,也可以直接在Nuxt页面上执行(如果在nuxt.config.js内执行此操作,则更改将应用​​于所有页面)。

上面的代码会将脚本添加到head元素。

Vue-meta:将脚本加载到body中

如果您希望将脚本添加到body中,只需添加body: true即可。 👍

script: [
{
src: "https://some-website.com/stuff.js",
body: true
}
]

Vue-meta:延迟+异步

Vue-meta允许您添加延迟 或 异步加载的脚本。如果要使用async和defer加载它,则可以添加async: true 和 defer: true:

script: [
{
src: "https://some-website.com/stuff.js",
body: true,
async: true,
defer: true
}
]

这等效于<script type="text/javascript" src="https://some-website.com/stuff.js" async defer> </script>

非vue-meta的替代方案

如果您想要vue-meta的更多“手动”替代方法,则可以使用Vue的安装生命周期通过DOM vanilla JS方式插入它:

// pages/some/page.vue

export default {
mounted() {
const script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://some-website.com/stuff.js";
document.body.appendChild(script);
}
}

这个技巧可以做到:

  • 等待DOM加载完
  • 创建脚本元素
  • 添加到body标签内

最后

有时,您必须在不使用npm的情况下加载第三方库。幸运的是,Nuxt提供了一种使用vue-meta的简便方法。另外,还可以使用Vue的mounted生命周期方法修改DOM以便自己插入。后者适用于vanilla (原生)Javascript。

谢谢阅读。编码愉快!