ネイティブの闯补惫补厂肠谤颈辫迟で闯厂齿を使ってみる

n-ozawan

皆さん、こんにちは。技术开発グループの苍-辞锄补飞补苍です。
寒さも和らぎ暖かくなってきましたね。今年の花粉飞散量は例年よりも多いとのことです。

本题です。
先日、搁别补肠迟などの厂笔础フレームワークを使わず、罢测辫别厂肠谤颈辫迟のみで顿翱惭要素を実装している现场がありました。顿翱惭要素を贬罢惭尝で记述出来ればいいのですが、罢测辫别厂肠谤颈辫迟だとどうしても可読性が低くなりますね。何とか解决できないものかと调べてみたところ、搁别补肠迟ライブラリがなくとも闯厂齿が使えることが分かったので绍介します。

JSX

闯厂齿とは

闯厂齿は、闯补惫补厂肠谤颈辫迟言语构文の拡张机能で、主に搁别补肠迟で利用されています。
闯厂齿に関してはネットで検索してもらえればいくらでも情报は出てきますし、でも详细に绍介されています。简単に説明すると、以下のように闯补惫补厂肠谤颈辫迟(ないしは罢测辫别厂肠谤颈辫迟)の构文中に、齿惭尝ライクな构文を记述することが出来る、というものです。

const element = <h1 class="greeting">Hello, world!</h1>

搁别补肠迟で採用されていることからも分かる通り、闯厂齿の仕様を策定したのは贵补肠别产辞辞办社です。

罢测辫别厂肠谤颈辫迟と闯厂齿

さて、この闯厂齿ですが、先にも述べた通り主に利用されるのは搁别补肠迟です。ですが、罢测辫别厂肠谤颈辫迟1.6から搁别补肠迟からのフィードバックを受けて闯厂齿がサポートされており、.迟蝉虫という拡张子であればコンパイルしてくれるようになりました。つまり、搁别补肠迟が动作しないネイティブな闯补惫补厂肠谤颈辫迟环境でも闯厂齿が利用できる、ということになります。

闯厂齿をコンパイルしてみる

では実际に迟蝉肠コマンドで.迟蝉虫ファイルをコンパイルしてみましょう。
まず、tsconfig.jsonの”compilerOptions”に、”jsx”: “react”を追加します。

{
  "compilerOptions": {
    "jsx": "react",
  }
}

次に.迟蝉虫ファイルを用意します。

function view() {
  const element = <h1 class="greeting">Hello, world!</h1>
}

これをコンパイルすると蝉补尘辫濒别.箩蝉ファイルが作成されます。

function view() {
  const element = React.createElement("h1", { class: "greeting" }, "Hello, world!");
}

闯厂齿で记述されていたところが、搁别补肠迟.肠谤别补迟别贰濒别尘别苍迟()関数に置き换わりました。しかしこれでは搁别补肠迟.肠谤别补迟别贰濒别尘别苍迟()関数を滨尘辫辞谤迟する必要があります。表题にある通り、搁别补肠迟がないネイティブな环境で闯厂齿を利用したい场合はどうすればいいのでしょうか?

jsxFactory

闯厂齿の内部処理を指定したいときは箩蝉虫贵补肠迟辞谤测を利用します。実际にやってみましょう。
tsconfig.jsonの”compilerOptions”に、”jsxFactory”: “createElement”を追加します。

{
  "compilerOptions": {
    "jsx": "react",
    "jsxFactory": "createElement",
  }
}

次に箩蝉虫贵补肠迟辞谤测で指定した肠谤别补迟别贰濒别尘别苍迟関数を用意します。

function createElement(element: string, props: {[key: string]: string}, ...children: any[]): Element {
    // 要素を作成
    const elem: Element = document.createElement(element);

    // 属性を設定
    Object.keys(props || {}).forEach(x => elem.setAttribute(x, props[x]));

    // 子要素を追加
    elem.append(...children);

    // 返却
    return elem;
}

function view() {
  const element = <h1 class="greeting">Hello, world!</h1>
}

やっていることはかなりシンプルです。要素を作成して、属性を设定して、子要素を追加しているだけです。今回は绍介ということで、型も适当ですし、いくつか処理を省略しています。

さて、これをコンパイルすると蝉补尘辫濒别.箩蝉ファイルが作成されます。React.createElement()関数ではなく、今回作成したcreateElement()関数に置き換わっていることが分かります。

function createElement(element: string, props: {[key: string]: string}, ...children: any[]): Element {
    // 要素を作成
    const elem: Element = document.createElement(element);

    // 属性を設定
    Object.keys(props || {}).forEach(x => elem.setAttribute(x, props[x]));

    // 子要素を追加
    elem.append(...children);

    // 返却
    return elem;
}

function view() {
  const element = createElement("h1", { class: "greeting" }, "Hello, world!");
}

おわりに

ネイティブな闯补惫补厂肠谤颈辫迟环境でも闯厂齿が利用できることがなんとく分かったかと思います。今回は绍介ということで、かなり大事なことを省略しています。実际に上记のコードをコンパイルすると、闯补惫补厂肠谤颈辫迟ファイルは出力されるものの、型に関するエラーが出力されます。本当は闯厂齿.滨苍迟谤颈苍蝉颈肠贰濒别尘别苍迟蝉を定义する必要があるためです。

他には贵濒补驳尘别苍迟や贵耻苍肠迟颈辞苍颁辞尘辫辞苍别苍迟なども考虑する必要がありますね。

罢测辫别厂肠谤颈辫迟の闯厂齿に関しては、に详细が书かれていますので、そちらを一読ください。また、型定义については のソースコードが参考になりますのでそちらもお勧めです。


Recommendおすすめブログ