You need to enable JavaScript to run this app. Gatsby用Helmet或SSR API导入静态JS报Uncaught SyntaxError咨询
优惠活动
大模型
产品
解决方案
定价
更多

Gatsby用Helmet或SSR API导入静态JS报Uncaught SyntaxError咨询

Gatsby 静态JS引入报错Uncaught SyntaxError: Unexpected token '<'解决方案

报错核心原因

这个报错并非JS文件本身语法错误,实际是浏览器请求JS资源时,拿到了站点的index.html返回内容(HTML文档起始为<字符),浏览器尝试将HTML内容作为JS脚本解析就会触发该错误,本质和你判断的一致:静态资源引用路径不匹配,导致404后被dev/生产服务的页面fallback逻辑拦截,返回了HTML页面而非目标JS文件。
之前两次配置踩了三个典型问题:

  • 路径写法用了相对路径./plugins/zaius/index.js:这类相对路径是相对于当前浏览器访问的页面地址计算的,不是站点根目录。比如访问/product/detail/123这类二级页面时,浏览器会自动把相对路径拼接在当前页面路径后,实际请求地址变成/product/detail/123/plugins/zaius/index.js,这个路径不存在就会触发fallback返回index.html。
  • SSR配置的script标签错用属性:script标签加载外部JS必须使用src属性,href是link标签的专属属性,写了href的script标签根本不会发起JS资源请求。
  • 对Gatsby静态目录的路径映射规则认知偏差:/static目录下的所有文件,在开发和构建输出时都会直接映射到站点根路径/下,你项目里static/plugins/zaius/index.js的实际可访问地址就是/plugins/zaius/index.js,无需加./前缀。

正确配置方法

场景1:仅在指定业务页面通过react-helmet引入

修正路径为站点根路径的绝对路径即可:

const ProductDetail = ({ data }) => {
  return (
    <>
      <Helmet>
        <script 
          type="application/javascript" 
          src="/plugins/zaius/index.js" 
        />
      </Helmet>
      <div css={styles.layout}>
      {/* 页面剩余逻辑 */}
      ...
    </>
  )
}

场景2:全局通过Gatsby SSR API引入

修正属性错误、替换为正确的根路径:

export const onRenderBody = ({ setHeadComponents }) => {
  setHeadComponents([
    <script
      key="zaius-script"
      type="application/javascript"
      src="/plugins/zaius/index.js"
    />
  ])
}

补充注意事项

  • 改完配置后,可以直接在浏览器地址栏输入http://localhost:8000/plugins/zaius/index.js,如果能正常返回对应JS文件的内容,就说明路径配置正确,不会再触发解析报错。
  • 如果项目需要部署在子路径下(比如https://your-domain.com/my-site/),需要先在gatsby-config.js中配置pathPrefix,再引入脚本时使用Gatsby内置的__PATH_PREFIX__变量拼接路径,保证开发、构建环境的路径都能正常匹配:
    src={`${__PATH_PREFIX__}/plugins/zaius/index.js`}
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 06:45:08