{"data":{"site":{"siteMetadata":{"title":"bauhausify","siteUrl":"https://www.bauhausify.com","subtitle":"美大出身のWEBエンジニアリング奮闘記","descriptionMyself":"\n多摩美術大学<br>プロダクトデザイン専攻卒業 -> <br>GUIデザイン会社勤務 -><br>\n現在フロントエンジニア<br>\n<br>\nMy site -><br>\n<a href=\"http://www.mwrote.com\">www.mwrote.com</a>\n"}},"markdownRemark":{"id":"b24fa0f2-8884-5053-9f12-a2dbc1ab9fc6","html":"<p><a href=\"/2019-09-14_p5-js%E3%82%92%E6%9C%AC%E7%95%AA%E3%82%B5%E3%82%A4%E3%83%88%E3%81%A7%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95/\">p5.jsを本番サイトで使う方法</a>では、グローバルスコープ内(windowオブジェクト直下)に直接p5.jsを読み込ませ、p5.jsのグローバルモードとしてp5jsを実行する方法を解説しました。</p>\n<p>この記事では、p5jsのインスタンスモードを使用し、Reactなどのコンポーネントとしてp5.jsを読み込ませる方法を解説します。<br>\nインスタンスモードとグローバルモードの違いは<a href=\"/2019-09-14_p5-js%E3%82%92%E6%9C%AC%E7%95%AA%E3%82%B5%E3%82%A4%E3%83%88%E3%81%A7%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95/\">p5.jsを本番サイトで使う方法</a>をご覧ください。</p>\n<h2 id=\"p5jsのwrappingコンポーネントをゼロから作る\"><a href=\"#p5js%E3%81%AEwrapping%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%82%92%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8B\" aria-label=\"p5jsのwrappingコンポーネントをゼロから作る permalink\" class=\"gatsby-remark-autolink-headers-icon\"><svg width=\"22px\" height=\"7px\" viewBox=\"0 0 22 7\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n    <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n        <g id=\"icon-link\" fill=\"#23282D\">\n            <path d=\"M14,1 C13.4477153,1 13,1.31979661 13,1.71428571 L13,5.28571429 C13,5.68020339 13.4477153,6 14,6 L20,6 C20.5522847,6 21,5.68020339 21,5.28571429 L21,1.71428571 C21,1.31979661 20.5522847,1 20,1 L14,1 Z M14,0 L20,0 C21.1045695,0 22,0.696445945 22,1.55555556 L22,5.44444444 C22,6.30355406 21.1045695,7 20,7 L14,7 C12.8954305,7 12,6.30355406 12,5.44444444 L12,1.55555556 C12,0.696445945 12.8954305,0 14,0 Z M12,2 L12,5 L13,5 L13,2 L12,2 Z\" id=\"Combined-Shape\" fill-rule=\"nonzero\"></path>\n            <path d=\"M2,1 C1.44771525,1 1,1.31979661 1,1.71428571 L1,5.28571429 C1,5.68020339 1.44771525,6 2,6 L8,6 C8.55228475,6 9,5.68020339 9,5.28571429 L9,1.71428571 C9,1.31979661 8.55228475,1 8,1 L2,1 Z M2,0 L8,0 C9.1045695,0 10,0.696445945 10,1.55555556 L10,5.44444444 C10,6.30355406 9.1045695,7 8,7 L2,7 C0.8954305,7 0,6.30355406 0,5.44444444 L0,1.55555556 C0,0.696445945 0.8954305,0 2,0 Z M9,2 L9,5 L10,5 L10,2 L9,2 Z\" id=\"Combined-Shape\" fill-rule=\"nonzero\"></path>\n            <rect id=\"Rectangle-2\" x=\"6\" y=\"3\" width=\"10\" height=\"1\"></rect>\n        </g>\n    </g>\n</svg></a>p5.jsのWrappingコンポーネントをゼロから作る</h2>\n<p>動くサンプルコードは<a href=\"https://codesandbox.io/s/react-p5-wrapper-trjwy\" target=\"_blank_\">CodeSandBox</a>にあります。コードのみ見たい方はそちらをご覧ください。</p>\n<p>まずreactとp5をインストールしましょう。<br>\n関数コンポーネントで書きたいので、Reactの<code class=\"language-text\">useEffect</code>, <code class=\"language-text\">useState</code>あたりを使いたいので、Reactのバージョンは<code class=\"language-text\">16.8</code>以上が前提です。クラスコンポーネントで書きたい方は適宜置き換えてください。</p>\n<div class=\"gatsby-highlight\" data-language=\"sh\"><pre class=\"language-sh\"><code class=\"language-sh\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> react react-dom p5 <span class=\"token parameter variable\">--save</span></code></pre></div>\n<p>次にWrappingコンポーネントを作成してきます。<br>\n<code class=\"language-text\">P5Wrapper</code>という名前のReactの関数コンポーネントを作成します。<br>\n同時に、p5jsからcanvas要素を生成する先のdiv要素を<code class=\"language-text\">wrapper</code>という参照名で作成します。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">P5Wrapper</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">props</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> wrapper <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">createRef</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>div ref<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>wrapper<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>p5jsは圧縮版を<code class=\"language-text\">_p5</code>として読み込ませます。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> _p5 <span class=\"token keyword\">from</span> <span class=\"token string\">\"p5/lib/p5.min\"</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>クラスコンポーネントのStateとComponentDidMountに変わる関数を使いたいので、依存モジュールをimportします。<br>\nuseStateがStateを扱う役割をし、useEffectがComponentDidMountの役割をします。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> React<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> useState<span class=\"token punctuation\">,</span> useEffect <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>p5のインスタンス格納用に、stateを宣言します。<br>\nここでp5という名前を使いたかったので、p5js本体は<code class=\"language-text\">_p5</code>という名前にしています。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>p5<span class=\"token punctuation\">,</span> setP5<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>useEffectを使い、p5jsを<code class=\"language-text\">wrapper</code>にマウントさせます。<br>\nwrapperはdiv要素なので、div要素がレンダリングされたあと実行される<code class=\"language-text\">useEffect</code>の中でないと、p5jsをマウントできません。<br>\n第2引数に<code class=\"language-text\">props.sketch</code>を渡さないと無限にcanvasが生成されてしまいますのでご注意ください。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token function\">useEffect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setP5</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">_p5</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">.</span>sketch<span class=\"token punctuation\">,</span> wrapper<span class=\"token punctuation\">.</span>current<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>props<span class=\"token punctuation\">.</span>sketch<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>全体のコードは以下のようになります。<br>\nこれでp5jsのWrapperコンポーネントが完成しました。</p>\n<div class=\"gatsby-code-title gatsby-remark-code-titles\">P5Wrapper.js</div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> React<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> useState<span class=\"token punctuation\">,</span> useEffect <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> _p5 <span class=\"token keyword\">from</span> <span class=\"token string\">\"p5/lib/p5.min\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> PropTypes <span class=\"token keyword\">from</span> <span class=\"token string\">\"prop-types\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">P5Wrapper</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">props</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>p5<span class=\"token punctuation\">,</span> setP5<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> wrapper <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">createRef</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">useEffect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setP5</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">_p5</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">.</span>sketch<span class=\"token punctuation\">,</span> wrapper<span class=\"token punctuation\">.</span>current<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>props<span class=\"token punctuation\">.</span>sketch<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>div ref<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>wrapper<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\nP5Wrapper<span class=\"token punctuation\">.</span>propTypes <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">sketch</span><span class=\"token operator\">:</span> PropTypes<span class=\"token punctuation\">.</span>func\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> P5Wrapper<span class=\"token punctuation\">;</span></code></pre></div>\n<p>つぎにsketchファイルを別ファイルとして用意しておきます。<br>\n内容は300x300pxのcanvas内でマウス座標に従い赤い丸が描画されるというものです。</p>\n<div class=\"gatsby-code-title gatsby-remark-code-titles\">sketches/sketch1.js</div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">sketch</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">p</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  p<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">setup</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    p<span class=\"token punctuation\">.</span><span class=\"token function\">createCanvas</span><span class=\"token punctuation\">(</span><span class=\"token number\">300</span><span class=\"token punctuation\">,</span> <span class=\"token number\">300</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  p<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">draw</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    p<span class=\"token punctuation\">.</span><span class=\"token function\">background</span><span class=\"token punctuation\">(</span><span class=\"token number\">240</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>mouseX <span class=\"token operator\">===</span> <span class=\"token number\">0</span> <span class=\"token operator\">&amp;&amp;</span> p<span class=\"token punctuation\">.</span>mouseY <span class=\"token operator\">===</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n    p<span class=\"token punctuation\">.</span><span class=\"token function\">fill</span><span class=\"token punctuation\">(</span><span class=\"token number\">255</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    p<span class=\"token punctuation\">.</span><span class=\"token function\">noStroke</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    p<span class=\"token punctuation\">.</span><span class=\"token function\">ellipse</span><span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>mouseX<span class=\"token punctuation\">,</span> p<span class=\"token punctuation\">.</span>mouseY<span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> sketch<span class=\"token punctuation\">;</span></code></pre></div>\n<p>上記で作成したP5Wrapper.jsとsketch1.jsファイルを使用し。\nReactのindexファイルから参照します。</p>\n<div class=\"gatsby-highlight\" data-language=\"js:index.js\"><pre class=\"language-js:index.js\"><code class=\"language-js:index.js\">import React from &quot;react&quot;;\nimport ReactDOM from &quot;react-dom&quot;;\nimport P5Wrapper from &quot;./P5Wrapper&quot;;\nimport sketch1 from &quot;./sketches/sketch1&quot;;\n\nfunction App() {\n  return (\n    &lt;div className=&quot;App&quot;&gt;\n      &lt;h1&gt;Hello p5.js in React&lt;/h1&gt;\n      &lt;P5Wrapper sketch={sketch1} /&gt;\n    &lt;/div&gt;\n  );\n}\n\nconst rootElement = document.getElementById(&quot;root&quot;);\nReactDOM.render(&lt;App /&gt;, rootElement);</code></pre></div>\n<p>以上で完了です。<br>\n動くサンプルコードは<a href=\"https://codesandbox.io/s/react-p5-wrapper-trjwy\" target=\"_blank_\">CodeSandBox</a>にありますのでご覧ください。</p>\n<h2 id=\"おまけreact-p5-wrapperライブラリ編\"><a href=\"#%E3%81%8A%E3%81%BE%E3%81%91react-p5-wrapper%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E7%B7%A8\" aria-label=\"おまけreact p5 wrapperライブラリ編 permalink\" class=\"gatsby-remark-autolink-headers-icon\"><svg width=\"22px\" height=\"7px\" viewBox=\"0 0 22 7\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n    <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n        <g id=\"icon-link\" fill=\"#23282D\">\n            <path d=\"M14,1 C13.4477153,1 13,1.31979661 13,1.71428571 L13,5.28571429 C13,5.68020339 13.4477153,6 14,6 L20,6 C20.5522847,6 21,5.68020339 21,5.28571429 L21,1.71428571 C21,1.31979661 20.5522847,1 20,1 L14,1 Z M14,0 L20,0 C21.1045695,0 22,0.696445945 22,1.55555556 L22,5.44444444 C22,6.30355406 21.1045695,7 20,7 L14,7 C12.8954305,7 12,6.30355406 12,5.44444444 L12,1.55555556 C12,0.696445945 12.8954305,0 14,0 Z M12,2 L12,5 L13,5 L13,2 L12,2 Z\" id=\"Combined-Shape\" fill-rule=\"nonzero\"></path>\n            <path d=\"M2,1 C1.44771525,1 1,1.31979661 1,1.71428571 L1,5.28571429 C1,5.68020339 1.44771525,6 2,6 L8,6 C8.55228475,6 9,5.68020339 9,5.28571429 L9,1.71428571 C9,1.31979661 8.55228475,1 8,1 L2,1 Z M2,0 L8,0 C9.1045695,0 10,0.696445945 10,1.55555556 L10,5.44444444 C10,6.30355406 9.1045695,7 8,7 L2,7 C0.8954305,7 0,6.30355406 0,5.44444444 L0,1.55555556 C0,0.696445945 0.8954305,0 2,0 Z M9,2 L9,5 L10,5 L10,2 L9,2 Z\" id=\"Combined-Shape\" fill-rule=\"nonzero\"></path>\n            <rect id=\"Rectangle-2\" x=\"6\" y=\"3\" width=\"10\" height=\"1\"></rect>\n        </g>\n    </g>\n</svg></a>[おまけ]react-p5-wrapperライブラリ編</h2>\n<p>上でp5jsのwrappingコンポーネントを自作しましたが、もっとお手軽に使いたい方は、同様の機能が実装されている<a href=\"https://github.com/and-who/react-p5-wrapper\" target=\"_blank\" rel=\"noopener noreferrer\">react-p5-wrapper</a>を使うのがおすすめです。<br>\nコードは<a href=\"https://github.com/and-who/react-p5-wrapper\" target=\"_blank\" rel=\"noopener noreferrer\">GithubのREADME</a>より拝借いたしました。<br>\n内容も同じなので、そちらを見ていただいても同じです。</p>\n<p>それではまず、既存プロジェクトに依存モジュールをインストールします。</p>\n<div class=\"gatsby-highlight\" data-language=\"sh\"><pre class=\"language-sh\"><code class=\"language-sh\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> react-p5-wrapper <span class=\"token parameter variable\">--save</span></code></pre></div>\n<p>まずsketchファイルは1つのJSファイルとして完結させます。<br>\nグローバルモードから移植する場合は、すべてのp5js関数の先頭に<code class=\"language-text\">p.</code>をつけるだけです。<br>\nReactのアプリケーションスコープから値もpropsとして渡せます。<br>\n<code class=\"language-text\">myCustomRedrawAccordingToNewPropsHandler</code>関数で値を受け取り、内部スコープの変数に格納しています。</p>\n<div class=\"gatsby-code-title gatsby-remark-code-titles\">sketch.js</div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">sketch</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">p</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> rotation <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n  p<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">setup</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    p<span class=\"token punctuation\">.</span><span class=\"token function\">createCanvas</span><span class=\"token punctuation\">(</span><span class=\"token number\">600</span><span class=\"token punctuation\">,</span> <span class=\"token number\">400</span><span class=\"token punctuation\">,</span> p<span class=\"token punctuation\">.</span><span class=\"token constant\">WEBGL</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  p<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">myCustomRedrawAccordingToNewPropsHandler</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">.</span>rotation <span class=\"token operator\">!==</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n      rotation <span class=\"token operator\">=</span> props<span class=\"token punctuation\">.</span>rotation <span class=\"token operator\">*</span> Math<span class=\"token punctuation\">.</span><span class=\"token constant\">PI</span> <span class=\"token operator\">/</span> <span class=\"token number\">180</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  p<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">draw</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    p<span class=\"token punctuation\">.</span><span class=\"token function\">background</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    p<span class=\"token punctuation\">.</span><span class=\"token function\">normalMaterial</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    p<span class=\"token punctuation\">.</span><span class=\"token function\">noStroke</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    p<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    p<span class=\"token punctuation\">.</span><span class=\"token function\">rotateY</span><span class=\"token punctuation\">(</span>rotation<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    p<span class=\"token punctuation\">.</span><span class=\"token function\">box</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    p<span class=\"token punctuation\">.</span><span class=\"token function\">pop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>あとはreact-p5-wrapperコンポーネントのpropsに上で作成したsketch.jsファイルを渡します。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> P5Wrapper <span class=\"token keyword\">from</span> <span class=\"token string\">'react-p5-wrapper'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> sketch <span class=\"token keyword\">from</span> <span class=\"token string\">'./sketch.js'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token operator\">&lt;</span>P5Wrapper sketch<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>sketch<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span></code></pre></div>\n<p><code class=\"language-text\">P5Wrapper</code>コンポーネント内で自動でcanvasが生成されp5jsが実行されます。</p>\n<p>以上でライブラリ版は完了です。</p>\n<h2 id=\"まとめ\"><a href=\"#%E3%81%BE%E3%81%A8%E3%82%81\" aria-label=\"まとめ permalink\" class=\"gatsby-remark-autolink-headers-icon\"><svg width=\"22px\" height=\"7px\" viewBox=\"0 0 22 7\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n    <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n        <g id=\"icon-link\" fill=\"#23282D\">\n            <path d=\"M14,1 C13.4477153,1 13,1.31979661 13,1.71428571 L13,5.28571429 C13,5.68020339 13.4477153,6 14,6 L20,6 C20.5522847,6 21,5.68020339 21,5.28571429 L21,1.71428571 C21,1.31979661 20.5522847,1 20,1 L14,1 Z M14,0 L20,0 C21.1045695,0 22,0.696445945 22,1.55555556 L22,5.44444444 C22,6.30355406 21.1045695,7 20,7 L14,7 C12.8954305,7 12,6.30355406 12,5.44444444 L12,1.55555556 C12,0.696445945 12.8954305,0 14,0 Z M12,2 L12,5 L13,5 L13,2 L12,2 Z\" id=\"Combined-Shape\" fill-rule=\"nonzero\"></path>\n            <path d=\"M2,1 C1.44771525,1 1,1.31979661 1,1.71428571 L1,5.28571429 C1,5.68020339 1.44771525,6 2,6 L8,6 C8.55228475,6 9,5.68020339 9,5.28571429 L9,1.71428571 C9,1.31979661 8.55228475,1 8,1 L2,1 Z M2,0 L8,0 C9.1045695,0 10,0.696445945 10,1.55555556 L10,5.44444444 C10,6.30355406 9.1045695,7 8,7 L2,7 C0.8954305,7 0,6.30355406 0,5.44444444 L0,1.55555556 C0,0.696445945 0.8954305,0 2,0 Z M9,2 L9,5 L10,5 L10,2 L9,2 Z\" id=\"Combined-Shape\" fill-rule=\"nonzero\"></path>\n            <rect id=\"Rectangle-2\" x=\"6\" y=\"3\" width=\"10\" height=\"1\"></rect>\n        </g>\n    </g>\n</svg></a>まとめ</h2>\n<p>react-p5-wrapperを使った例も書きましたが、自分でいろいろカスタマイズしたい場合は、冒頭のカスタムコンポーネントを作成することをおすすめします。<br>\nVueのコンポーネントは書いていませんが、考え方はReactと同じです。<br>\n他にもiframeで動かすケースも考えられますが、iframeの参照URL先でグローバルモードのp5jsを動かすだけですので省略します。<br>\n後日余力があれば、nodejsとかと組み合わせて書いていきたいと思います。</p>\n<p>それでは、よいp5ライフを!</p>","fields":{"slug":"/2019-09-17_p5-jsをreactのコンポーネントとして実行する方法/"},"tableOfContents":"<ul>\n<li><a href=\"/2019-09-17_p5-js%E3%82%92react%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%A8%E3%81%97%E3%81%A6%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/#p5js%E3%81%AEwrapping%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%82%92%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8B\">p5.jsのWrappingコンポーネントをゼロから作る</a></li>\n<li><a href=\"/2019-09-17_p5-js%E3%82%92react%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%A8%E3%81%97%E3%81%A6%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/#%E3%81%8A%E3%81%BE%E3%81%91react-p5-wrapper%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E7%B7%A8\">おまけreact-p5-wrapperライブラリ編</a></li>\n<li><a href=\"/2019-09-17_p5-js%E3%82%92react%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%A8%E3%81%97%E3%81%A6%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/#%E3%81%BE%E3%81%A8%E3%82%81\">まとめ</a></li>\n</ul>","frontmatter":{"date":"2019.09.17","title":"p5.jsをReactのコンポーネントとして実行する方法","cover":"","category":"Coding","excerpt":"p5.jsを直接ページ内に読み込ませるのではなく、Reactなどのコンポーネントの中で実行する方法をコードベースでご紹介します。"}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"id":"b24fa0f2-8884-5053-9f12-a2dbc1ab9fc6","next":{"path":"/2019-09-14_p5-jsを本番サイトで使う方法/","title":"p5.jsを本番サイトで使う方法","category":"Coding"},"prev":{"path":"/2019-09-20_2019年版Node-jsのおすすめインストール方法/","title":"2019年版Node-jsのおすすめインストール方法","category":"Coding"},"relatedPosts":[{"id":"aa5f4477-fc03-52d8-a793-d1abdb3a7ecd","fields":{"slug":"/2019-09-02_p5jsのコードをsketchファイル上で実行する方法/"},"frontmatter":{"title":"p5jsのコードをsketchファイル上で実行する方法","date":"2019-09-02T00:00:00.000Z","excerpt":"Sketchで幾何学的なパターンを描くのに最適な、Processing(p5js)のコードをSketch上で実行できるPluginを紹介します。","templateKey":"post","category":"Coding","propertags":["p5js","sketch"],"commontags":["javascript"]}},{"id":"2e52640f-36d6-5268-99ea-9d58492ffec5","fields":{"slug":"/2019-09-14_p5-jsを本番サイトで使う方法/"},"frontmatter":{"title":"p5.jsを本番サイトで使う方法","date":"2019-09-14T00:00:00.000Z","excerpt":"p5.jsをいざプロダクションビルド(本番サイト向け)で使う場合、一体どのような方法で使うのが最適でしょうか。p5.jsの特徴を踏まえ、代表的な使い方をご紹介します。","templateKey":"post","category":"Coding","propertags":["p5js"],"commontags":["generative","javascript"]}},{"id":"d5a69a1d-62b7-5a8b-8f18-975dfee3ae96","fields":{"slug":"/2019-09-11_p5-jsスケッチトレーニング-円弧の線を円周上に沿って動かす/"},"frontmatter":{"title":"p5.jsスケッチトレーニング -円弧の線を円周上に沿って動かす-","date":"2019-09-11T00:00:00.000Z","excerpt":"p5.jsのarcと簡単なEasing式を使い、円弧の線を動かします。","templateKey":"post","category":"Coding","propertags":["p5js"],"commontags":["generative","javascript"]}},{"id":"1eb35481-156d-520b-ab66-a911316fe17b","fields":{"slug":"/2019-07-03_Webで簡単にコードで絵を描くp5-js/"},"frontmatter":{"title":"Webで簡単にコードで絵を描くp5.js","date":"2019-07-03T14:15:51.667Z","excerpt":"描画ライブラリp5.jsとCodepenを使い、ブラウザ上で簡単にスケッチを描く方法を紹介します。","templateKey":"post","category":"Coding","propertags":["p5js"],"commontags":["generative","javascript"]}},{"id":"120932f2-28cf-5e37-aaba-6aee6eea5714","fields":{"slug":"/2019-08-15_たった4ステップでVueを使う方法/"},"frontmatter":{"title":"たった4ステップでVueを使う方法","date":"2019-08-15T00:00:00.000Z","excerpt":"実はVue.jsは、JavaScript初学者でも簡単に導入できるような仕組みがあります。この記事では、Vue.jsの強力な特徴と、導入するには何をしたらいいのかを説明します。","templateKey":"post","category":"Coding","propertags":["vuejs"],"commontags":["component","javascript"]}}]}}