入门

教程:加载 js-confetti

了解如何使用 Nuxt Scripts 模块加载 js-confetti 脚本。

介绍

在本教程中,您将学习如何使用 Nuxt Scripts 模块加载 js-confetti 脚本。

您将了解以下内容

  • useScriptNpm 注册表脚本是什么。
  • 如何使用它加载 js-confetti 脚本。
  • 向加载的脚本添加类型。
  • 使用 代理函数 来调用脚本。

useScriptNpm 背景

要加载脚本,我们将使用 useScriptNpm

这是一个 注册表脚本,一个基于 useScript 可组合组件构建的受支持的第三方集成,它允许您从 NPM 加载脚本。

在使用 NPM 文件时,通常会将它们作为 package.json 文件中的节点模块依赖项包含进来。但是,优化这些脚本的脚本加载可能很困难,需要从单独的块动态导入模块,并在需要时才加载。它还会减慢您的构建速度,因为模块需要被转译。

useScriptNpm 注册表脚本抽象了这个过程,允许您加载已导出为立即调用函数的脚本,只需一行代码即可。

在许多情况下,将脚本作为 package.json 文件中的依赖项包含进来仍然更有意义,但对于不太常用或对应用程序不至关重要的脚本,这可能是一个很好的替代方案。

首先,我们可以将使用此脚本视为 useHead 可组合组件的替代方案。您可以在以下代码示例中看到抽象层示例。

useScriptNpm({
  packageName: 'js-confetti',
  file: 'dist/js-confetti.browser.js',
  version: '0.12.0',
})

加载脚本

在您的其中一个组件中,您需要加载脚本。您可以通过使用 useScriptNpm 注册表脚本来完成此操作。

app.vue
<script setup lang="ts">
useScriptNpm({
  packageName: 'js-confetti',
  file: 'dist/js-confetti.browser.js',
  version: '0.12.0',
})
</script>

如果您检查浏览器的请求,您应该会看到脚本正在加载。

解析第三方脚本 API

现在脚本已加载,您可以在组件中使用它。为此,我们需要告诉底层 API 如何使用脚本,为此,我们可以利用 use 函数。

此函数仅在客户端调用,用于解析第三方脚本。

app.vue
<script setup lang="ts">
useScriptNpm({
  packageName: 'js-confetti',
  file: 'dist/js-confetti.browser.js',
  version: '0.12.0',
  scriptOptions: {
    // tell useScript how to resolve the third-party script
    use() {
      return { JSConfetti: window.JSConfetti }
    },
  },
})
</script>

使用第三方脚本 API

现在我们有了解析第三方脚本 API 的方法,我们可以开始使用它了。

js-confetti 库要求我们每次使用时都实例化一个新的 JSConfetti 类,处理此问题的最兼容方法是显式等待脚本加载。

但是,如果我们更喜欢使用更易于使用的 API,我们也可以使用 代理函数。请注意,这将在页面之间切换时中断,因为 new window.JSConfetti() 需要在页面之间调用。

<script setup lang="ts">
const { onLoaded } = useScriptNpm({
  packageName: 'js-confetti',
  file: 'dist/js-confetti.browser.js',
  version: '0.12.0',
  scriptOptions: {
    use() {
      return { JSConfetti: window.JSConfetti }
    },
  },
})
onLoaded(({ JSConfetti }) => {
  // using the real API instance
  const confetti = new JSConfetti()
  confetti.addConfetti({ emojis: ['🌈', '⚡️', '💥', '', '💫', '🌸'] })
})
</script>

恭喜!脚本加载完成后,您应该会看到一些表情符号。

但是,您会注意到这里存在一个类型问题。 addConfetti 函数没有类型,因此我们不会获得任何智能感知或类型检查。

添加类型

您可以使用 useScriptNpm 可组合组件中的泛型来向脚本添加类型,并向窗口对象添加全局类型。

app.vue
<script setup lang="ts">
export interface JSConfettiApi {
  JSConfetti: { 
    new (): {
      addConfetti: (options?: { emojis: string[] }) => void
    } 
  }
}

declare global {
  interface Window extends JSConfettiApi {}
}

const { onLoaded } = useScriptNpm<JSConfettiApi>({
  packageName: 'js-confetti',
  file: 'dist/js-confetti.browser.js',
  version: '0.12.0',
  scriptOptions: {
    use() {
      return { JSConfetti: window.JSConfetti }
    },
  },
})
onMounted(() => {
  onLoaded(({ JSConfetti }) => {
    const confetti = new JSConfetti()
    // fully typed!
    confetti.addConfetti({ emojis: ['🌈', '⚡️', '💥', '', '💫', '🌸'] })
  })
})
</script>

奖励:基于事件的脚本加载

您可以使用 trigger 选项延迟脚本加载。如果您想在某个事件或时间之后加载脚本,这可能很有用。

在此示例中,我们将结合使用 useScriptTriggerElement 可组合组件和 useScriptNpm 可组合组件,以在某个元素可见后加载脚本。

app.vue
<script setup lang="ts">
const mouseOverEl = ref<HTMLElement>()
const { onLoaded } = useScriptNpm({
  // ..
  scriptOptions: {
    trigger: useScriptTriggerElement({ trigger: 'mouseover', el: mouseOverEl })
  }
})
// ..
onMounted(() => {
  onLoaded(({ JSConfetti }) => {
    const confetti = new JSConfetti()
    confetti.addConfetti({ emojis: ['L', 'O', 'A', 'D', 'E', 'D'] })
  })
})
</script>

<template>
  <div ref="mouseOverEl">
    <h1>Hover over me to load the confetti</h1>
  </div>
</template>

奖励:捆绑脚本

由于脚本来自 NPM 并已版本化,我们可以安全地将其与我们的应用程序捆绑在一起。这将减少所需的 DNS 请求次数,从而提高应用程序的性能。

要捆绑脚本,您可以使用 bundle 选项。

app.vue
<script setup lang="ts">
const script = useScriptNpm({
  // ...
  scriptOptions: {
    bundle: true
  }
})
// ..
</script>

您应该会看到脚本从您的应用程序服务器加载。

结论

在本教程中,您学习了如何使用 useScriptNpm 注册表脚本加载 js-confetti 脚本。

要详细了解您探索的特定概念,请查看 关键概念 的文档。