useScript

useScript 函数的 API 文档。
试用 StackBlitz 上的 自定义脚本示例

此组合函数是对 Unhead useScript 的封装,添加了 Nuxt 特有的增强功能,有关完整文档请参考此处。

函数签名

export function useScript<T extends Record<string | symbol, any>>(input: UseScriptInput, options?: NuxtUseScriptOptions): T & { $script: Promise<T> & VueScriptInstance<T> } {}

参数

UseScriptInput

这是脚本标签的输入。例如,可以传入一个 URL 字符串,或包含脚本标签属性的对象。

export type UseScriptInput = string | {
  src?: string
  async?: boolean
  defer?: boolean
  type?: string
  integrity?: string
  crossorigin?: string
  text?: string
  innerHTML?: string
  innerText?: string
  content?: string
  referrerPolicy?: string
  attributes?: Record<string, string>
}

更多参数信息请参阅 脚本输入 文档。

NuxtUseScriptOptions

更多参数信息请参阅 脚本选项 文档。

export type NuxtUseScriptOptions<T = any> = Omit<UseScriptOptions<T>, 'trigger'> & {
  /**
   * 加载脚本的触发时机:
   * - `onNuxtReady` - 当 Nuxt 准备就绪时加载脚本。
   * - `manual` - 通过调用 `load()` 手动加载脚本。
   * - `Promise` - 当 Promise 解析完成时加载脚本。
   */
  trigger?: UseScriptOptions<T>['trigger'] | 'onNuxtReady'
  /**
   * 是否将脚本打包为资源并从服务器加载。这有利于提升性能,减少额外的 DNS 查询和请求数,
   * 同时提升隐私保护,避免将用户 IP 地址泄露给第三方服务器。
   * - `true` - 将脚本打包为资源。
   * - `false` - 不打包脚本。(默认)
   */
  bundle?: boolean
  /**
   * [实验性] 使用 Partytown 在 web worker 中加载脚本。
   * 启用后,会为脚本标签添加 `type="text/partytown"`。
   * 需要另外安装和配置 @nuxtjs/partytown。
   * 注意:需要访问 DOM 的脚本(如 GTM、Hotjar、聊天小部件)不兼容。
   * @see https://partytown.qwik.dev/
   */
  partytown?: boolean
  /**
   * 跳过对脚本输入的任何模式校验。这对于开发时加载脚本存根不加载实际脚本且避免警告非常有用。
   */
  skipValidation?: boolean
}

返回值

更多返回值信息请参阅 理解代理函数$script 文档。

返回对象包含:

  • status - 响应式 ref,代表脚本状态: 'awaitingLoad' | 'loading' | 'loaded' | 'error'
  • load() - 手动加载脚本的函数
  • remove() - 从 DOM 中移除脚本的函数
  • reload() - 移除并重新加载脚本的函数(详见下文)

reload()

移除脚本并重新加载,强制重新执行。适用于某些第三方脚本仅在首次加载时扫描 DOM 的场景,需在 SPA 导航后重新运行。

const { reload } = useScript('https://example.com/dom-scanner.js')

// 导航时重新加载
watch(() => route.path, () => reload())
许多第三方脚本自带 SPA 支持(例如 iubenda 的 _iub.cs.api.activateSnippets())。使用 reload() 前请先查看脚本文档——它们自带的方法通常更高效。