David Larlet 3 місяці тому
джерело
коміт
0979223df2

+ 2
- 2
david/2021/03/03/index.html Переглянути файл

@@ -62,7 +62,7 @@
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs.svg#icon-home"></use>
</svg> Accueil</a>
• <a rel="next" href="/david/2021/03/04/" title="Publication suivante : HTML-over-WebSockets">Suivant →</a>
</p>
</nav>
<hr>
@@ -80,7 +80,7 @@
<p class="center">
<a rel="prev" href="/david/2021/03/02/" title="Publication précédente : Dépression">← Précédent</a> •
<a href="/david/2021/" title="Liste des publications récentes">↑ En 2021</a>
• <a rel="next" href="/david/2021/03/04/" title="Publication suivante : HTML-over-WebSockets">Suivant →</a>
</p>
</nav>
</article>

+ 184
- 0
david/2021/03/04/index.html Переглянути файл

@@ -0,0 +1,184 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the <title>
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>HTML-over-WebSockets — David Larlet</title>
<meta name="description" content="But this wasn’t terribly easy for many developers to grok at first. I sure didn’t. And the benefits weren’t exactly clear either. After years (decades, even) of wrapping our heads around the HTTP request cycle, to which all server-handled features must conform, adopting this WebSocket tech layer required a lot of head scratching. As with many clever new technologies or protocols, we needed a higher-level abstraction that provided something really effective for getting a new feature in front of a user, fast.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f0f0ea">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f0f0ea">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>HTML-over-WebSockets</h1>
</header>
<nav>
<p class="center">
<a rel="prev" href="/david/2021/03/03/" title="Publication précédente : Vivre avec">← Précédent</a> •
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs.svg#icon-home"></use>
</svg> Accueil</a>
</p>
</nav>
<hr>


<blockquote lang="en">
<p>But this wasn’t terribly easy for many developers to grok at first. I sure didn’t. And the benefits weren’t exactly clear either. After years (decades, even) of wrapping our heads around the HTTP request cycle, to which all server-handled features must conform, <mark>adopting this WebSocket tech layer required a lot of head scratching</mark>. As with many clever new technologies or protocols, we needed a higher-level abstraction that provided something really effective for getting a new feature in front of a user, fast.</p>
<p><cite><em><a href="https://alistapart.com/article/the-future-of-web-software-is-html-over-websockets/">The Future of Web Software Is HTML-over-WebSockets</a></em> (<a href="/david/cache/2021/a722bf15647dfe923d3c28b2e229098c/">cache</a>)</cite></p>
</blockquote>
<p>En ce moment, ça me gratte justement bien la tête. Je me retrouve <a href="https://benhoyt.com/writings/the-small-web-is-beautiful/">davantage dans cette approche</a> (<a href="/david/cache/2021/862d065d924906f327f8a95e23659295/">cache</a>) et j’ai presque du plaisir à utiliser <a href="https://stimulus.hotwire.dev/">Stimulus</a>, ça semble être le niveau de structuration et de non-abstraction dont j’ai besoin. J’ai aussi essayé <a href="https://turbo.hotwire.dev/">Turbo</a> mais je n’ai pas été assez loin pour voir les avantages décrits dans l’article (et c’est trop jeune pour mon niveau de confiance)&nbsp;: j’ai fini par recoder juste ce qu’il me fallait avec Stimulus.</p>
<p>J’apprécie le fait que ces ré-explorations donnent lieux à de nouvelles initiatives comme <a href="https://www.django-unicorn.com/">Django-Unicorn</a> ou <a href="https://sockpuppet.argpar.se/">Sockpuppet</a> pour ne citer que les déclinaisons dans l’écosystème Django. J’ai l’impression que c’est le compromis acceptable pour le vieux développeur que je suis&nbsp;: de la réactivité au niveau de l’interface pour les utilisateur·ices, de la logique et de la stabilité côté développement pour ma sénilité d’esprit.</p>
<p>Attention si vous partez sur des WebSockets, j’ai <a href="https://httptoolkit.tech/blog/http-wtf/">récemment appris</a> (<a href="/david/cache/2021/cbd2101777421fa7549472859210a69c/">cache</a>) que les restrictions de type <abbr title="Cross-Origin Resource Sharing">CORS</abbr> ne sont pas du tout respectées.</p>
<p>Note&nbsp;: je suis surpris qu’il n’y ait pas encore un projet intitulé <strong>RESTream</strong> dans le domaine 🙃🚎.</p>

<nav>
<p class="center">
<a rel="prev" href="/david/2021/03/03/" title="Publication précédente : Vivre avec">← Précédent</a> •
<a href="/david/2021/" title="Liste des publications récentes">↑ En 2021</a>
</p>
</nav>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs.svg#icon-rss2"></use>
</svg> RSS</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 2
- 0
david/2021/index.html Переглянути файл

@@ -182,6 +182,8 @@
<h2><a href="/david/2021/03/03/">Vivre avec</a> (2021-03-03)</h2>
<h2><a href="/david/2021/03/04/">HTML-over-WebSockets</a> (2021-03-04)</h2>
</main>



+ 13
- 0
david/2021/sources/2021-03-04 - HTML-over-WebSockets.md Переглянути файл

@@ -0,0 +1,13 @@
# HTML-over-WebSockets

> [en] But this wasn’t terribly easy for many developers to grok at first. I sure didn’t. And the benefits weren’t exactly clear either. After years (decades, even) of wrapping our heads around the HTTP request cycle, to which all server-handled features must conform, ==adopting this WebSocket tech layer required a lot of head scratching==. As with many clever new technologies or protocols, we needed a higher-level abstraction that provided something really effective for getting a new feature in front of a user, fast.
>
> <cite>*[The Future of Web Software Is HTML-over-WebSockets](https://alistapart.com/article/the-future-of-web-software-is-html-over-websockets/)* ([cache](/david/cache/2021/a722bf15647dfe923d3c28b2e229098c/))</cite>

En ce moment, ça me gratte justement bien la tête. Je me retrouve [davantage dans cette approche](https://benhoyt.com/writings/the-small-web-is-beautiful/) ([cache](/david/cache/2021/862d065d924906f327f8a95e23659295/)) et j’ai presque du plaisir à utiliser [Stimulus](https://stimulus.hotwire.dev/), ça semble être le niveau de structuration et de non-abstraction dont j’ai besoin. J’ai aussi essayé [Turbo](https://turbo.hotwire.dev/) mais je n’ai pas été assez loin pour voir les avantages décrits dans l’article (et c’est trop jeune pour mon niveau de confiance) : j’ai fini par recoder juste ce qu’il me fallait avec Stimulus.

J’apprécie le fait que ces ré-explorations donnent lieux à de nouvelles initiatives comme [Django-Unicorn](https://www.django-unicorn.com/) ou [Sockpuppet](https://sockpuppet.argpar.se/) pour ne citer que les déclinaisons dans l’écosystème Django. J’ai l’impression que c’est le compromis acceptable pour le vieux développeur que je suis : de la réactivité au niveau de l’interface pour les utilisateur·ices, de la logique et de la stabilité côté développement pour ma sénilité d’esprit.

Attention si vous partez sur des WebSockets, j’ai [récemment appris](https://httptoolkit.tech/blog/http-wtf/) ([cache](/david/cache/2021/cbd2101777421fa7549472859210a69c/)) que les restrictions de type <abbr title="Cross-Origin Resource Sharing">CORS</abbr> ne sont pas du tout respectées.

Note : je suis surpris qu’il n’y ait pas encore un projet intitulé **RESTream** dans le domaine 🙃🚎.

+ 2
- 0
david/index.html Переглянути файл

@@ -74,6 +74,8 @@
<nav>
<ul>
<li><a href="/david/2021/03/04/">HTML-over-WebSockets</a> (2021-03-04)</li>
<li><a href="/david/2021/03/03/">Vivre avec</a> (2021-03-03)</li>
<li><a href="/david/2021/03/02/">Dépression</a> (2021-03-02)</li>

+ 19
- 1
david/log/index.xml Переглянути файл

@@ -5,13 +5,31 @@
<link href="https://larlet.fr/david/" rel="alternate" type="text/html" />
<link href="https://larlet.fr/david/log/" rel="self" />
<id>https://larlet.fr/david/</id>
<updated>2021-03-10T12:00:00+01:00</updated>
<updated>2021-03-11T12:00:00+01:00</updated>
<author>
<name>David Larlet</name>
<uri>https://larlet.fr/david/</uri>
</author>
<rights>Copyright (c) 2004-2021, David Larlet</rights>
<entry xml:lang="fr">
<title>HTML-over-WebSockets</title>
<link href="https://larlet.fr/david/2021/03/04/" rel="alternate" type="text/html" />
<updated>2021-03-04T12:00:00+01:00</updated>
<id>https://larlet.fr/david/2021/03/04/</id>
<summary type="html">

&lt;blockquote lang=&quot;en&quot;&gt;
&lt;p&gt;But this wasn’t terribly easy for many developers to grok at first. I sure didn’t. And the benefits weren’t exactly clear either. After years (decades, even) of wrapping our heads around the HTTP request cycle, to which all server-handled features must conform, &lt;mark&gt;adopting this WebSocket tech layer required a lot of head scratching&lt;/mark&gt;. As with many clever new technologies or protocols, we needed a higher-level abstraction that provided something really effective for getting a new feature in front of a user, fast.&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;em&gt;&lt;a href=&quot;https://alistapart.com/article/the-future-of-web-software-is-html-over-websockets/&quot;&gt;The Future of Web Software Is HTML-over-WebSockets&lt;/a&gt;&lt;/em&gt; (&lt;a href=&quot;https://larlet.fr/david/cache/2021/a722bf15647dfe923d3c28b2e229098c/&quot;&gt;cache&lt;/a&gt;)&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;En ce moment, ça me gratte justement bien la tête. Je me retrouve &lt;a href=&quot;https://benhoyt.com/writings/the-small-web-is-beautiful/&quot;&gt;davantage dans cette approche&lt;/a&gt; (&lt;a href=&quot;https://larlet.fr/david/cache/2021/862d065d924906f327f8a95e23659295/&quot;&gt;cache&lt;/a&gt;) et j’ai presque du plaisir à utiliser &lt;a href=&quot;https://stimulus.hotwire.dev/&quot;&gt;Stimulus&lt;/a&gt;, ça semble être le niveau de structuration et de non-abstraction dont j’ai besoin. J’ai aussi essayé &lt;a href=&quot;https://turbo.hotwire.dev/&quot;&gt;Turbo&lt;/a&gt; mais je n’ai pas été assez loin pour voir les avantages décrits dans l’article (et c’est trop jeune pour mon niveau de confiance)&amp;nbsp;: j’ai fini par recoder juste ce qu’il me fallait avec Stimulus.&lt;/p&gt;
&lt;p&gt;J’apprécie le fait que ces ré-explorations donnent lieux à de nouvelles initiatives comme &lt;a href=&quot;https://www.django-unicorn.com/&quot;&gt;Django-Unicorn&lt;/a&gt; ou &lt;a href=&quot;https://sockpuppet.argpar.se/&quot;&gt;Sockpuppet&lt;/a&gt; pour ne citer que les déclinaisons dans l’écosystème Django. J’ai l’impression que c’est le compromis acceptable pour le vieux développeur que je suis&amp;nbsp;: de la réactivité au niveau de l’interface pour les utilisateur·ices, de la logique et de la stabilité côté développement pour ma sénilité d’esprit.&lt;/p&gt;
&lt;p&gt;Attention si vous partez sur des WebSockets, j’ai &lt;a href=&quot;https://httptoolkit.tech/blog/http-wtf/&quot;&gt;récemment appris&lt;/a&gt; (&lt;a href=&quot;https://larlet.fr/david/cache/2021/cbd2101777421fa7549472859210a69c/&quot;&gt;cache&lt;/a&gt;) que les restrictions de type &lt;abbr title=&quot;Cross-Origin Resource Sharing&quot;&gt;CORS&lt;/abbr&gt; ne sont pas du tout respectées.&lt;/p&gt;
&lt;p&gt;Note&amp;nbsp;: je suis surpris qu’il n’y ait pas encore un projet intitulé &lt;strong&gt;RESTream&lt;/strong&gt; dans le domaine 🙃🚎.&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Vivre avec</title>
<link href="https://larlet.fr/david/2021/03/03/" rel="alternate" type="text/html" />

Завантаження…
Відмінити
Зберегти