123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548 |
- <!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,minimum-scale=1,initial-scale=1,shrink-to-fit=no">
- <!-- Required to make a valid HTML5 document. -->
- <title>Coquilles vides — David Larlet</title>
- <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
- <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons/apple-touch-icon.png">
- <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons/favicon-32x32.png">
- <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons/favicon-16x16.png">
- <link rel="manifest" href="/manifest.json">
- <link rel="mask-icon" href="/static/david/icons/safari-pinned-tab.svg" color="#5bbad5">
- <link rel="shortcut icon" href="/static/david/icons/favicon.ico">
- <meta name="apple-mobile-web-app-title" content="David Larlet">
- <meta name="application-name" content="David Larlet">
- <meta name="msapplication-TileColor" content="#da532c">
- <meta name="msapplication-config" content="/static/david/icons/browserconfig.xml">
- <meta name="theme-color" content="#f0f0ea">
- <!-- That good ol' feed, subscribe :p. -->
- <link rel=alternate type="application/atom+xml" title=Feed href="/david/log/">
-
- <!-- Canonical URL for SEO purposes -->
- <link rel="canonical" href="https://larlet.fr/david/stream/2018/02/24/">
-
- <style>
- /* http://meyerweb.com/eric/tools/css/reset/ */
- html, body, div, span,
- h1, h2, h3, h4, h5, h6, p, blockquote, pre,
- a, abbr, address, big, cite, code,
- del, dfn, em, img, ins,
- small, strike, strong, tt, var,
- dl, dt, dd, ol, ul, li,
- fieldset, form, label, legend,
- table, caption, tbody, tfoot, thead, tr, th, td,
- article, aside, canvas, details, embed,
- figure, figcaption, footer, header, hgroup,
- menu, nav, output, ruby, section, summary,
- time, mark, audio, video {
- margin: 0;
- padding: 0;
- border: 0;
- font-size: 100%;
- font: inherit;
- vertical-align: baseline;
- }
- /* HTML5 display-role reset for older browsers */
- article, aside, details, figcaption, figure,
- footer, header, hgroup, menu, nav, section { display: block; }
- body { line-height: 1; }
- blockquote, q { quotes: none; }
- blockquote:before, blockquote:after,
- q:before, q:after {
- content: '';
- content: none;
- }
- table {
- border-collapse: collapse;
- border-spacing: 0;
- }
-
- /* http://practicaltypography.com/equity.html */
- /* https://calendar.perfplanet.com/2016/no-font-face-bulletproof-syntax/ */
- /* https://www.filamentgroup.com/lab/js-web-fonts.html */
- @font-face {
- font-family: 'EquityTextB';
- src: url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff2') format('woff2'),
- url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff') format('woff');
- font-weight: 300;
- font-style: normal;
- font-display: swap;
- }
- @font-face {
- font-family: 'EquityTextB';
- src: url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff2') format('woff2'),
- url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff') format('woff');
- font-weight: 300;
- font-style: italic;
- font-display: swap;
- }
- @font-face {
- font-family: 'EquityTextB';
- src: url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff2') format('woff2'),
- url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff') format('woff');
- font-weight: 700;
- font-style: normal;
- font-display: swap;
- }
- @font-face {
- font-family: 'TriplicateT4c';
- src: url('/static/david/css/fonts/Triplicate-T4-Code-Regular-webfont.woff2') format('woff2'),
- url('/static/david/css/fonts/Triplicate-T4-Code-Regular-webfont.woff') format('woff');
- font-weight: 300;
- font-style: normal;
- font-display: swap;
- }
-
- /* http://practice.typekit.com/lesson/caring-about-opentype-features/ */
- body {
- /* http://www.cssfontstack.com/ Palatino 99% Win 86% Mac */
- font-family: "EquityTextB", Palatino, serif;
- background-color: #f0f0ea;
- color: #07486c;
- font-kerning: normal;
- -moz-osx-font-smoothing: grayscale;
- -webkit-font-smoothing: subpixel-antialiased;
- text-rendering: optimizeLegibility;
- font-variant-ligatures: common-ligatures contextual;
- font-feature-settings: "kern", "liga", "clig", "calt";
- }
- pre, code, kbd, samp, var, tt {
- font-family: 'TriplicateT4c', monospace;
- }
- em {
- font-style: italic;
- color: #323a45;
- }
- strong {
- font-weight: bold;
- color: black;
- }
- nav {
- background-color: #323a45;
- color: #f0f0ea;
- display: flex;
- justify-content: space-around;
- padding: 1rem .5rem;
- }
- nav:first-child {
- border-top: 1vh solid #2d7474;
- }
- nav:last-child {
- border-bottom: 1vh solid #2d7474;
- }
- nav a {
- color: #f0f0ea;
- }
- nav abbr {
- border-bottom: 1px dotted white;
- }
-
- h1 {
- border-bottom: .2vh solid #2d7474;
- background-color: #e3e1e1;
- color: #323a45;
- text-align: center;
- padding: 2rem 0 1rem;
- width: 100%;
- }
- h2 {
- margin: 4rem 0 1rem;
- border-top: .2vh solid #2d7474;
- }
- h3 {
- text-align: center;
- margin: 3rem 0 .75em;
- }
- hr {
- height: .4rem;
- width: .4rem;
- border-radius: .4rem;
- background: #07486c;
- margin: 2.5rem auto;
- }
- time {
- display: bloc;
- background-color: #2d7474;
- color: #e3e1e1;
- padding: .29rem 1rem;
- float: right;
- }
- ul, ol {
- margin: 2rem;
- }
- ul {
- list-style-type: square;
- }
- a {
- text-decoration-skip-ink: auto;
- }
- article {
- max-width: 50rem;
- display: flex;
- flex-direction: column;
- margin: 3rem auto 1rem auto;
- }
- article p:last-child {
- margin-bottom: 1rem;
- }
- p {
- padding: 0 .5rem;
- }
- p + p {
- margin-top: 2rem;
- }
-
- blockquote {
- background-color: #e3e1e1;
- border-left: .5vw solid #2d7474;
- display: flex;
- flex-direction: column;
- align-items: center;
- padding: 1rem;
- margin: 1.5rem;
- }
- blockquote cite {
- font-style: italic;
- }
-
- figure {
- border-top: .2vh solid #2d7474;
- background-color: #e3e1e1;
- text-align: center;
- padding: 1.5rem 0;
- margin: 1rem 0 0;
- font-size: 1.5rem;
- width: 100%;
- }
- figure img {
- width: 250px;
- height: 250px;
- border: .5vw solid #323a45;
- padding: 1px;
- }
- figcaption {
- padding: 1rem;
- line-height: 1.4;
- }
- aside {
- display: flex;
- flex-direction: column;
- background-color: #e3e1e1;
- padding: 1rem 0;
- border-bottom: .2vh solid #07486c;
- }
- aside p {
- max-width: 50rem;
- margin: 0 auto;
- }
-
- /* https://fvsch.com/code/css-locks/ */
- p, li, pre, code, kbd, samp, var, tt, time {
- font-size: .95rem;
- line-height: calc( 1.5em + 0.2 * 1rem );
- }
- h1 {
- font-size: 1.7rem;
- line-height: calc( 1.2em + 0.2 * 1rem );
- }
- h2 {
- font-size: 1.6rem;
- line-height: calc( 1.3em + 0.2 * 1rem );
- }
- h3 {
- font-size: 1.35rem;
- line-height: calc( 1.4em + 0.2 * 1rem );
- }
- @media (min-width: 20em) {
- /* The (100vw - 20rem) / (50 - 20) part
- resolves to 0-1rem, depending on the
- viewport width (between 20em and 50em). */
- p, li, pre, code, kbd, samp, var, tt, time {
- font-size: calc( .95rem + .6 * (100vw - 20rem) / (50 - 20) );
- line-height: calc( 1.5em + 0.2 * (100vw - 50rem) / (20 - 50) );
- }
- h1 {
- font-size: calc( 1.7rem + 1.5 * (100vw - 20rem) / (50 - 20) );
- line-height: calc( 1.2em + 0.2 * (100vw - 50rem) / (20 - 50) );
- }
- h2 {
- font-size: calc( 1.5rem + 1.5 * (100vw - 20rem) / (50 - 20) );
- line-height: calc( 1.3em + 0.2 * (100vw - 50rem) / (20 - 50) );
- }
- h3 {
- font-size: calc( 1.35rem + 1.5 * (100vw - 20rem) / (50 - 20) );
- line-height: calc( 1.4em + 0.2 * (100vw - 50rem) / (20 - 50) );
- }
- }
- @media (min-width: 50em) {
- /* The right part of the addition *must* be a
- rem value. In this example we *could* change
- the whole declaration to font-size:2.5rem,
- but if our baseline value was not expressed
- in rem we would have to use calc. */
- p, li, pre, code, kbd, samp, var, tt, time {
- font-size: calc( .95rem + .6 * 1rem );
- line-height: 1.5em;
- }
- h1 {
- font-size: calc( 1.7rem + 1.5 * 1rem );
- line-height: 1.2em;
- }
- h2 {
- font-size: calc( 1.5rem + 1.5 * 1rem );
- line-height: 1.3em;
- }
- h3 {
- font-size: calc( 1.35rem + 1.5 * 1rem );
- line-height: 1.4em;
- }
- figure img {
- width: 500px;
- height: 500px;
- }
- blockquote {
- margin-left: -1.5rem;
- }
- }
-
- figure.unsquared {
- margin-bottom: 1.5rem;
- }
- figure.unsquared img {
- height: inherit;
- }
-
- /* https://github.com/richleland/pygments-css */
- .codehilite{
- background-color: #fdf6e3;
- margin: 1rem auto;
- padding: 1rem;
- overflow-x:auto;
- box-shadow:inset 0 0 2px rgba(0,0,0,0.2)
- }
- .codehilite .t{color:#586e75}
- .codehilite .w{color:#073642}
- .codehilite .err{color:#cb4b16}
- .codehilite .k{color:#859900}
- .codehilite .kc{color:#2aa198}
- .codehilite .kd{color:#268bd2}
- .codehilite .kn{color:#b58900}
- .codehilite .kp{color:#859900}
- .codehilite .kr{color:#073642}
- .codehilite .kt{color:#b58900}
- .codehilite .n{color:#586e75}
- .codehilite .na{color:#2aa198}
- .codehilite .nb{color:#268bd2}
- .codehilite .nc{color:#268bd2}
- .codehilite .ne{color:#cb4b16}
- .codehilite .no{color:#2aa198}
- .codehilite .nd{color:#2aa198}
- .codehilite .ni{color:#2aa198;font-weight:bold}
- .codehilite .nf{color:#268bd2}
- .codehilite .nn{color:#586e75}
- .codehilite .nt{color:#2aa198;font-weight:bold}
- .codehilite .nv{color:#cb4b16}
- .codehilite .b{color:#859900}
- .codehilite .bp{color:#586e75}
- .codehilite .v{color:#586e75}
- .codehilite .vc{color:#586e75}
- .codehilite .vg{color:#268bd2}
- .codehilite .vi{color:#268bd2}
- .codehilite .m{color:#268bd2}
- .codehilite .mf{color:#268bd2}
- .codehilite .mh{color:#268bd2}
- .codehilite .mi{color:#268bd2}
- .codehilite .mo{color:#268bd2}
- .codehilite .s{color:#2aa198}
- .codehilite .sb{color:#2aa198}
- .codehilite .sc{color:#2aa198}
- .codehilite .sd{color:#2aa198}
- .codehilite .s2{color:#2aa198}
- .codehilite .se{color:#cb4b16}
- .codehilite .sh{color:#2aa198}
- .codehilite .si{color:#cb4b16}
- .codehilite .sx{color:#2aa198}
- .codehilite .sr{color:#cb4b16}
- .codehilite .s1{color:#2aa198}
- .codehilite .ss{color:#cb4b16}
- .codehilite .il{color:#268bd2}
- .codehilite .o{color:#586e75}
- .codehilite .ow{color:#859900}
- .codehilite .p{color:#586e75}
- .codehilite .c{color:#93a1a1;font-style:italic}
- .codehilite .cm{color:#93a1a1}
- .codehilite .cp{color:#93a1a1}
- .codehilite .c1{color:#93a1a1}
- .codehilite .cs{color:#93a1a1}
- .codehilite .hll{background-color:#dc322f}
- .codehilite .g{color:#586e75}
- .codehilite .gd{color:#586e75}
- .codehilite .ge{font-style:italic}
- .codehilite .gr{color:#586e75}
- .codehilite .gh{color:#586e75;font-weight:bold}
- .codehilite .gi{color:#586e75}
- .codehilite .go{color:#586e75}
- .codehilite .gp{color:#586e75}
- .codehilite .gs{font-weight:bold}
- .codehilite .gu{color:#586e75;font-weight:bold}
- .codehilite .gt{color:#586e75}
-
- @media print {
- body { font-size: 100%; }
- a:after { content: " (" attr(href) ")"; }
- a, a:link, a:visited, a:after {
- text-decoration: underline;
- text-shadow: none !important;
- background-image: none !important;
- background: white;
- color: black;
- }
- abbr[title] { border-bottom: 0; }
- abbr[title]:after { content: " (" attr(title) ")"; }
- img { page-break-inside: avoid; }
- @page { margin: 2cm .5cm; }
- h1, h2, h3 { page-break-after: avoid; }
- p3 { orphans: 3; widows: 3; }
- img {
- max-width: 250px !important;
- max-height: 250px !important;
- }
- nav, aside { display: none; }
- }
-
- /* Dark theme */
- [lang=en] body {
- background: #323a45;
- }
- [lang=en] article,
- [lang=en] article em,
- [lang=en] article strong {
- color: #f0f0ea;
- }
- [lang=en] article a {
- color: #ffbd2b;
- }
- [lang=en] article a:visited {
- color: #ff6b03;
- }
- [lang=en] blockquote,
- [lang=en] figure {
- background: #111930;
- color: #ccc;
- }
- </style>
- <nav>
- <p>
- <a href="/david/" title="Profil public">David Larlet</a> partage ses <a href="/david/blog/" title="Expériences bienveillantes">réflexions</a> et sa <a href="/david/stream/2019/" title="Pensées (dés)articulées">veille hebdomadaire</a>.
- </p>
- </nav>
-
- <h1>Coquilles vides</h1>
- <time>2018-02-24</time>
- <article>
- <blockquote>
- <p>JAMStack est un véritable changement de paradigme. Le site Web servi au visiteur devient plus que jamais une coquille dans lequel des services, qu’ils soient auto-hébergés ou tiers, sont dynamiquement injectés. Il est même possible de s’appuyer sur plusieurs services pour un seul objectif et passer de l’un à l’autre en cas d’indisponibilité ou pour maximiser la performance.</p>
- <p><cite><em><a href="https://borisschapira.com//2018/02/site-statique-performance-web/">Meilleure UX, meilleures performances : la nouvelle donne du web statique</a></em> (<a href="/david/cache/ff210758520a85e3e8d4102ef925b6ea/">cache</a>)</cite></p>
- </blockquote>
- <p>Ou comment en venir à complexifier une HTMLStack qui marche depuis 30 ans. Servir une page web avec du contenu est un tel changement de paradigme que même des projets comme <a href="https://the-pastry-box-project.net/">The Pastry Box Project</a> se vautrent lamentablement et n’arrivent pas à afficher du contenu lorsqu’on bloque une ressource distante…</p>
- <p>Si vous partez sur JavaScript et des API, essayez au moins d’afficher le contenu pertinent lorsque ces dépendances sont cassées pour <a href="/david/blog/2017/without-javascript/">tout un tas de raisons valables</a>. Que votre MISStack m’affiche plus vite une page blanche m’importe peu (relisez cette phrase en anglais j’ai la flemme de tout réécrire juste pour la blague).</p>
- </article>
-
-
- <nav>
- <p>
- <a rel=prev href="/david/stream/2018/02/23/">← Improving quality</a> | <a href="/david/stream/2018/" title="Retour à la liste complète">↑</a> | <a rel=next href="/david/stream/2018/02/25/">Github and money →</a>
- </p>
- </nav>
-
-
-
-
- <aside>
- <p>
- Articles choisis :
- <a href="/david/blog/2018/commodite-effondrement/" title="Accéder à l’article complet">Commodité et effondrement</a>,
- <a href="/david/blog/2017/donnees-communs/" title="Accéder à l’article complet">Des données aux communs</a>,
- <a href="/david/blog/2016/accompagner-enfant/" title="Accéder à l’article complet">Accompagner un enfant</a>,
- <a href="/david/blog/2016/senior-developer/" title="Accéder à l’article complet">Senior developer</a>,
- <a href="/david/blog/2016/illusion-sociale/" title="Accéder à l’article complet">L’illusion sociale</a>,
- <a href="/david/blog/2016/instantane-scopyleft/" title="Accéder à l’article complet">Instantané Scopyleft</a>,
- <a href="/david/blog/2016/enseigner-web/" title="Accéder à l’article complet">Enseigner le Web</a>,
- <a href="/david/blog/2016/simplicite-defaut/" title="Accéder à l’article complet">Simplicité par défaut</a>,
- <a href="/david/blog/2016/minimalisme-esthetique/" title="Accéder à l’article complet">Minimalisme et esthétique</a>,
- <a href="/david/blog/2015/travail-transition/" title="Accéder à l’article complet">Travail en transition</a>,
- <a href="/david/blog/2015/pairmutation-travail/" title="Accéder à l’article complet">La pairmutation du travail</a>,
- <a href="/david/blog/2015/principes-web/" title="Accéder à l’article complet">Principes Web</a>,
- <a href="/david/blog/2015/travail-transition/" title="Accéder à l’article complet">Travail en transition</a>,
- <a href="/david/blog/2014/un-web-omni-present/" title="Accéder à l’article complet">Un web omni-présent</a>,
- <a href="/david/blog/2014/manifeste-developpeur/" title="Accéder à l’article complet">Manifeste de développeur</a>,
- <a href="/david/blog/2013/confort-convivialite/" title="Accéder à l’article complet">Confort et convivialité</a>,
- <a href="/david/blog/2013/testament-numerique/" title="Accéder à l’article complet">Testament numérique</a>,
- et <a href="/david/blog/" title="Accéder aux archives">bien d’autres…</a>
- </p>
- </aside>
-
-
-
- <nav>
- <p>
- <abbr title="Lieu de vie et de potentielles rencontres actuel">Montréal</abbr> ·
- <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">Contact</a> ·
- <a href="http://larlet.com" title="Identité professionnelle">[Travailler ensemble ?]</a> ·
- <abbr title="Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33.184162340">Hébergeur</abbr> ·
- <a href="/david/log/" title="S’abonner aux publications via RSS">Flux</a>
- </p>
- </nav>
-
- <script>
- /* Service workers */
- if (navigator.serviceWorker) {
- window.addEventListener('load', function () {
- var selector = 'a[href^="/david/cache/"], a[rel=prev], a[rel=next]'
- function sendLinks (selector) {
- var links = [].slice.call(document.querySelectorAll(selector)).map(function (link) {
- return link.getAttribute('href')
- })
- links.push(location.pathname) // Put the current page in cache too.
- navigator.serviceWorker.controller.postMessage({ links: links })
- }
- navigator.serviceWorker.getRegistration()
- .then(function (registration) {
- if (!registration || !navigator.serviceWorker.controller) {
- return navigator.serviceWorker.register('/serviceworker.js')
- .then(navigator.serviceWorker.ready)
- .then(function () {
- console.log('[ServiceWorker] Ready to go!')
- })
- .catch(console.error.bind(console))
- } else {
- console.log('[ServiceWorker] Send links via registration')
- sendLinks(selector)
- }
- })
- navigator.serviceWorker.addEventListener('controllerchange', function () {
- console.log('[ServiceWorker] Send links via controller change')
- sendLinks(selector)
- })
- navigator.serviceWorker.addEventListener('message', function (event) {
- var link = document.querySelector('a[href="' + event.data.link + '"]')
- if (event.data.status && link) {
- link.style.backgroundColor = '#2d7474'
- link.style.color = '#f0f0ea'
-
- link.setAttribute('title', 'En cache pour consultation sans connexion')
-
- }
- })
- })
- } else {
- console.warn('[ServiceWorker] No cache for old browsers.')
- }
- </script>
|