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

在Next.js中如何正确添加带onload回调的外部JS脚本

解决方法

方案1:使用Next.js官方提供的next/script组件(推荐)

Next.js 11及以上版本专门提供了Script组件优化外部脚本的加载逻辑,比直接在Head中写script标签兼容性更好,也完美支持加载完成后的回调:

// 先导入Script组件
import Script from 'next/script'
import Head from 'next/head'

// 组件内直接使用,不需要放在Head标签里
export default function StorePage() {
  return (
    <>
      <Head>
        <title>Demo store</title>
      </Head>
      <Script
        async
        type="text/javascript"
        src="/static/my_resource.js"
        // 加载完成后执行回调,直接调用挂载到window上的init方法
        onLoad={() => window.init()}
        // 如果需要和原生写法一样把脚本放到head里,可以加下面这行配置
        // strategy="beforeInteractive"
      />
      {/* 页面其他内容 */}
    </>
  )
}

方案2:继续使用Head内的原生script标签

如果不想用Script组件,也可以修改原来的写法,核心要注意:React体系内的事件属性必须传函数,不能传字符串形式的执行代码,所以要把onLoad的值改成函数表达式:

import Head from 'next/head'

...

<Head>
  <title>Demo store</title>
  <script
    async
    type='text/javascript'
    src='/static/my_resource.js'
    // 传函数,直接调用window上的init,加可选链避免脚本加载异常时报错
    onLoad={() => window.init?.()}
  ></script>
</Head>

原报错原因说明

原生HTML的onload属性支持传入字符串类型的可执行代码,但是React(Next.js基于React)的所有事件属性都是驼峰命名,且要求传入函数类型的值,你之前直接传字符串init()自然会触发类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 02:12:00