Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JSXでつくる宣言的UIなプレゼンテーション / jsx-presentation

mottox2
December 07, 2019

JSXでつくる宣言的UIなプレゼンテーション / jsx-presentation

JSXでつくる宣言的UI ~PowerPointプレゼンテーションを宣言的な記述でつくる~ at WeJS Fes

* jsx-presentation-starter
* https://github.com/kobit-develop/jsx-presentation-starter

mottox2

December 07, 2019
Tweet

More Decks by mottox2

Other Decks in Programming

Transcript

  1. #wejs Office Open XML(OOXML) MS OfficeのファイルはXMLで構築されている _rels .rels [Content_Type].xml ppt

    slides presentation.xml slide1.xml themes theme1.xml slide1.xml.rels _rels Zip圧縮
  2. #wejs 課題へのアプローチ 1 どういう⾒た⽬なのか想像しずらい 2 座標の指定が難しい ‣ Webの世界で起こった「命令的」→「宣⾔的」の流れに乗っかる ‣ ただしViewが状態を持つことはないので、Webの世界ほどメリットはない

    const div = document.createElement('div') div.className = 'hoge' div.innerText = 'Hello World’ const wrapper = document.getElementById('app') wrapper.append(div) const app = () => ( <div className=‘hoge'> Hello World </div> ) const wrapper = document.getElementById('app') ReactDOM.render(app, wrapper) 命令的 宣⾔的
  3. #wejs 課題へのアプローチ Web以外でReactを利⽤している例 ‣ ReactNative (For Native App) ‣ React360

    (For VR) ‣ Ink (For CUI) ‣ React-PDF (For PDF) ‣ React Sketch.app (For Sketch) Appendix
  4. #wejs ‣ width, height, top, leftといった座標や⼤きさを計算してくれる。 width: 300, height: 300

    node: Yoga.Node top: 0 / left: 0 width: 300 / height: 200 top: 200 / left: 0 width: 300 / height: 100 node.calculateLayout() flexGrow: 1 height: 100 課題へのアプローチ Yogaを⽤いたレイアウト計算 childNode1: Yoga.Node childNode2: Yoga.Node
  5. #wejs 課題へのアプローチ ‣ 2019年のJSXらしいアプローチを取りたかった =>TSX ‣ VSCode as Service ‣

    TypeScriptを採⽤し型による補完/補助が効くように ‣ JSDocも利⽤し簡単な説明が表⽰されるように One More Thing
  6. #wejs JSXを利⽤したXMLの⽣成 ‣ react-test-rendererを利⽤することで扱いやすいオブジェクトに変換できる react-test-renderer JSX Object <Slide> <Text fontSize={24}

    height={10}> Page Title </Text> <Table flexGrow={1}> {/* ུ */} </Table> </Slide> { "type": "slide", "props": {}, "children": [ { "type": "text", "props": { "fontSize": 24, "height": 10 }, "children": [ "Page Title" ] }, { "type": "table", "props": { "flexGrow": 1 }, "children": [] } ] } testRenderer.create(jsx).toJSON()
  7. #wejs Yogaを⽤いたレイアウト計算 ‣ ⼀部レイアウト指定が必要だが、いい感じに計算してもらう ‣ 後はいいかんじにXMLを⽣成すればOK { "type": "slide", "props":

    {}, "layout": { "width": 60, "height": 50 }, "children": [ { "type": "text", "props": { "fontSize": 24, "height": 10 }, "layout": { "top": 0, "height": 10, “width": 60 }, "children": [ "Page Title" ] }, { "type": "table", "props": { "flexGrow": 1 }, "layout": { "top": 10, "height": 40, "width": 60 }, "children": [] } ] } { "type": "slide", "props": {}, "children": [ { "type": "text", "props": { "fontSize": 24, "height": 10 }, "children": [ "Page Title" ] }, { "type": "table", "props": { "flexGrow": 1 }, "children": [] } ] } Object Object
  8. #wejs データの流れ ‣ JSXを段階的に加⼯して最終的なXMLを得る ‣ 中間状態を持つことでテストが書きやすい JSX Object with computed

    layout Object XML(PowerPoint) ユーザーが⼊⼒したJSXを受け取る JSXをコード中で扱いやすいObjectに変換する Yogaによって位置・サイズ情報が付与されたオブジェクト Objectをもとに対応するXMLを当てたもの
  9. #wejs Starter Templateの⽤意 ‣ Babel + React + TypeScriptの環境が必要なのでセットアップ難易度が⾼い。 ‣

    作るだけでは使われないので、セットアップ済みのテンプレートを⽤意した。 ‣ 社内的に便利なCSVがそのままテーブルになるパターンなどを⽤意してある。
  10. #wejs 困ったこと・困っていること ‣ react-domで名前空間付きのタグをrenderしようとすると警告が出る。 ‣ ⾃作して対応した。 mottox2/react2xml ‣ APIの設計思想が不⼗分。 ‣

    PowerPointの経験を想定したAPI or HTMLライクに書きたいAPI ‣ Fill or backgroundColor ‣ Simple or Easyの話 ‣ 他のReact-XXX事例を⾒る限りSimpleに寄せると思う。
  11. #wejs 現状と今後の課題 OSSとして ‣ まだExperimentalなプロジェクト。 ‣ API設計の思想を固める。 ‣ 今のところ、異常系の動作を無視している。 ‣

    設計を⾒直す必要がある。 ‣ 名前が⻑いので、短くかっこいい名前がほしい。 ‣ v0.1がリリースしたらツイートします。よろしく。
  12. #wejs 現状と今後の課題 会社のプロダクトとして ‣ 本ライブラリを⽤いた MVP作成を試しているところ ‣ かなり開発者体験がよくなった ‣ 難しいレイアウトや要素はライブラリ側が未対応

    ‣ 今後の⽅針 ‣ Production投⼊を⽬指す ‣ 最終的にはLambdaで動く関数として動作させたい ‣ これが達成されればサービスの進化が早くなるはず
  13. #wejs お気持ち ‣ JavaScriptの世界は広がっている。 ‣ Web以外のフォーマットに取り組むのも⾯⽩い。 ‣ JavaScriptらしいアプローチで取り組みたい。 ‣ JSXの応⽤は⾊々できそう。MDXあたりを使ったなにかの到来を期待している。

    ‣ パラダイムシフトを別の分野で適⽤できないか考える。 ‣ ライブラリ・フレームワーク作者の気持ちが理解できる。 ‣ すぐに役にたたないものを作るのは楽しい。 ‣ Keynote派の⾃分が、LT資料制作に使い始めたら勝利です。 ‣ Productionに⼊ったらどこかでLTしたい。
  14. #wejs 詳しく知りたい⼈のためのリンク集 ‣ スライド: 宣⾔的UI @sonatard (builderscon Tokyo 2019) ‣

    https://speakerdeck.com/sonatard/xuan-yan-de-ui ‣ 宣⾔的UIについてまとまったスライド ‣ 書籍: Office Open XMLフォーマットガイド (技術の泉シリーズ) ‣ https://www.amazon.co.jp/gp/product/B07ZJ4ZZZB ‣ Web上で情報が得にくいOOXMLについて書かれた本 Appendix