from pRegroup2020
2019-07-16
テキストのない付箋が表示されるところまでどうにか進んだ
canvasのresizeイベントもコメントアウトされて固定サイズになっている
ここら辺を順次戻して行って表示が元どおりになるようにする
それからまずは平行移動とズーム、次に付箋のドラッグでの移動を動かす
2019-08-02
pRegroupに書き連ねられたものの集合体:
In this section, we will create a React reconciler using react-reconciler package. We are going to implement the renderer using Fiber. Earlier, React was using a stack renderer as it was implemented on the traditional JavaScript stack. On the other hand, Fiber is influenced by algebraic effects and functional ideas. It can be thought of as a JavaScript object that contains information about a component, its input, and its output.
状態管理の刷新について理解の整理
本質的にこのアプリは「HTML5のCanvasにレンダリングするアプリ」である
直接Canvasに描画するのではなくPaper.jsを使っている(当たり判定などの丸投げのため)
React的状態が更新されたらPaper#Itemを全破棄して再生成している
その実装でPCのChrome上では問題なく動く
iPadのSafari、Chrome、PCのSafariでは付箋の枚数によらず「画像の貼られた付箋」に不愉快な点滅が発生する
おそらくPCのChromeだけ、Paper.jsより下のレイヤ(=ブラウザ)で画像のキャッシュをしている
iPadで快適に動くためには、Paper#itemが破棄されないようになる必要がある
それはつまり、React的状態が更新された時に、Paper.jsのレイヤーでは既存のオブジェクトの修正や移動で対処する必要がある
これはReactがDOMに対して行なっているのとほぼ同等の処理、それを担当するのはReconciler
自分でReconcilerを実装するか、既存の実装を利用する必要がある。実装したくないのでreact-paper-bindingsを使う
オブジェクトに一意なIDをつける
加えて、現状全体のstateがUNDO対象になっているが、UNDOは必要に応じてスナップショットをpushしていく形に変える
状態の代わりに関してはまずは一意なIDを持つようにしてreactがリストのレンダリングに使っているのと同じ仕組みでできないか試すべきだな、自前で差分レンダリングを作るのはなるべく避けたい
だけども最終的に出力されるものがpaper.jsの要素のリストだからDOM操作のメソッドは使えないので、そこをどうするのか
react-paper-bindingがどういう実装をしているか観察
オブジェクトが一意なIDを持つ必要がある、という点はReactの言葉ではKeyと言うらしい
https://github.com/nitin42/Making-a-custom-React-renderer/blob/master/part-one.md
react-paper-bindingを使うので良さそう
状態管理
設計の深いところに手を入れれば「画像付箋を100枚出してもちらつかない」って理想は実現できると思うが
問題の整理
若干モヤモヤするけど早すぎる最適化は諸悪の根源なので「全状態履歴を保持する実装」でまずは作る。
画像が1枚でも「iPad上では画像が0.5〜1秒遅れて描画される」って振る舞いなのでこの問題を解決するには極力描画済みのオブジェクトを使い回すような実装にしなきゃいけない
Paper.jsのオブジェクトのツリーをReactの仮想DOMみたいに扱う必要があるのか
共同編集できるようにしたい