LoginSignup
46
47

More than 5 years have passed since last update.

vk - CoffeeScript DSLでVirtual DOM をテンプレーティングする

Last updated at Posted at 2014-09-02

vk は facebook/reactのvirtual DOM 用のテンプレートエンジンみたいなものです。

https://github.com/mizchi/vk

bower install mizchi/vk --save

まだbowerに上げてない。

JSXを使わずCoffeeScriptでReactの仮想DOMを記述するとこうなる。

React.createClass
  render: ->
    React.DOM.div {}, [
      React.DOM.h1 {}, "Hello"
      React.DOM.ul className: 'foobar-container', "bar"
        React.DOM.li {}, "foo"
        React.DOM.li {}, "bar"
      ]
    ]

vkを使うとこんなに短く、直感的に!

React.createClass
  render: -> vk (d) ->
    d.h1 'Hello'
    d.ul className: 'foobar-container', ->
      d.li "foo"
      d.li "bar"

ワ~スゴ~イ
実態はただのReactのラッパーです。

開発経緯

その昔、coffeekupというテンプレートエンジンがありまして、開発が止まってしまったのですが個人的には結構気に入ってたテンプレートエンジンでした。ただのDSLとしてDOMを生成する、という設計です。

mauricemach/coffeekup

で、reactはjsxというAltjs泣かせな独自シンタックスを持っていて、APIを直接叩いてもいいのですが、どうせなら、ラップしたい。Virtual DOM は DOMとJSが密結合することを厭わない設計思想で、今こそCoffeekup的なDSL設計が生きるのでは?と思い、さっくり移植しました。

コンセプト実装的なノリで作ったので、まだコンポーネントの埋め込みとかは細かいのは対応してないです。

JSXのつらさ

次のようなDOMを出力したいとします。

<div>
  <h1> Hello </h1>
  <ul class='foobar-container'>
    <li>foo</li>
    <li>bar</li>
  </ul>
</div>

この場合、reactのjsx記法を使うと、次のようになることでしょう

React.createClass({
  render: function(){
    return <div>
      <h1> Hello </h1>
      <ul class='foobar-container'>
        <li>foo</li>
        <li>bar</li>
      </ul>
    </div>
  }
});

jsxが使えないcoffee-script でベタに書くとこうなります。

React.createClass
  render: ->
    React.DOM.div {}, [
      React.DOM.h1 {}, "Hello"
      React.DOM.ul className: 'foobar-container', "bar"
        React.DOM.li {}, "foo"
        React.DOM.li {}, "bar"
      ]
    ]

明らかにだるい。
で、冒頭にvkならこうなるっていう話。

React.createClass
  render: -> vk (d) ->
    d.h1 'Hello'
    d.ul className: 'foobar-container', ->
      d.li "foo"
      d.li "bar"
46
47
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
46
47