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
相关产品推荐
相关产品推荐

