docs/src/routes/shopify-hydrogen/index.mdx
The Shopify Hydrogen setup is largely the same as the React integration guide, except it goes further into how to add to the framework's app root component.
npm install @qwik.dev/partytown
yarn add @qwik.dev/partytown
pnpm install @qwik.dev/partytown
The <Partytown/> component is imported from the @qwik.dev/partytown/react submodule. The config properties are JSX props.
The following is an example of including the <Partytown/> component in a root Shopify component. Notice the <Partytown/> component before the <DefaultSeo/> component.
import { DefaultRoutes } from "@shopify/hydrogen";
import { Suspense } from "react";
import DefaultSeo from "./components/DefaultSeo.server";
import NotFound from "./components/NotFound.server";
import AppClient from "./App.client";
import LoadingFallback from "./components/LoadingFallback";
import { Partytown } from "@qwik.dev/partytown/react";
export default function App({ log, pages, ...serverState }) {
return (
<Suspense fallback={<LoadingFallback />}>
<AppClient helmetContext={serverState.helmetContext}>
<Partytown debug={true} forward={["dataLayer.push"]} />
<DefaultSeo />
<DefaultRoutes
pages={pages}
serverState={serverState}
log={log}
fallback={<NotFound />}
/>
</AppClient>
</Suspense>
);
}
The example above is setting the forward config for Google Tag Manager.
Add the type="text/partytown" prop for each script that should run from a web worker. The example below is using the React specific way of inlining a script with dangerouslySetInnerHTML.
<Partytown debug={true} forward={['dataLayer.push']} />
<script
type="text/partytown"
dangerouslySetInnerHTML={{
__html: '// inlined third-party script',
}}
/>
Copy library files to public/~partytown. How the files are copied or served from your site is up to each site's setup. A partytown copylib CLI copy task has been provided for convenience which helps copy the Partytown library files to the public directory. Below is an example of creating a "partytown" NPM script which could run before the build:
"scripts": {
"dev": "npm run partytown && vite",
"build": "npm run partytown && yarn build:client && yarn build:server && yarn build:worker",
"build:client": "vite build --outDir dist/client --manifest",
"build:server": "vite build --outDir dist/server --ssr src/entry-server.jsx",
"build:worker": "cross-env WORKER=true vite build --outDir dist/worker --ssr worker.js",
"partytown": "partytown copylib public/~partytown"
}