{"id":98,"date":"2026-09-27T02:02:32","date_gmt":"2026-09-27T00:02:32","guid":{"rendered":"https:\/\/libreduc.cc\/blog\/?p=98"},"modified":"2026-09-27T02:02:58","modified_gmt":"2026-09-27T00:02:58","slug":"ucblockly-ce-quest-et-nest-pas-le-noyau","status":"publish","type":"post","link":"https:\/\/libreduc.cc\/blog\/?p=98","title":{"rendered":"\u00b5cBlockly : ce qu\u2019est (et n\u2019est pas) ce noyau"},"content":{"rendered":"<p>Dans l\u2019article pr\u00e9c\u00e9dent \u2014 \u00ab\u00a0Pourquoi un noyau : naissance de \u00b5cBlockly\u00a0\u00bb (<a href=\"https:\/\/libreduc.cc\/blog\/?p=81\">https:\/\/libreduc.cc\/blog\/?p=81<\/a>) \u2014 on a vu <em>pourquoi<\/em> s\u00e9parer le moteur des applications. Ici, on fixe le vocabulaire : <strong>ce qu\u2019est \u00b5cBlockly<\/strong>, et surtout <strong>ce qu\u2019il n\u2019est pas<\/strong> \u2014 pour \u00e9viter de confondre le noyau avec BlocklyDuino, la d\u00e9mo, ou \u00ab un autre Blockly pour Arduino \u00bb.<\/p>\n<h2 style=\"text-align: left;\">Trois niveaux, une seule pile<\/h2>\n<figure style=\"margin: 1.5rem 0; max-width: 36rem; font-family: system-ui,Segoe UI,sans-serif;\">\n<div style=\"border: 2px solid #1a6b6b; border-radius: 12px; padding: 1rem 1.25rem; background: linear-gradient(135deg, #e8f5f4, #f7fbfb); text-align: center;\">\n<div style=\"font-size: 0.75rem; font-weight: bold; letter-spacing: 0.04em; color: #1a6b6b; text-transform: uppercase;\">Niveau 1<\/div>\n<div style=\"font-size: 1.2rem; font-weight: bold; color: #0f3d3d; margin-top: 0.2rem;\">Blockly 13<\/div>\n<div style=\"color: #3d5a5a; margin-top: 0.25rem;\">moteur visuel g\u00e9n\u00e9rique<\/div>\n<\/div>\n<div style=\"text-align: center; font-size: 1.5rem; line-height: 1.4; color: #1a6b6b;\" aria-hidden=\"true\">\u2193<\/div>\n<div style=\"border: 2px solid #1e4d8c; border-radius: 12px; padding: 1rem 1.25rem; background: linear-gradient(135deg, #e8f0fa, #f5f8fc); text-align: center;\">\n<div style=\"font-size: 0.75rem; font-weight: bold; letter-spacing: 0.04em; color: #1e4d8c; text-transform: uppercase;\">Niveau 2 \u2014 noyau<\/div>\n<div style=\"font-size: 1.2rem; font-weight: bold; color: #12305c; margin-top: 0.2rem;\">\u00b5cBlockly<\/div>\n<div style=\"color: #3d4f66; margin-top: 0.25rem;\">blocs Arduino typ\u00e9s + g\u00e9n\u00e9rateur C++ + API<\/div>\n<\/div>\n<div style=\"text-align: center; font-size: 1.5rem; line-height: 1.4; color: #b05a1a;\" aria-hidden=\"true\">\u2193<\/div>\n<div style=\"border: 2px solid #b05a1a; border-radius: 12px; padding: 1rem 1.25rem; background: linear-gradient(135deg, #faf0e6, #fcf8f3); text-align: center;\">\n<div style=\"font-size: 0.75rem; font-weight: bold; letter-spacing: 0.04em; color: #b05a1a; text-transform: uppercase;\">Niveau 3 \u2014 produits<\/div>\n<div style=\"font-size: 1.2rem; font-weight: bold; color: #6b3410; margin-top: 0.2rem;\">Produits d\u00e9riv\u00e9s<\/div>\n<div style=\"color: #6b5340; margin-top: 0.25rem;\">BlocklyDuino \u00b7 Factory \u00b7 d\u00e9mo \u00b7 vos applis<\/div>\n<\/div><figcaption style=\"margin-top: 0.75rem; font-size: 0.9rem; color: #555;\">Pile Blockly \u2192 \u00b5cBlockly \u2192 produits : une seule base, plusieurs peaux.<\/figcaption><\/figure>\n<ul>\n<li><strong>Blockly<\/strong> \u2014 workspace, toolbox, s\u00e9rialisation, plugins @blockly. Rien de sp\u00e9cifique Arduino ici.<\/li>\n<li><strong>\u00b5cBlockly<\/strong> \u2014 ce qui est commun et r\u00e9utilisable pour programmer des microcontr\u00f4leurs en blocs : typage des variables, g\u00e9n\u00e9rateurs C++ (Arduino) et Python, contr\u00f4le des structures \/ connexions, instances d&rsquo;objets, point d\u2019entr\u00e9e d\u2019int\u00e9gration.<\/li>\n<li><strong>Produits<\/strong> \u2014 l\u2019exp\u00e9rience m\u00e9tier : barre d\u2019outils, choix de carte \u00ab produit \u00bb, Monaco, compilation web, sc\u00e9narios d&rsquo;utilisation en classe possibles.<\/li>\n<\/ul>\n<p>Si vous ne retenez qu\u2019une phrase : <em>BlocklyDuino n\u2019est pas le noyau ; il s\u2019appuie dessus.<\/em> Idem pour la Factory (ben oui l\u00e0 aussi il y a du boulot et \u00e7a sera un super truc indispensable pour cr\u00e9er ses blocs !!!) et pour la d\u00e9mo du d\u00e9p\u00f4t (<span style=\"font-size: 8pt;\">et puis aussi un autre truc pour remplacer Studio4Education, mais plus tard&#8230;<\/span>).<\/p>\n<h2>Ce qu\u2019est le noyau<\/h2>\n<p>Le noyau, c\u2019est la surface publique document\u00e9e dans KERNEL (wiki) qui permet de :<\/p>\n<ul>\n<li>injecter un workspace Blockly \u00ab Arduino-ready \u00bb dans une page ;<\/li>\n<li>g\u00e9n\u00e9rer du C++ Arduino \u00e0 partir des blocs ;<\/li>\n<li>enregistrer blocs, types et plugins de fa\u00e7on idempotente ;<\/li>\n<li>sauver \/ recharger un workspace, changer de langue, redimensionner, disposer proprement, etc.<\/li>\n<\/ul>\n<p>Point d\u2019entr\u00e9e principal :<\/p>\n<pre>import { createUcBlockly } from '\u00b5cBlockly\/core';\r\n\r\nconst uc = createUcBlockly(document.getElementById('editor'), {\r\n  language: 'fr',\r\n  \/\/ toolbox, th\u00e8me, enforceurs, plugins, onCodeChange\u2026\r\n});\r\n\r\nconsole.log(uc.getCode());<\/pre>\n<p><code>createUcBlockly(container, options)<\/code> renvoie une instance (<code>workspace<\/code>, <code>getCode()<\/code>, <code>saveWorkspace()<\/code> \/ <code>loadWorkspace()<\/code>, <code>resize()<\/code>, <code>dispose()<\/code>\u2026). Pour un host plus avanc\u00e9, il existe aussi un gestionnaire de cycle de vie (<code>UcBlocklyWorkspaceManager<\/code>) sans coller le shell de la d\u00e9mo.<\/p>\n<p>Il y a aussi une couche <strong>h\u00f4te<\/strong> (<code>\u00b5cBlockly\/host<\/code>) : aides d\u2019interface r\u00e9utilisables (th\u00e8mes, accessibilit\u00e9, \u00e9diteur de code\u2026). Ce n\u2019est pas \u00ab le produit BlocklyDuino \u00bb, mais ce n\u2019est pas non plus le strict minimum du g\u00e9n\u00e9rateur : utile quand on construit une appli, sans forcer la coque p\u00e9dagogique compl\u00e8te.<\/p>\n<h2>Ce que le noyau n\u2019est pas<\/h2>\n<ul>\n<li><strong>Pas BlocklyDuino<\/strong> \u2014 BlocklyDuino v3 (<em>publication bient\u00f4t<\/em>&#8230;) est l\u2019application pour la classe (cartes AVR filtr\u00e9es, UI, compile \/ Web Serial, r\u00e9glages produit).<\/li>\n<li><strong>Pas la Factory<\/strong> \u2014 le cr\u00e9ateur de blocs \/ packs d\u2019extension est un outil \u00e0 part, qui consomme le m\u00eame \u00e9cosyst\u00e8me.<\/li>\n<li><strong>Pas la d\u00e9mo du d\u00e9p\u00f4t<\/strong> \u2014 menus, panneaux, session : pratique pour tester, pas un contrat d\u2019API.<\/li>\n<li><strong>Pas un fork p\u00e9dagogique \u00ab tout-en-un \u00bb<\/strong> \u2014 on refuse de remettre Monaco, la topbar m\u00e9tier ou des getElementById de shell dans src\/core.<\/li>\n<li><strong>Pas Blockly 12<\/strong> \u2014 la v3 est sur Blockly 13 ; les projets en 12 restent sur \u00b5cBlockly 2.x.<\/li>\n<\/ul>\n<p>Autrement dit : si une fonctionnalit\u00e9 n\u2019a de sens que pour <em>une<\/em> appli (une marque de carte, un parcours de cours, un bouton \u00ab t\u00e9l\u00e9verser \u00bb), elle appartient au produit, pas au noyau.<\/p>\n<h2>Licence, code, doc<\/h2>\n<ul>\n<li><strong>Licence<\/strong> \u2014 AGPL-3.0-or-later (copyleft y compris pour une version modifi\u00e9e propos\u00e9e en service r\u00e9seau).<\/li>\n<li><strong>Code<\/strong> \u2014 <a href=\"https:\/\/github.com\/A-S-T-U-C-E\/ucBlockly\">https:\/\/github.com\/A-S-T-U-C-E\/ucBlockly<\/a><\/li>\n<li><strong>Doc noyau<\/strong> \u2014 <a href=\"https:\/\/wiki.libreduc.cc\/\">wiki LibrEduc<\/a> (page \u00b5cBlockly \/ KERNEL) et fichiers docs\/KERNEL.md, INTEGRATION_DEPOT.md dans le d\u00e9p\u00f4t.<\/li>\n<li><strong>Forum<\/strong> \u2014 <a href=\"https:\/\/forum.libreduc.cc\/\">https:\/\/forum.libreduc.cc\/<\/a> pour l\u2019entraide technique et p\u00e9dagogique du r\u00e9seau.<\/li>\n<\/ul>\n<p>Les composants Blockly (Google \/ Apache-2.0) restent clairement attribu\u00e9s ; le travail \u00b5cBlockly \/ produits LibrEduc sont sous AGPL.<\/p>\n<h2>Pour qui, concr\u00e8tement ?<\/h2>\n<ul>\n<li><strong>Enseignant\u00b7e \/ formateur\u00b7rice<\/strong> \u2014 vous utiliserez surtout un <em>produit<\/em> (BlocklyDuino, etc.). Cet article sert \u00e0 comprendre pourquoi les mises \u00e0 jour du \u00ab moteur \u00bb et de l\u2019UI ne sont plus le m\u00eame chantier.<\/li>\n<li><strong>D\u00e9veloppeur\u00b7euse \/ int\u00e9grateur\u00b7rice<\/strong> \u2014 commencez par createUcBlockly + KERNEL ; n\u2019importez la d\u00e9mo que comme exemple, pas comme d\u00e9pendance.<\/li>\n<li><strong>Contributeur\u00b7rice<\/strong> \u2014 patch noyau dans \u00b5cBlockly ; patch produit dans le d\u00e9p\u00f4t du produit. <em>\u00c9viter les PR du style \u00ab j\u2019ai coll\u00e9 ma barre d\u2019outils dans le core \u00bb<\/em>.<\/li>\n<\/ul>\n<pre><em><a href=\"https:\/\/libreduc.cc\/blog\/wp-content\/uploads\/2026\/09\/Image-002.png\"><img fetchpriority=\"high\" decoding=\"async\" class=\"aligncenter wp-image-105 size-full\" src=\"https:\/\/libreduc.cc\/blog\/wp-content\/uploads\/2026\/09\/Image-002.png\" alt=\"\" width=\"1303\" height=\"806\" srcset=\"https:\/\/libreduc.cc\/blog\/wp-content\/uploads\/2026\/09\/Image-002.png 1303w, https:\/\/libreduc.cc\/blog\/wp-content\/uploads\/2026\/09\/Image-002-300x186.png 300w, https:\/\/libreduc.cc\/blog\/wp-content\/uploads\/2026\/09\/Image-002-1024x633.png 1024w, https:\/\/libreduc.cc\/blog\/wp-content\/uploads\/2026\/09\/Image-002-768x475.png 768w, https:\/\/libreduc.cc\/blog\/wp-content\/uploads\/2026\/09\/Image-002-100x62.png 100w, https:\/\/libreduc.cc\/blog\/wp-content\/uploads\/2026\/09\/Image-002-150x93.png 150w, https:\/\/libreduc.cc\/blog\/wp-content\/uploads\/2026\/09\/Image-002-200x124.png 200w, https:\/\/libreduc.cc\/blog\/wp-content\/uploads\/2026\/09\/Image-002-450x278.png 450w, https:\/\/libreduc.cc\/blog\/wp-content\/uploads\/2026\/09\/Image-002-600x371.png 600w, https:\/\/libreduc.cc\/blog\/wp-content\/uploads\/2026\/09\/Image-002-900x557.png 900w\" sizes=\"(max-width: 1303px) 100vw, 1303px\" \/><\/a>\r\nBient\u00f4t la suite...<\/em><\/pre>\n<p><em>R\u00e9seau LibrEduc \u2014 comprendre pour ne pas d\u00e9pendre, partager pour progresser.<\/em><span hidden class=\"__iawmlf-post-loop-links\" data-iawmlf-links=\"[{&quot;id&quot;:3,&quot;href&quot;:&quot;https:\\\/\\\/github.com\\\/A-S-T-U-C-E\\\/ucBlockly&quot;,&quot;archived_href&quot;:&quot;&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[],&quot;broken&quot;:false,&quot;last_checked&quot;:null,&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:12,&quot;href&quot;:&quot;https:\\\/\\\/wiki.libreduc.cc&quot;,&quot;archived_href&quot;:&quot;&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[],&quot;broken&quot;:false,&quot;last_checked&quot;:null,&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:6,&quot;href&quot;:&quot;https:\\\/\\\/forum.libreduc.cc&quot;,&quot;archived_href&quot;:&quot;&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[],&quot;broken&quot;:false,&quot;last_checked&quot;:null,&quot;process&quot;:&quot;done&quot;}]\"><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>D\u00e9finition du noyau \u00b5cBlockly : les trois niveaux Blockly \u2192 \u00b5cBlockly \u2192 produits, l\u2019API createUcBlockly(), ce\u2026<\/p>\n<p class=\"read-more\"><a class=\"more-link\" href=\"https:\/\/libreduc.cc\/blog\/?p=98\">Read more \u2192<\/a><\/p>\n<p><!-- end of .read-more --><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[6,7],"tags":[],"class_list":["post-98","post","type-post","status-publish","format-standard","hentry","category-blockly","category-cblockly"],"_links":{"self":[{"href":"https:\/\/libreduc.cc\/blog\/index.php?rest_route=\/wp\/v2\/posts\/98","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/libreduc.cc\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/libreduc.cc\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/libreduc.cc\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/libreduc.cc\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=98"}],"version-history":[{"count":6,"href":"https:\/\/libreduc.cc\/blog\/index.php?rest_route=\/wp\/v2\/posts\/98\/revisions"}],"predecessor-version":[{"id":107,"href":"https:\/\/libreduc.cc\/blog\/index.php?rest_route=\/wp\/v2\/posts\/98\/revisions\/107"}],"wp:attachment":[{"href":"https:\/\/libreduc.cc\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=98"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/libreduc.cc\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=98"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/libreduc.cc\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=98"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}