技術

Remix上でGSAPアニメーションを動かしてみた

こんにちわ

最近のWebサイトを見ているとかっこいいアニメーションが使われているものが多いですよね。色々調べてみるとGSAP(GreenSock Animation Platform)というJavaScriptアニメーションライブラリを使っているのが多いっぽいなということに気づきまして。そのGSAPの公式サイトはこちらです。Showcaseのページにあるようなアニメーションをさせることができるようです。調べていくうちにそもそもどうやってアニメーションを動かしているのか気になってきまして、ドキュメントも一応読んで見たのですが、いまいちわからんということで実際に動かして確認してみました(笑)無課金でも簡単なテキストアニメーションや、ブラウザのスクロールをトリガーにしたアニメーションをさせることはできるのでやってみました。

なぜRemix?

Remixについてはこちらの公式サイトを見て頂くのが良いかと思います。フロントエンドのフレームワークを色々探していた中で以下の様な条件を満たすものとしてRemixが当てはまりそうだったので最近使ってみたりしています。僕の勝手なイメージです。使っていく中で実際のところどうなのかっていうのが把握できたらいいなくらいに思っています。

  • ベンダーロックインしなさそう(Next.jsはVercel上で稼働させることに特化しすぎているイメージ)
  • デプロイが簡単にできた(Netlifyを使うと簡単にデプロイできた)
  • 運用コストを安くしたい(Netlify + remixが小規模だと安くなりそう)
  • Vue.jsと比較してReactの方が多少は慣れている

GSAPのインストールは基本的には公式サイト通り

GSAPの公式ページにReactのインストール手順が載っています。僕は今回npmでのインストール方法でインストールし、基本的には公式のサイトに掲載されている手順通りでできたのですが、1点だけうまく動かない点があったのでここに残しておきたいなと思います。公式サイトでは以下のようにgsapのライブラリをインポートして利用する例が挙げられていますがScrollTriggerの方がエラーになり実行時エラーとなりました。

import { gsap } from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";

Cannot use import statement outside a moduleエラーに遭遇

実際にページ表示時に発生したエラーは以下になります。RemixはSSR(Server Side Rendering)が使えるのですが、ScrollTriggerはクライアント側での実行である必要がありそうでした。

[vite] Error when evaluating SSR module /app/routes/_index.tsx: failed to import "gsap/ScrollTrigger"
|- /Users/manabu/src/github.com/dubakichi/portfolio-front-remix-v2/node_modules/gsap/ScrollTrigger.js:12
import { Observer, _getTarget, _vertical, _horizontal, _scrollers, _proxies, _getScrollFunc, _getProxyProp, _getVelocityProp } from "./Observer.js";
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at internalCompileFunction (node:internal/vm:128:18)
    at wrapSafe (node:internal/modules/cjs/loader:1279:20)
    at Module._compile (node:internal/modules/cjs/loader:1331:27)
    at Module._extensions..js (node:internal/modules/cjs/loader:1426:10)
    at Module.load (node:internal/modules/cjs/loader:1205:32)
    at Module._load (node:internal/modules/cjs/loader:1021:12)
    at cjsLoader (node:internal/modules/esm/translators:366:17)
    at ModuleWrap.<anonymous> (node:internal/modules/esm/translators:315:7)
    at ModuleJob.run (node:internal/modules/esm/module_job:222:25)
    at async ModuleLoader.import (node:internal/modules/esm/loader:323:24)

エラーに対処する

他にも対処方法としてはあるのかとは思うのですが、クライアント側での初回ロード時にScrollTriggerのライブラリをロードするようにしたことでこの問題は解消しました。具体的には以下の様なコードになります。

import { gsap } from "gsap";

export default function Index() {
  const aboutUsRef = useRef(null);
  useEffect(() => {
    import("gsap/ScrollTrigger").then(({ ScrollTrigger }) => { // ここでScrollTriggerをロードする様にする
       gsap.registerPlugin(ScrollTrigger);
    }
  }, []);
  // GSAPのアニメーションコード
  gsap.fromTo(aboutUsRef.current, {
    // ・・・
  }
return (
    <div>
      <div className={styles.box} ref={aboutUsRef}>ScrollTriggerを使っています</div>
    </div>
  );
}

おわりに

上記の修正するとちゃんとアニメーションが動く様になりました!今回はScrollTriggerについて書きましたが、TextPluginなど他のプラグインでも同様の問題が起きました。この場合も上記記載同様の対処で対応できます。Remixに限らずNext.jsなどSSRを有効にしているフレームワークの場合同様の問題が起きるのだと思います。僕と同様にハマった人の何かしらのお力になれれば幸いです。

でわまた!

2024年秋 プロジェクトマネージャー試験受験するど!前のページ

今年の例のアレ、放置すると減税にならない次のページ

関連記事

  1. 技術

    [docker][PHP]Laravel開発テンプレを作ってみた

    こんにちわ、どばきちです。いざ新規に何かしらの開発を…

  2. 技術

    CLI環境からSlackに通知する

    こんにちわ、どばきちです。今回は前回の記事の続きです…

  3. 技術

    [docker][PHP]Laravelでステップ実行してみる

    こんにちわ、どばきちです。前回はdockerでLar…

  4. WordPress開発・運用

    WordPressテーマ開発環境を準備する

    こんにちわ前回はWordPressのローカル開発環境を構築す…

  5. WordPress開発・運用

    [docker]WordPressのローカル開発環境を用意してみた

    こんにちわ先日WordPressのテーマを微修正したのですが…

  6. フリーランス

    iPhoneの領収書整理を自動化してみた話 構成編

    こんにちわ、どばきちです。前回はiPhoneの領収書…

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

2024年11月
 123
45678910
11121314151617
18192021222324
252627282930  
  1. 技術

    [docker][PHP]Laravelでステップ実行してみる
  2. フリーランス

    専従者給与支払者には絶対必要な対応
  3. 技術

    warpではzshのbindkeyが使えない
  4. 雑談

    Google広告承認されました!
  5. フリーランス

    フリーランスになる前の費用は開業費!
PAGE TOP