From 83280f37dd66f83fef40fb4daf4d8782b3f1a47b Mon Sep 17 00:00:00 2001 From: Morris Brodersen Date: Tue, 27 Aug 2024 00:04:32 +0200 Subject: [PATCH] link to vanilla prime --- README.md | 87 ++++++++++++++++++++++++------------------ assets/lighthouse.png | Bin 13965 -> 0 bytes 2 files changed, 50 insertions(+), 37 deletions(-) delete mode 100644 assets/lighthouse.png diff --git a/README.md b/README.md index e237804..d17d08c 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,10 @@ there are only a few [critical areas](#523-the-bad) where a vanilla approach is clearly inferior. _While the first version of the case study has been published in 2020, it has -received significant [updates](#9-changelog) over time._ +received significant [updates](#9-changelog) over time. Also, further work is +being done with **[Vanilla Prime](https://github.com/morris/vanilla-prime)**, a +practical guide to (almost) vanilla web development based on insights from this +case study._ _Intermediate understanding of the web platform is required to follow through._ @@ -649,9 +652,7 @@ _To be fair, my implementation misses quite a few features from the original. I suspect a fully equivalent clone to be well below 100 KB transfer, though._ While there is still optimization potential, the -[Lighthouse](https://developer.chrome.com/docs/lighthouse) score is perfect: - -Perfect Lighthouse Score +[Lighthouse](https://developer.chrome.com/docs/lighthouse) score is perfect. ### 5.2. Code Quality @@ -826,15 +827,18 @@ explored in the future: - Run another case study with TypeScript, SCSS, and build steps (seems promising). + - _See [Vanilla Prime](https://github.com/morris/vanilla-prime)._ - Extrapolate deep utility functions (e.g. `reconcile()`) to mitigate some of the discovered downsides. + - _See [exdom](https://github.com/morris/exdom)._ - Experiment with architectures based on virtual DOM rendering and standard DOM events. - Compile discovered rules, patterns and techniques into a comprehensive guide. + - _See [Vanilla Prime](https://github.com/morris/vanilla-prime)._ Case studies constrained by a set of formal rules are an effective way to find new patterns and techniques in a wide range of domains. I'd love to see similar -experiments in the future. +experiments in the future ## 8. Appendix @@ -867,6 +871,10 @@ Useful VSCode extensions: ### 8.2. Response +#### 12/2023 + +- [Lobsters](https://lobste.rs/s/jofho9/case_study_on_vanilla_web_development) + #### 10/2020 - Trending on [Hacker News](https://news.ycombinator.com/item?id=24893247) @@ -879,70 +887,75 @@ Thanks! ## 9. Changelog +### 08/2024 + +- Link to [Vanilla Prime](https://github.com/morris/vanilla-prime) +- Link to [exdom](https://github.com/morris/exdom) +- Update dependencies + ### 06/2024 - Use [s4d](https://github.com/morris/s4d) as local development server -- Run pipeline checks for pull requests (#13) -- Move past items to today when not done (#14) +- Run pipeline checks for pull requests + ([#13](https://github.com/morris/vanilla-todo/issues/13)) +- Move past items to today when not done + ([#14](https://github.com/morris/vanilla-todo/issues/14)) - Update dependencies ### 01/2024 - Add [web app manifest](https://developer.mozilla.org/en-US/docs/Web/Manifest) -- Correctly combine [code coverage](#431-code-coverage) from end-to-end and unit - tests +- Fix merged [code coverage](#431-code-coverage) from end-to-end and unit tests - Remove FPS counter ### 12/2023 -- Added [debugging section](#45-debugging) -- Redesigned with CSS variables -- Added GitHub action for running checks and deployment -- Edited closing section -- Updated numbers +- Add [debugging section](#45-debugging) +- Redesign with CSS variables +- Add GitHub action for running checks and deployment +- Edit closing section +- Update numbers ### 11/2023 -- Added [tooling section](#4-tooling) -- Refactored business logic into pure functional module -- Added support for [code coverage](#431-code-coverage) -- Added [local development server](#41-local-development-server) with hot - reloading -- Fixed some visual issues -- Updated dependencies +- Add [tooling section](#4-tooling) +- Refactor business logic into pure functional module +- Add support for [code coverage](#431-code-coverage) +- Add [local development server](#41-local-development-server) with live reload +- Fix some visual issues +- Update dependencies ### 05/2023 -- Added basic testing -- Fixed stylelint errors -- Updated dependencies +- Add basic testing +- Fix stylelint errors +- Update dependencies ### 08/2022 -- Small improvements -- Fixed date seeking bug on Safari +- Fix date seeking bug on Safari ### 05/2022 -- Refactored for ES2020 -- Refactored for event-driven communication exclusively -- Moved original ES5-based version of the study to [/es5](./es5) -- Added assessment regarding library development -- Added date picker +- Refactor for ES2020 +- Refactor for event-driven communication exclusively +- Move original ES5-based version of the study to [/es5](./es5) +- Add assessment regarding library development +- Add date picker ### 01/2021 -- Added [response section](#82-response) +- Add [response section](#82-response) ### 10/2020 -- Refactored for `dataset` [#2](https://github.com/morris/vanilla-todo/issues/2) +- Refactor for `dataset` ([#2](https://github.com/morris/vanilla-todo/issues/2)) — [@opethrocks](https://github.com/opethrocks) -- Fixed [#3](https://github.com/morris/vanilla-todo/issues/3) (navigation bug) +- Fix [#3](https://github.com/morris/vanilla-todo/issues/3) (navigation bug) — [@anchepiece](https://github.com/anchepiece), [@jcoussard](https://github.com/jcoussard) -- Fixed [#4](https://github.com/morris/vanilla-todo/issues/4) (double item +- Fix [#4](https://github.com/morris/vanilla-todo/issues/4) (double item creation) — [@n0nick](https://github.com/n0nick) -- Fixed [#1](https://github.com/morris/vanilla-todo/issues/4) (bad links) - — [@roryokane](https://github.com/roryokane) +- Fix [#1](https://github.com/morris/vanilla-todo/issues/4) (bad links) — + [@roryokane](https://github.com/roryokane) - Initial version diff --git a/assets/lighthouse.png b/assets/lighthouse.png deleted file mode 100644 index 9b642a4b02d5dc2a59e6bca33e72aee5591fcdad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13965 zcmeHuRal(Q(kIT~gZnT*f@>gHut9?pJVFQSsY9XOauf39J$w0Y6u93vG8;v01f_q z9Jgc+&v<7oDXA(aDG65n;AmlO2hU=PvyT;fEn!U56Jr6OCBh#CnvJX&8FPl#RcdRj zfD={ihYPG%GGi{^1?#ESU`36ZNPaPWBOs+<3*;q|21+>xDD?07=oU@3>L12*w^3jO7iHofRA1uqqPU{)5V0p}Znz61C6!Yu{rGC*co3!RB zaigq?EygMREREx+I(ynLyKO_Uz9W%-eY?2U%$H&0gLH%EbZDrM$m-3V(Z^SvH_@Mj zQ82kGqlv~U8>qACVj-Vf{Ha_bJ5{uRvF>@(?ILzI*OErxFkOgJb<;p;`$)+3O7`mr z+e?VioWT}WVnag39M1L<)|Hl++b#76{4^^ZNVVDa?MZgcTEFjKt+X6tAY@tihA~8u z!U5MZ*O9YOQbJ&XrvV6vq1Ff}@Dw8ap@2UK2*{tI2_XvzoHj&~edGQWP?EwC6B3b2KsM@UVA!B0&)L z5P~P|&0UPa9`<$)&O#m{bbo6I!P8IKoOIy7Ra|UE=ya4+!IF+2%)xvdTpV0Ik^P|1v$B1aK3oK4zI!P?CIcQ z?7{BfO#d$?|HVhj+}ZSlwUdjrqXYPfud#`vtBVL7-IJjI{`~7b%{{FDEy=<8pJu@u z$oW*l$<4vV`QNhe}&U+I1) z%62sSvzj#4MpoR8SNc2BYtA=9xjSc2jY27F z@>B$`f!KBQFS1B~S`;0BvcM?%e>hblth)chq63J;CXU_N8}~07c)jCSPom%wjR1%w zV5rgB>wl!PiC>tr2;5*#EG#vmk34hcu+8F_Yzi%7~ulEuC zAKuusKzk-FfOK)C=2-D>>YD97w7Iu#{+I(1g)36{)NGt2VpI{^4P}8Tz4@OEF<(X~ z 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 HFbe!1gZiR)