Depuis plusieurs versions, tout composant JavaScript écrit pour Odoo repose sur Owl, le framework maison. La version 3 d'Owl est en cours d'intégration dans la branche master qui alimente la ligne Odoo 20, et elle modifie des conventions de base que vos modules utilisent sans même y penser. Si vous maintenez des composants frontend custom, c'est du travail manuel qui vous attend, pas une conversion entièrement automatique.
Passons aux points qui touchent directement le code existant.
this.props n'existe plus par défaut
En Owl 2, un composant disposait automatiquement de this.props. En Owl 3, cet accès implicite disparaît. Il faut déclarer explicitement les props via une fonction props() dans le composant 1. Concrètement, une ligne du type props = props() devient nécessaire, et le typage passe en argument de cette même fonction.
Les propriétés statiques static props et static defaultProps suivent le même sort. Le typage et les valeurs par défaut passent désormais en arguments :
props = props({
name: t.string,
"visible?": t.boolean,
}, { leaveDuration: 100 });
Le second argument porte les valeurs par défaut. La couche de compatibilité interdit les anciennes déclarations statiques, donc un module qui s'y appuie ne démarre pas tel quel.
onWillUpdateProps est retiré
Le hook onWillUpdateProps servait à réagir quand les props changeaient. Owl 3 le supprime 2. À la place, on dérive un état avec computed(), ou on réagit avec un effet.
Le cœur d'Odoo a déjà engagé ce chantier. La PR #279617, fusionnée le 21 septembre 2026 sur la branche master et visant la 20.1, remplace onWillUpdateProps par useOnChange avec l'option initialRun: false, pour ne déclencher l'effet que sur un changement réel et pas au montage du composant 3. C'est le genre de détail qui compte en pratique : un effet qui s'exécute une fois de trop au montage, et vous introduisez un bug difficile à reproduire.
Les t-ref par chaîne de caractères disparaissent
Avant, on posait une référence avec useRef("name") côté JS et t-ref="name" côté template. Owl 3 abandonne les identifiants de template sous forme de chaîne. On passe par un signal :
div = signal(null);
// template : <div t-ref="this.div">
L'accès se fait ensuite via this.div() au lieu de .el. Les signaux deviennent les primitives de réactivité, avec signal() pour l'état mutable et computed() pour les valeurs dérivées qui suivent automatiquement leurs dépendances.
Un script de migration, mais partiel
Odoo fournit un script pour la partie mécanique 1. Sa première phase remplace les t-ref par t-custom-ref, préfixe les variables libres par this., convertit les t-esc en t-out et insère les déclarations props = props() dans les composants. C'est utile, mais la logique de réactivité reste à votre charge. Un onWillUpdateProps qui faisait plus qu'une simple comparaison demande une relecture humaine.
Où en est réellement le chantier
Il faut rester précis sur l'état d'avancement. Le jalon Owl 3.0 sur GitHub affiche 47 % d'avancement, avec 9 tickets ouverts et 8 fermés, dernière mise à jour le 4 août 2026 2. Le travail porte un label owl-3 et couvre aussi le retrait des rendus profonds, la révision de la syntaxe t-att et une réflexion sur t-call. Odoo 20 est sorti le 24 septembre 2026 4. La bascule vers Owl 3 s'étale donc sur la ligne 20.x plutôt que sur un instant unique, et certaines API peuvent encore bouger avant d'être figées.
La direction est confirmée par les PR du cœur et par le jalon public. Le détail exact de l'API finale, lui, reste mouvant. Figer aujourd'hui du code sur une signature non stabilisée vous expose à une seconde réécriture dans quelques mois.
Notre lecture
Pour un studio qui maintient des modules Odoo, le signal à retenir tient en une phrase : tout composant frontend custom va demander une passe manuelle, et le script officiel ne couvre que le squelette. Nous recommandons un inventaire dès maintenant, qui liste les composants utilisant onWillUpdateProps, ceux qui lisent this.props en direct, et ceux qui posent des t-ref par chaîne. Ce sont les points qui cassent de façon certaine.
Ensuite, séparez ce qui est mécanique, comme les préfixes this. ou le passage de t-esc à t-out, de ce qui demande du jugement, comme la logique de réactivité. Le premier lot passe au script, le second se planifie. Tant que le jalon Owl 3 n'est pas clos, nous gardons les réécritures de réactivité pour la fin, quand l'API sera stable. Pour le chiffrage global d'une migration côté JavaScript, nous avions déjà posé les ordres de grandeur dans notre analyse du coût réel d'une migration Odoo 19.
Sources
- Owl 3 migration guide (gist de ged-odoo, Odoo) : https://gist.github.com/ged-odoo/0599d7cd9710428eaf97ea5b0e71f589
- GitHub, odoo/owl, jalon Version 3.0 (label owl-3) : https://github.com/odoo/owl/milestone/3
- GitHub, odoo/odoo, PR #279617 « replace onWillUpdateProps with owl3 alternatives » : https://github.com/odoo/odoo/pull/279617
- Odoo 20 publié le 24 septembre 2026 : https://www.maifelz.com/blog/odoo-20-latest-features-release-guide
Footnotes
-
Guide de migration Owl 3 rédigé par ged-odoo (Géry Debongnie, Odoo), détaillant le passage de
this.propsà la fonctionprops(), le remplacement dest-refpar chaîne et les phases du script de migration. ↩ ↩2 -
Jalon « Version 3.0 » du dépôt odoo/owl sur GitHub : 47 % d'avancement, 9 tickets ouverts et 8 fermés, dernière mise à jour le 4 août 2026, retrait de
onWillUpdatePropset des identifiants de template par chaîne. ↩ ↩2 -
Pull request #279617 du dépôt odoo/odoo, fusionnée le 21 septembre 2026 sur la branche master pour la 20.1, remplaçant
onWillUpdatePropsparuseOnChangeavecinitialRun: false. ↩ -
Date de sortie d'Odoo 20, annoncée au 24 septembre 2026 par la presse spécialisée Odoo. ↩