Shopify Hydrogen(Vite)导入React组件报Parse Error的解决方法
正在试用Shopify推出的基于Vite构建、定位与NextJS类似的新框架Hydrogen,项目包含两个核心文件:
- 页面入口文件
index.server.jsx
import Layout from "../components/Layout.server"; export default function Home() { return ( <Layout> <div> <h1> Hello world! </h1> </div> </Layout> ); }
- 布局组件文件
Layout.server.js
export default function Layout({children}) { return ( <div> ${children} </div> ); }
测试过程中发现:不导入、不使用Layout组件时项目运行完全正常;一旦引入并使用该Layout组件,就会触发Parse Error解析错误,现有报错提示描述性不足,无法直接定位问题,需要明确错误产生原因与对应修复方案。
报错的核心诱因是Layout.server.js中存在JSX语法书写错误:${children}是ES6模板字符串(即反引号`包裹的字符串)专用的变量插值语法,JSX语法完全不支持这种插值写法。JSX规则要求,在标签内部嵌入JavaScript变量、表达式时,只需要用单大括号{}包裹目标内容即可。你在JSX的div子节点位置直接书写${children},会被JSX解析器判定为非法语法结构,直接抛出解析失败错误。
出现“不引用就不报错”的现象也很好解释:Hydrogen基于Vite构建,默认采用按需编译逻辑,没有被页面入口引用的组件不会进入编译流程,文件内的语法错误自然不会被检测到;一旦你在页面中引入并使用Layout组件,构建工具就会解析、编译该组件文件,语法错误就会被触发。
将Layout.server.js中错误的模板字符串插值写法${children},替换为JSX标准的单大括号插值写法{children}即可。
修复后的Layout.server.js完整代码如下:
export default function Layout({children}) { return ( <div> {children} </div> ); }
补充提示:如果后续Layout组件不需要额外包裹外层DOM节点,可以直接用JSX Fragment短语法
<></>包裹子节点,避免生成多余的DOM层级,Hydrogen和Next.js均原生支持该写法。
内容的提问来源于stack exchange,提问作者noiseymur

