You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在NextJS(TypeScript)中引入外部Script函数的实现问题

在Next.js(TypeScript)中引入外部全局脚本的解决方案

1. 使用Next.js官方的next/script组件加载脚本

Next.js提供了专门的Script组件来管控外部脚本的加载时机,能避免原生<script>标签在SSR/SSG阶段的加载顺序问题:

// 在_app.tsx或具体的page.tsx中引入
import Script from 'next/script';

export default function MyApp({ Component, pageProps }) {
  return (
    <>
      {/* 根据需求选择加载策略,beforeInteractive确保在页面交互前完成加载 */}
      <Script
        src="https://api.site.com/js/v1/script.js"
        strategy="beforeInteractive"
        onLoad={() => {
          console.log('外部脚本加载完成');
        }}
      />
      <Component {...pageProps} />
    </>
  );
}

2. 为全局变量添加TypeScript类型声明

TypeScript无法识别未声明的全局变量,需创建类型声明文件来消除类型报错:

在项目根目录或src目录下新建global.d.ts文件,内容如下:

declare global {
  interface Window {
    ScriptJS: () => {
      execute: (input: Record<string, any>) => any;
      // 可根据实际函数功能补充更多类型定义
    };
  }
}

export {};

3. 安全调用全局函数

必须确保脚本加载完成后再调用函数,避免ReferenceError:

方法一:在Script组件的onLoad回调中调用

<Script
  src="https://api.site.com/js/v1/script.js"
  strategy="beforeInteractive"
  onLoad={() => {
    const fn = window.ScriptJS();
    const someOutput = fn.execute({ key: 'your-input-value' });
    // 处理函数返回结果
  }}
/>

方法二:在组件中通过useEffect判断加载状态

import { useEffect } from 'react';

export default function MyPage() {
  useEffect(() => {
    if (typeof window.ScriptJS === 'function') {
      const fn = window.ScriptJS();
      const someOutput = fn.execute({ key: 'your-input-value' });
      // 处理结果
    } else {
      console.error('外部脚本未加载完成');
    }
  }, []);

  return <div>页面内容</div>;
}

错误原因说明

  • 直接用原生<script>标签:Next.js的SSR/SSG阶段会在服务器端渲染,此时window对象不存在,脚本还未在客户端加载完成就执行代码,导致ReferenceError。
  • 使用require()/import():外部脚本是全局变量形式而非ES模块,动态导入语法不适用这类脚本,需通过全局变量访问。

内容的提问来源于stack exchange,提问作者bangsum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 19:40:39