bauhausify美大出身の
WEBエンジニアリング奮闘記
CODING

p5.jsを本番サイトで使う方法

2019.09.14
p5.jsをいざプロダクションビルド(本番サイト向け)で使う場合、一体どのような方法で使うのが最適でしょうか。p5.jsの特徴を踏まえ、代表的な使い方をご紹介します。

前提知識 p5.jsの書き方とその特徴

p5.jsはその書き方に着目すると2パターンあります。

標準の書き方(グローバルモード)

まず公式のGet Startedページに記載されている書き方です。
後で登場するインスタンスモードと区別するためにこの記事ではグローバルモードと呼ばせてください。

function setup() {
  createCanvas(100, 100);
}

function draw() {
  background(0);
  fill(100);
  noStroke();
  ellipse(width/2, height/2, 50);
}

本家のProcessingの書き方にできるだけ似せており非常に書きやすいです。
簡単にsketchを書きたい場合、プロトタイプや研究用として暫定的に使いたい場合、他のJSライブラリを使わない小規模なサイトの場合に向いています。
しかし、グローバル領域を汚染している(windowオブジェクトの中に直接p5.jsが定義されている)ので、他のJSファイルや今後書いていくJSファイルと定義がコンフリクトする可能性があり、プロダクションビルドではあまり使いたくない方法です。

インスタンスモード

公式のInstance Containerページに記載されています。

index.html
<div id='container'></div>
index.js
const sketch = function(p) {
  p.setup = function() {
    p.createCanvas(100, 100);
  }

  p.draw = function() {
    p.background(0);
    p.fill(100);
    p.noStroke();
    p.ellipse(width/2, height/2, 50);
  }
}


new p5(sketch, 'contaienr');

グローバルモードと比べると、表示結果は同じなのですが、明らかに記述量が多く書きづらいですね。
ただしこの場合、グローバル領域を汚染しているのはp5という関数のみです。
なので、こちらは少し書きづらいけど、安全な書き方です。さらに、p5を実行する場所も指定できます。

注意点として、window直下にsetupもしくはdraw関数を定義しないことです。
もし定義してしまうと、インスタンスモードではなくなりグローバルモードになります。

ちなみにBabelなどのES6環境下であれば、functionを省略できる文、少しコード量は減ります。

const sketch = p => {
  p.setup = () => {
    p.createCanvas(100, 100);
  }

  p.draw = () => {
    p.background(0);
    p.fill(100);
    p.noStroke();
    p.ellipse(width/2, height/2, 50);
  }
}

p5.js具体的な読み込ませ方

ざっと考えると以下のパターンが考えられます。

  1. scriptタグで読み込ませ、グローバルモードで実行
  2. 作品ごとに別URLで準備しておき、使いたいページ内でiframeとして実行する
  3. scriptタグで読み込ませ、インスタンスモードで実行

scriptタグで読み込ませ、グローバルモードで実行

小規模なサイトや他のJSライブラリを使っていなく、自由にJSを書ける環境であればおすすめです。
しかし、大概の本番サイトの場合、グローバル汚染するのでおすすめしません。

作品ごとに別URLで準備しておき、使いたいページ内でiframeとして実行する

ハック的なやり方です。
ただサイト構造やサーバーサイドを設計する必要があり、iframeをページ内で扱う必要があるため、扱いづらく複雑です。
iframeを前提とした環境を整備できるのであれば、おそらく一番スマートなやり方ですが、導入の敷居が高いです。

scriptタグで読み込ませ、インスタンスモードで実行

書きづらさを除けば、導入の敷居が低く、グローバル汚染もほぼなく一番現実的な方法です。
いきなりインスタンスモードで書いてもいいですが、ローカルや公式のp5.jsのブラウザ実行環境でグローバルモードで最終的なコードを完成させたあと、インスタンスモードに変換するのがおすすめです。

まとめ

  • setupdraw関数をグローバルスコープで定義するとグローバルモードになる、それ以外だとインスタンスモード
  • グローバルモードは書きやすいけど、グローバル汚染する
  • インスタンスモードは書きづらいけど、グローバル汚染しない
  • 練習、プロトタイプ、研究では、書きやすいグローバルモードがおすすめ
  • 本番サイトではグローバル汚染を避けるため、インスタンスモードかおすすめ
  • サーバーサイドも手を出せるのであれば、グローバルモードでiframeもあり
  • ReactやVueのコンポーネントとして使う場合は後日、別記事でご紹介

この記事を共有しよう!

前の記事
p5.jsスケッチトレーニング -円弧の線を円周上に沿って動かす-
次の記事
p5.jsをReactのコンポーネントとして実行する方法
関連記事