クロスブラウザでカスタムタグを定義できる x-tag というライブラリが話題だったので試してみました。

インストール

xtag は npm で簡単にインストールできます。ほかにビルド用の Browserify と babelify もインストールしておきます。

$ npm install -g browserify
$ npm install -D babelify babel-preset-es2015
$ npm install -S x-tag

Hello, World!

まずは Hello World から。

import xtag from 'x-tag';

xtag.register('x-hello', {
    content: 'Hello, <strong>World</strong>!'
});

xtag.register はカスタムタグを登録するメソッドです。タグの名前と情報を渡します。 content に書かれた HTML がカスタム要素の中に展開されます。

$ browserify -t babelify -o bundle.js a.js

HTML からこの JavaScript を読み込み <x-hello> タグを書き込めば Hello, World! と表示されます。

<!DOCTYPE html>
<meta charset="utf-8">
<script src="bundle.js"></script>
<x-hello></x-hello>

ちなみに <x-hello /> のように書くと子要素に関する挙動がおかしくなるようです。

ライフサイクルとかメソッドとか

もう少し複雑な例を試してみます。 jQuery とも特に問題なく組み合わせられるので使ってみます。

import xtag from 'x-tag';
import $ from 'jquery';

xtag.register('x-clock', {
    content: `<span class="time"></span>`,
    lifecycle: {
        created() {
            this.update();
            setInterval(this.update.bind(this), 1000);
        }
    },
    methods: {
        update() {
            const time = new Date().toLocaleTimeString();
            $(this).find('.time').text(time);
        }
    }
});

この <x-clock> タグを使用すると現在時刻が表示されます。

lifecycle は要素が作成、挿入、削除などされた時に呼び出されるメソッドを指定します。 created は文字通りタグが作成された時に呼び出されます。

methods はタグのメソッドを指定します。ここに指定したメソッドは外部からも触ることができます。この例だと document.querySelector('x-clock').update() のように使うことが可能です。

おわりに

軽く x-tag を試してみました。他にも DOM にプロパティを生やしたりイベントを監視したりもできるようです。

Polymer や Angular の用にごてごてしていないので気軽に使えそうです。 jQuery とも組み合わせられるので既存の jQuery プラグインなんかをカスタムタグにしたりがやりやすいかもしれません。

反面、複雑な機能はないのである程度の規模なら最初から他のフレームワークなどを使っておくのが良さそうです。