Closed carlobeltrame closed 2 years ago
Learnings bisher:
flexGrow
funktioniert derzeit einwandfrei.Einige übliche Konsolenfehler während der Entwicklung, und wie man sie lösen kann:
xyz constructor: 'new' is required
-> ein Import von xyz vergessen (z.B. Text oder View müssen aus dem pdf
Import gefischt werden: const { View, Text } = pdf
)node.box is undefined
-> Irgendwo im Template ist Text der nicht in einem <Text>
Element gewrappt istnode.lines is undefined
-> Text wurde während dem Layouten falsch behandelt,style={{ ...myStyles, backgroundColor: 'red' }}
oder style={ myStyles }
.
Falsch: style={{ myStyles, backgroundColor: 'red' }}
Ich habe noch Activity Rendering implementiert: react-pdf.pdf
Nochmals zusammenfassend meine Notizen wie sich das Entwickeln angefühlt hat (ich plane, genau dasselbe auch noch mit Nuxt zu machen, um den direkten Vergleich zu haben):
debug={true}
setzen, dann wird auf das Rechteck drauf halbtransparent farbig eine Visualisierung von Margin, Padding und Inhalt und Mittelpunkt gerendert, und die Abmessungen des Rechtecks in pt hingeschrieben. Das ist immer wieder mal sehr nützlich, da man nicht einfach die Vue oder React Dev Tools aufmachen kann, weil die Komponenten nicht in ein DOM gerendert werden.textOverflow
. gap
in der Flexbox ist gar nicht unterstützt.pdf()
Funktion der React Hook usePdf
verwendet wirdIch habe hier noch ausprobiert, das PDF beim Download-Button in einem Web Worker (separater Thread) zu generieren, um bei grossen PDFs das UI nicht zu freezen. Nach einigem Gepröbel habe ichs hinbekommen.
Caveat: Für Vuex Daten und Übersetzungen können nicht mehr einfach $tc
und this.api
an React weitergegeben werden, weil der separate Thread nur via Promises mit dem Main Thread kommunizieren kann, aber man in React Komponenten nicht einfach Promises "awaiten" kann: Die Annahme ist, dass die Komponente auch wissen muss, wie "loading" State gerendert werden soll. Beim PDF Rendern wollen wir aber nicht zuerst im "loading" State rendern, sondern nur ein einziges Mal, und allfällige Daten müssen blockierend zusammengesucht werden.
Das bedeutet, dass wir vermutlich den Vuex State und die verfügbaren Translations als plain JS-Objekte "serialisiert" an den Worker Thread übertragen müssen, und dort eigene limitierte Instanzen von hal-json-vuex und vue-i18n laufen lassen müssen.
Ausserdem ist das Logging aus dem Worker Thread schlechter, und live reload habe ich noch nicht versucht einzurichten. Das machts also etwas schwieriger zum Probleme debuggen. Wenn wir diesen Weg gehen müssten wir vermutlich einen Kompromiss finden, sodass wir während der Entwicklung das PDF möglichst noch im Main Thread mit live reload etc. arbeiten können, aber später das definitive PDF im Background Thread generieren können.
Ich habe noch bisschen gemessen Stand 676a63c (mit mehr daten in der db, ohne web worker) Chromium: 01:17 Minuten für 127 Seiten. e5be6187-87c2-4533-b6d3-06e5b5216172.pdf
00:26 für 25 Seiten e12c3ac9-2e95-49df-a508-fd8c7b3eeb7c.pdf
Firefox: Mit Firefox kommt die preview gar nicht...