{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/write-jquery-plugin-with-coffeescript/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"d7c46629-4a7c-5a33-af2c-fef22b9c33a4","excerpt":"こんにちは。 昼夜逆転が一周してやっと普通の生活に戻って来ました。れこです 最近、CoffeeScriptというJavaScriptのライブラリにハマっています。 半年前くらいに流行った、賛否両論なjsライブラリです。 非常にシンプルにjsを書くことができて、Ruby on Rails…","html":"<p>こんにちは。<br>\n昼夜逆転が一周してやっと普通の生活に戻って来ました。れこです</p>\n<p>最近、CoffeeScriptというJavaScriptのライブラリにハマっています。<br>\n半年前くらいに流行った、賛否両論なjsライブラリです。<br>\n非常にシンプルにjsを書くことができて、Ruby on Railsでも公式採用されています。<br>\nそのCoffeeScriptでjQueryのプラグインを１つ書いてみて、CoffeeScriptで開発していくことについて感じたことをメモします。</p>\n<p>CoffeeScriptやjQueryプラグインの基礎については特に触れません。ご了承下さい。</p>\n<!--more-->\n<h2 id=\"coffeescriptとは\" style=\"position:relative;\"><a href=\"#coffeescript%E3%81%A8%E3%81%AF\" aria-label=\"coffeescriptとは permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>CoffeeScriptとは</h2>\n<p>CoffeeScriptはJavaScriptを楽にシンプルに書けるライブラリです。おおまかな特徴は、</p>\n<ol>\n<li>文法はRubyやPythonに近い</li>\n<li>関数呼び出しの際に引数の括弧を省略できる</li>\n<li>インデントでループや関数などのブロックを表現する</li>\n<li>行末のセミコロンやオブジェクトのリテラルなども省略可能</li>\n<li>従来のjsでは扱えない拡張された文法がもろもろ</li>\n</ol>\n<p>など、素のjsでは考えられないほどタイプ数が減ります。<br>\nそのため、コーディング速度や保守性が高まり、複数人で書いても品質の高く統一されたコードを書くことができます。</p>\n<h2 id=\"作ったもの\" style=\"position:relative;\"><a href=\"#%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE\" aria-label=\"作ったもの permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>作ったもの</h2>\n<p>あまり簡素なものでは練習にならないので、今回は、[jQuery.masonry]のような要素をタイル状に並べるプラグインを作りました。<br>\nページの横幅からはみ出さないように横に並べる個数を調整できます。<br>\n完成品を見てもらったほうが早いのでデモを。</p>\n<p>[ページ内の要素をタイル上に並べるjQueryプラグイン jQuery.Tile.js]</p>\n<p>プラグインに少し上乗せして、私のTwitterのつぶやきを表示しています。<br>\nプラグインとは無関係に、一番下までスクロールすると、次のツイートを読み込む無限スクロールも入れてあります。<br>\n余計なもの盛り込みました。はい。</p>\n<h2 id=\"coffee版jqueryプラグインのテンプレート\" style=\"position:relative;\"><a href=\"#coffee%E7%89%88jquery%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88\" aria-label=\"coffee版jqueryプラグインのテンプレート permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Coffee版jQueryプラグインのテンプレート</h2>\n<p>普通のjsでjQueryプラグインを作ると、だいたいこのような感じになると思います。</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">$</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    $<span class=\"token punctuation\">.</span>fn<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">pluginName</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">config</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">var</span> defaults <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n            option<span class=\"token operator\">:</span> <span class=\"token string\">\"オプション\"</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n        option <span class=\"token operator\">=</span> $<span class=\"token punctuation\">.</span><span class=\"token function\">extend</span><span class=\"token punctuation\">(</span>defaults<span class=\"token punctuation\">,</span> config<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">each</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token comment\">// ここにプラグインの処理を書く</span>\n        <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><span class=\"token punctuation\">(</span>jQuery<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>すごく、カッコカッコしています。</p>\n<ul>\n<li>コードを書き換えた時に、カッコの対応がズレる</li>\n<li>オブジェクトや配列を書くときに、最後の要素にもカンマを入れちゃう</li>\n</ul>\n<p>など、しょうもないミスを頻発している私は、基本的な文法にもイライラします。<br>\nただ初心者なだけですね。はい。<br>\nで、これをCoffeeScriptで書くと、こうなります。</p>\n<div class=\"gatsby-highlight\" data-language=\"coffeescript\"><pre class=\"language-coffeescript\"><code class=\"language-coffeescript\"><span class=\"token keyword\">do</span> <span class=\"token punctuation\">(</span>$<span class=\"token operator\">=</span>jQuery<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> \n  $<span class=\"token punctuation\">.</span>fn<span class=\"token punctuation\">.</span>pluginName <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>config<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> \n    defaults <span class=\"token property\">option</span><span class=\"token operator\">:</span> <span class=\"token string\">\"オプション\"</span>\n    option <span class=\"token operator\">=</span> $<span class=\"token punctuation\">.</span><span class=\"token keyword\">extend</span><span class=\"token punctuation\">(</span>defaults<span class=\"token punctuation\">,</span> config<span class=\"token punctuation\">)</span>\n    @<span class=\"token punctuation\">.</span><span class=\"token keyword\">each</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> \n      <span class=\"token comment\"># ここに処理を記述</span></code></pre></div>\n<p><strong>非常にシンプル</strong>です。<br>\nループや関数の終わりはインデントで表現されるため、閉じカッコが不要です。<br>\nそのため、非常にシンプルに書くことができます。<br>\nこっちのほうが書きやすい！ 見やすい！ とおもいます。</p>\n<h2 id=\"感想反省\" style=\"position:relative;\"><a href=\"#%E6%84%9F%E6%83%B3%E5%8F%8D%E7%9C%81\" aria-label=\"感想反省 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>感想、反省</h2>\n<p>ざっとプラグインを作ってみて思ったことをまとめると、以下の通りです。</p>\n<h3 id=\"coffeeに使われている\" style=\"position:relative;\"><a href=\"#coffee%E3%81%AB%E4%BD%BF%E3%82%8F%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B\" aria-label=\"coffeeに使われている permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Coffeeに使われている</h3>\n<p>今回のプラグインではかなり無理やりCoffeeScriptのclassを使った感がありました。<br>\nclassを使いこなせていないし、並びにオブジェクト指向への理解がまだ足りないと感じました。</p>\n<h3 id=\"設計ミス\" style=\"position:relative;\"><a href=\"#%E8%A8%AD%E8%A8%88%E3%83%9F%E3%82%B9\" aria-label=\"設計ミス permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>設計ミス</h3>\n<p>また、htmlに要素を追加した際に、再描画するメソッドを用意しておらず、再度プラグインを呼び出すという記述になってしまっています。<br>\nそして、今の実装方法だと、横幅の違う要素があるときれいに並びません。</p>\n<h3 id=\"感想\" style=\"position:relative;\"><a href=\"#%E6%84%9F%E6%83%B3\" aria-label=\"感想 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>感想</h3>\n<ul>\n<li>もっと大規模のjsじゃないと真価を発揮できなさそう</li>\n<li>でもすごく書きやすい</li>\n<li>jsが多少分ければすぐに書けるようになる</li>\n</ul>\n<p>jsでの面倒な書き方などを上手いこと包み込んでくれています。<br>\nなので、書く側はロジックに集中でき、精神衛生上すごく優しいと感じました。</p>\n<h3 id=\"注意点\" style=\"position:relative;\"><a href=\"#%E6%B3%A8%E6%84%8F%E7%82%B9\" aria-label=\"注意点 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>注意点</h3>\n<p>ただし、CoffeeScriptはjsの面倒は見てくれるけれど、書き手のロジックまでは面倒を見てくれませんので、結局<strong>ウンコードはウンコードのまま</strong>です。</p>\n<h2 id=\"まとめ\" style=\"position:relative;\"><a href=\"#%E3%81%BE%E3%81%A8%E3%82%81\" aria-label=\"まとめ permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>まとめ</h2>\n<p>Q,今後もCoffeeScriptを使いますか？<br>\n<strong>A,使いたいけど、タイミングがあまり無さそう。</strong><br>\njsはファイル数増えると読み込み速度が下がるので、結合コンパイルとかは非常にいいと思うのですが、すでにjsで書かれているファイルとCoffeeの連結は都合が悪く<strong>一からCoffeeScript100％で書かないと威力を発揮しにくい</strong>と感じました。<br>\nとは言え、使えるタイミングではとことん使えると思うので、機会があったらガンガン使っていこうと思います。</p>\n<p>今回の記事で掲載したプラグインはGithubに公開してあります。<br>\n<a href=\"https://github.com/Leko/jquery.tile.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://github.com/Leko/jquery.tile.js</a><br>\nまだ実用的では無いので、プラグインの紹介記事はプラグインの修正後に公開します。<br>\n最後まで読んで下さいまして、ありがとうございました。</p>","timeToRead":5,"frontmatter":{"title":"CoffeeScriptでjQueryプラグインを書いてみて思ったこと","tags":["CoffeeScript","JavaScript","jQuery"],"date":"February 17, 2013","featuredImage":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='162'%20viewBox='0%200%20400%20162'%20preserveAspectRatio='none'%3e%3cpath%20d='M340%2049l3%203c2%201%203%203%202%203l1%201%201%204c0%204%200%204-2%204a243%20243%200%2000-86-1l-2%201-1%202c0%202-2%204-4%204l-4%202-5%201c-3%200-3%200-2%201h4c2%200%203%200%203%202h1c0-2%201-3%202-3h2l2%202c1%203%201%203-1%203a271%20271%200%2000-28%205v-1l-2-1%202-1v-1h-6l-3%202-4%201-5%201-2%201-2%201-3%201-6%204c-3%203-4%204-5%203h-3c-2%203-1%204%205%2010%2033%2031%20136%2034%20179%205%2024-16%2019-39-12-54-9-4-19-7-19-5'%20fill='%23d3d3d3'%20fill-rule='evenodd'/%3e%3c/svg%3e","aspectRatio":2.474074074074074,"src":"/static/90283e46f6357d3a1064c610601642ce/741c1/featured-image.jpg","srcSet":"/static/90283e46f6357d3a1064c610601642ce/466a3/featured-image.jpg 334w,\n/static/90283e46f6357d3a1064c610601642ce/741c1/featured-image.jpg 604w","srcWebp":"/static/90283e46f6357d3a1064c610601642ce/e33b9/featured-image.webp","srcSetWebp":"/static/90283e46f6357d3a1064c610601642ce/cd98f/featured-image.webp 334w,\n/static/90283e46f6357d3a1064c610601642ce/e33b9/featured-image.webp 604w","sizes":"(max-width: 604px) 100vw, 604px"}}}}}},"pageContext":{"slug":"/write-jquery-plugin-with-coffeescript/","previous":{"fields":{"slug":"/event-report-of-cross-2013/"},"frontmatter":{"title":"イベントレポート：コウサ展に出展して思ったこと","tags":["コウサ展"]}},"next":{"fields":{"slug":"/write-post-with-markdown-without-plugin-beginner/"},"frontmatter":{"title":"プラグインを使わずにMarkdownでWordPressのブログを更新する（基礎編）","tags":["Markdown","Wordpress"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}