--- title: "注册表脚本" description: "了解如何使用注册表脚本来简化 Nuxt Scripts 中第三方脚本的集成。" canonical_url: "https://nuxt-scripts.zhcndoc.com/docs/guides/registry-scripts" last_updated: "2026-05-22T14:11:54.357Z" --- ## 特性 ### 😌 安全初始化 许多第三方脚本需要在加载脚本前初始化一些全局状态,Nuxt 脚本会以优化的方式帮你处理这一过程。 ### 🏎️ 细粒度性能调优 每个注册表脚本都经过优化,以尽可能高效的方式加载脚本功能。 ### 📜 完全类型化 处理第三方脚本通常需要自行处理它们的 API 类型。注册表脚本通过提供预定义类型来缓解这一问题,使你的项目能够享受代码补全和类型安全。 ### ✅ 选项验证 使用 [Valibot](https://github.com/fabian-hiller/valibot),注册表脚本自动验证第三方脚本的配置选项,帮助你及早发现并解决配置错误。例如,它们会检查 Cloudflare Web Analytics 的令牌长度。 ```ts [Schema] export const CloudflareWebAnalyticsOptions = object({ /** * Cloudflare Web Analytics 的令牌。 */ token: pipe(string(), minLength(32)), /** * Cloudflare Web Analytics 通过重写 History API 的 pushState 函数和监听 onpopstate 自动测量 SPA。 * 不支持基于哈希的路由器。 * * @default true */ spa: optional(boolean()), }) ``` ```ts [示例] useScriptCloudflareWebAnalytics({ token: '123', // 会抛出错误,字符串长度不是 32 }) ``` 出于性能考虑,验证仅在开发时进行。在生产构建中会被摇树优化移除。 ### 🤫 运行时配置集成 注册表脚本可以通过 `.env` 文件配置,允许你不在代码中硬编码脚本选项。 ```text [.env] NUXT_PUBLIC_SCRIPTS_CLOUDFLARE_WEB_ANALYTICS_TOKEN=YOUR_TOKEN ``` ```ts [nuxt.config.ts] export default defineNuxtConfig({ scripts: { registry: { cloudflareWebAnalytics: { trigger: 'onNuxtReady' }, }, }, runtimeConfig: { public: { scripts: { cloudflareWebAnalytics: { // 提供空字符串以使 .env 生效 token: '', // NUXT_PUBLIC_SCRIPTS_CLOUDFLARE_WEB_ANALYTICS_TOKEN }, }, }, }, }) ``` ## 使用 ### 在开发环境中禁用 当你想在开发环境中使用暴露的 API 脚本(例如组件内调用 `gtag`)时,你希望加载一个模拟版本,这样脚本就永远不会真正加载。 你可以通过给注册表脚本提供一个 `mock` 值来实现。 ```ts [nuxt.config.ts] export default defineNuxtConfig({ scripts: { registry: { googleTagManager: { trigger: 'onNuxtReady' }, }, }, $development: { scripts: { registry: { googleTagManager: 'mock', }, }, }, }) ``` ### 加载多个相同脚本 你可能有需要使用不同配置加载同一个注册表脚本多次的情况。 默认情况下,它们会去重且只加载一次。要加载同一个脚本的多个实例,可以给脚本提供唯一的 `key`。 ```ts const { proxy: gaOne } = useScriptGoogleAnalytics({ id: 'G-TR58L0EF8P', }) const { proxy: gaTwo } = useScriptGoogleAnalytics({ // 不设置 key 会返回第一个脚本实例 key: 'gtag2', id: 'G-1234567890', }) ``` 需要注意的是,当修改 key 时,你使用的环境变量会失效。 例如,将 key 设置为 `gtag2`,你需要按如下方式提供运行时配置: ```ts export default defineNuxtConfig({ runtimeConfig: { public: { scripts: { gtag2: { id: '', // NUXT_PUBLIC_SCRIPTS_GTAG2_ID }, }, }, }, }) ``` ### 使用脚本选项和脚本输入 注册表脚本不会阻止你使用核心的 `useScript` 功能,你可以通过额外的选项启用高级功能。 - `scriptOptions` — 传递给脚本的附加选项。详见 [useScript 选项](/docs/api/use-script#scriptoptions)。 - `scriptInput` — 传递给脚本的附加输入。详见 [useScript 输入](/docs/api/use-script#scriptinput)。 ```ts import { useTimeout } from '@vueuse/core' import { useScriptCloudflareWebAnalytics } from '#imports' const { ready } = useTimeout(5000) useScriptCloudflareWebAnalytics({ token: '123', // 传递给 script 元素的 HTML 属性 scriptInput: { 'data-cf-test': 'true' }, // 用于高级功能的 useScript 选项 scriptOptions: { trigger: ready, bundle: true, }, }) ``` ### 加载最佳实践 当在多个页面或组件中使用注册表脚本时,建议你在 `app.vue` 或 `nuxt.config` 中初始化脚本并传入所需配置。 后续对注册表脚本的调用会使用同一个脚本实例,不需要再次传入选项。 ```ts [nuxt.config.ts] export default defineNuxtConfig({ scripts: { registry: { // 加载脚本 fathomAnalytics: { site: 'SITE_ID', } } } }) ``` ```vue [components/any-component.vue] ``` 或者,你可以将注册表脚本封装成一个组合式函数,以便更方便地实例化脚本。 ```ts export function useFathomAnalytics() { return useScriptFathomAnalytics({ site: 'SITE_ID', }) } ``` ## 扩展脚本注册表 你可以在 `nuxt.config.ts` 中使用 `scripts:registry` 钩子扩展脚本注册表: ```ts [nuxt.config.ts] import { createResolver } from '@nuxt/kit' const { resolve } = createResolver(import.meta.url) export default defineNuxtConfig({ modules: ['@nuxt/scripts'], hooks: { 'scripts:registry': function (registry) { registry.push({ category: 'custom', label: '我的自定义分析', logo: '...', // 可选 import: { name: 'useScriptMyAnalytics', from: resolve('./composables/useScriptMyAnalytics'), }, }) }, }, devtools: { enabled: true, }, }) ``` 然后创建你的自定义脚本 composable: ```ts [composables/useScriptMyAnalytics.ts] import { object, string } from 'valibot' import { useRegistryScript } from '#nuxt-scripts/utils' export interface MyAnalyticsApi { track: (event: string, data?: Record) => void identify: (userId: string) => void } // 用于验证和 DevTools 元数据的模式 const MyAnalyticsSchema = object({ apiKey: string(), }) export function useScriptMyAnalytics(options?: { apiKey: string scriptOptions?: NuxtUseScriptOptions }) { return useRegistryScript('myAnalytics', () => ({ scriptInput: { src: 'https://analytics.example.com/sdk.js', }, scriptOptions: { ...options?.scriptOptions, use() { // 初始化脚本 window.MyAnalytics.init(options?.apiKey) return window.MyAnalytics as T }, }, }), options, { schema: MyAnalyticsSchema }) } ``` ### 使用自定义注册表脚本 注册后,你的自定义脚本使用方式与内置注册表脚本完全相同: ```vue [pages/index.vue] ``` ### DevTools 集成 当你包含验证 Schema 时,Nuxt 脚本会自动用你的脚本配置填充 DevTools 元数据。在开发模式下,`registryKey` 和 `registryMeta` 会自动设置,使你能够: