-
Notifications
You must be signed in to change notification settings - Fork 22
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Publicodes engine in web worker #375
Conversation
f19398b
to
bc89c28
Compare
Je suis actuellement confronté au problème de l'Engine dans une app Next : n'étant pas sérialisable, le serveur ne peut réhydrater le client avec l'engine en props. Peut-être que ton travaille résolverait ce problème ? Très intéressant en tout cas :) |
Si il y a moyen d'utiliser un web worker pendant le ssr ça pourrait peut être fonctionner, comme l'engine ne serait plus utiliser directement par l'app react alors il n'y aurait aucun souci de sérialisation j'imagine (à moins qu'il essaye de sérialiser le worker...). Ca m'a fait penser à autre chose, coté mon-entreprise on fait du prerendering simple de quelques page avec Mais il existe d'autres fonctions plus évolué pour faire du ssr ( |
J'ai réussi à faire notre prerender via Fonctionnement pendant le SSRActuellement Le problème c'est qu'on ne peut pas utiliser Le problème qui viens alors c'est qu'il faudrait une clé unique pour associer un Les futur version de react aiderons a mieux opti ça normalement, notamment le hooks Pour ce qui est du worker coté serveur, Node implémente leur propre version des worker, on est donc obligé d'utiliser une librarie ( |
React Async à l'air vraiment complexe, c'est cool que tu réussisses à avancer ! Question : est-ce que l'API asynchrone exposée permet de bien garder une UI toujours cohérente et pas une partie des valeurs calculées avec une situation, et une autre partie avec l'ancienne situation en attendant le calcul asynchrone ? J'imagine que c'est géré par une frontière unique |
Pour garder l'UI actualisé il y a un state Ensuite quand on l'utilise on le passe en dépendance de const workerEngine = useWorkerEngine()
const resultSmic = usePromise(
() => workerEngine.asyncEvaluate('SMIC'),
[workerEngine],
'loading...'
) Pour ce qui est de la cohérence je n'est rien fait qui empêcherais que des calculs soit avec une nouvelle situation et d'autre avec une précédente si il y a un calcul très long, mais dans ce cas on peut faire un state Il y a quand même une chose qui limite ce comportement sans que ça soit le but premier, pour optimiser un peu la vitesse entre le worker et le tread principal, le worker attend 50ms à partir de la première action demandé et ajoute toutes les actions pendant ce temps dans une file d'attente pour ensuite toutes les traiter d'un coup. Donc si il y a un long calcul dans un batch alors les autres action de se batch seront aussi impacter, ça limitera les différence dans l'UI je pense. L'autre opti c'est que si il y a un Il y a aussi d'autre amélioration qui sont possible, par exemple on pourrait mettre en cache coté thread principal toutes les Pour ce qui est de |
7f48993
to
136b8c1
Compare
Je ferme, voir compte rendu ici : betagouv/mon-entreprise#2744 |
Ajoute les packages
@publicodes/worker
et@publicodes/worker-react
@publicodes/worker
permet de créer unEngine
dans un web worker afin de ne plus bloquer le thread principale lors du chargement des règles et lors des calculs, il exportcreateWorkerEngine
etcreateWorkerEngineClient
, le premier wrap unEngine
afin de communiquer avec le second qui est le client, le client possède les même fonction qu'unEngine
mais sont asynchrone (ex:asyncEvaluate
ouasyncSetSituation
).@publicodes/worker-react
ajoute des hooks react qui s'actualise après unasyncSetSituation
. Il ajoute aussiusePromise
etuseLazyPromise
afin de simplifier l'utilisation des fonction asynchrone du client.publicodes-react
à été refacto pour qu'il accepte lesEngine
et les nouveauxWorkerEngine
créé par le client.Il y a deux méthodes pour convertir une App react qui utilise une
Engine
:@publicodes/worker-react
:useAsyncShallowCopy
,useAsyncSetSituation
,useAsyncGetRule
,useAsyncParsedRules
etuseWorkerEngine
pour faire du code plus complexe (asyncEvaluate
, etc.)createWorkerEngine
, les fonctions seront exécuté dans le worker avec l'Engine
directementcette PR est utilisé par betagouv/mon-entreprise#2744