AstroでView Transitionsを使った時にJavascriptが動作しない場合

Astroには、簡単にスムーズなページ遷移を実現する「View Transition」という機能があります。自動でページ遷移の時にフェードを適用してくれるのですが、Javascriptが初回表示時しか実行されない(サイト内ページ遷移で2回目に表示した時に実行されない)という問題がが発生したので、対処方法をメモ。

バージョン

astro:5.2.5
gsap:3.12.7

ViewTransitionsの実装

ViewTransitionsをインポートしてヘッダーに<ViewTransitions />を記述するだけ。超カンタン。

---
import '../styles/global.css';
import { ViewTransitions } from 'astro:transitions';
---

<!doctype html>
<html lang="jp">
	<head>
		<meta charset="UTF-8" />
		<meta name="viewport" content="width=device-width" />
		<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
		<meta name="generator" content={Astro.generator} />
		<title>Your Site</title>
		<ViewTransitions />
	</head>
	<body>
		<slot />
	</body>
</html>

問題

GSAPを使って、ページ遷移時に要素がスライドインしてくるアニメーションを実装。初回表示時には問題なく実行されますが、ページを回遊していて戻ってくると実行されません。どうやら、ViewTransitionsを導入することでAstroがSPAモードになり、JavaScriptが再度実行されないようになっているらしい。

import { gsap } from 'gsap';
	const pageContainer = document.querySelector('.page__container');

	gsap.fromTo(pageContainer, 
		{ x: '-50vw' },
		{ 
			x: '0',
			duration: 2,
			ease: 'power2.inOut',
		}
	);

対処法

ページ遷移が完了するとastro:after-swapというイベントが発生します。ということで、実行したいアニメーションをslideIn関数にまとめて、初回ロード時はslideInを実行し、ページが切り替わったら(astro:after-swapが発生したら)slideInを実行するという記述にすればOK。

import { gsap } from 'gsap';
	const slideIn =() => {
		const pageContainer = document.querySelector('.page__container');

		gsap.fromTo(pageContainer, 
			{ x: '-50vw' },
			{ 
				x: '0',
				duration: 2,
				ease: 'power2.inOut',
			}
		);
	}

	slideIn();

	document.addEventListener('astro:after-swap', () => {
			slideIn();
	});