aboutsummaryrefslogtreecommitdiff
path: root/public/my-love-and-hate-relationship-with-nodejs.html
diff options
context:
space:
mode:
Diffstat (limited to 'public/my-love-and-hate-relationship-with-nodejs.html')
-rwxr-xr-xpublic/my-love-and-hate-relationship-with-nodejs.html110
1 files changed, 0 insertions, 110 deletions
diff --git a/public/my-love-and-hate-relationship-with-nodejs.html b/public/my-love-and-hate-relationship-with-nodejs.html
deleted file mode 100755
index c22bad6..0000000
--- a/public/my-love-and-hate-relationship-with-nodejs.html
+++ /dev/null
@@ -1,110 +0,0 @@
1<!doctype html><html lang=en-us><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=generator content="JBMAFP - github.com/mitjafelicijan/jbmafp"><link href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL69vf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv76+/8LBwQkAAAAAAAAAAAAAAAC+vb3/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+9vf/Bv78JAAAAAAAAAAAAAAAAu7q6/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7ubr/vr29CAAAAAAAAAAAy8nJAZ6foP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnqGj/6GipAoAAAAAHLjU/xcXHf/BwsL/I8XY/yPK3v8XGiD/IbjL/yPF2f8XGiD/Fxkf/yLF2f8gnK3/Fxog/62ztv8fwNf/FRcd/x271v8mz93/GRsi/xkXHf8p097/GiIp/xobIv8p0t3/KdPe/xocIv8fYmr/KNPe/xoZH/8aHCL/J87c/xy81/8VFxz/IsPZ/8zS0/8XGiD/Ir/R/yPH2/8XGiD/Fxkf/yPH2/8dd4T/GBog/yPJ3f8jyNr/uru9/xcUGv8cudb/EhITDKi5vRKlvMP/RUpOERwcHRAdOj4QHTk8EBwdHRAdNTgQHTo/EBwcHRAcHB0QSGduEKW4vf+koqQfHzg+EBqz0ewSFRv7EyMr/xq51vsTERb7ExUb+xq41fsau9j7ExUb+xiPp/sZudb7ExUb+xMVG/sZuNX/GKvI/BIUGfMdvdn/IrfL/xcaIP8n1eb/J9Dh/xkcIf8ZGR7/J8/f/xxCSv8ZGyH/J9Dg/ybQ4P8ZHCL/FSQs/yPK3/8UExj/GE1b/ybS5P8ZGB7/Ghwj/ynW5P8p2Ob/Ghwi/yWrtv8p1eH/Ghwi/xocIv8p1uT/J8XT/xkcIv8m1un/Hb7d/xUYH/8hzOr/HtHu/xcaIf8XGB//I8vi/xgxOv8XGSD/I8rg/yPK4P8XGiD/GUFL/yPP6f8SERj/Fhkh/x3A4f8AAAAAJ2f9/ydr//8mZPH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlYu38J2v//ydo/f8AAAAAAAAAAAd8/fkFqf//Iob8sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMY39awWr//8FfP3/AAAAAAAAAAAFm/7/SfD//wR+/f8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOB/f9B7v//BaX+/wAAAAAAAAAAQ878SAyZ/v9n1v4KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADu9v8DDJb+/z3N/XgAAAAA3/sAAN/7AADf+wAA3/sAAAAAAAAAAAAAAAAAAN/7AAAAAAAAAAAAAAAAAAAAAAAAj/EAAI/5AACP8QAA3/sAAA==" rel=icon type=image/x-icon><title>My love and hate relationship with Node.js</title><meta name=description content="Previous project I was working on was being coded inGolang."><meta name=author content="Mitja Felicijan"><link rel=alternate type=application/rss+xml title="Mitja Felicijan's posts" href=https://mitjafelicijan.com/index.xml><link rel=alternate type=application/rss+xml title="Mitja Felicijan's notes" href=https://mitjafelicijan.com/notes.xml><style>:root{--border-color:gainsboro;--border-size:2px;--link-color:blue;--bg-color:#eee}*::selection{background:var(--link-color);color:#fff}*::-moz-selection{background:var(--link-color);color:#fff}*::-webkit-selection{background:var(--link-color);color:#fff}body{padding:2.5rem;max-width:1900px;background:#fff;font-family:sans-serif;line-height:1.35rem;font-size:16px}hr{border:0;border-bottom:var(--border-size)solid var(--border-color);margin-block-start:1.5rem}a{color:var(--link-color);text-decoration:none}h1,h2,h3{line-height:initial}h1{font-size:xx-large}footer{margin-block-start:2rem}cap{text-transform:capitalize}blockquote{font-style:italic}table{max-width:100%;border:var(--border-size)solid var(--border-color);border-collapse:separate;border-spacing:0}table thead tr th{border-bottom:var(--border-size)solid var(--border-color);text-align:left}table th,table td{padding:.5em .8em}ul.list li{padding:.2em 0}ul{line-height:1.35em}pre{text-wrap:nowrap;overflow-x:auto;padding:0 1em;border:var(--border-size)solid var(--border-color)}code{padding:0 3px;font-size:14px;border:0;background:var(--bg-color)}pre code{line-height:1.3em;background:#fff}pre,code,pre *,code *{font-family:monospace}figure{margin-inline-start:0;margin-inline-end:0}figcaption{width:800px;max-width:100%;text-align:center}figcaption p{margin:.3em 0 1.5em;font-style:italic}img,video,audio{width:800px;max-width:100%;border:var(--border-size)solid var(--border-color);padding:.5em}header nav{display:flex;gap:.9rem}article iframe{margin:0!important}audio::-webkit-media-controls-enclosure{border-radius:0}@media only screen and (max-width:600px){body{padding:.5em;word-wrap:break-word}header nav{gap:.7rem}header nav .hob{display:none}a{word-wrap:break-word}img,video,audio{padding:0}}</style><header><nav class=main itemscope itemtype=http://schema.org/SiteNavigationElement role=navigation aria-label="Main navigation"><a href=/>Home</a>
2<a href=/#posts>Posts</a>
3<a href=/#notes>Notes</a>
4<a href=/#sideprojects class=hob>Side Projects</a>
5<a href=/vault.html>Vault</a>
6<a href=https://github.com/mitjafelicijan target=_blank>Code</a>
7<a href=/mitjafelicijan.pgp.pub.txt target=_blank class=hob>PGP</a>
8<a href=/curriculum-vitae.html>CV</a>
9<a href=/index.xml target=_blank class=hob>RSS</a></nav></header><main role=main><article itemtype=http://schema.org/Article><h1 itemtype=headline>My love and hate relationship with Node.js</h1><p><cap>post</cap>, Mar 30, 2020 on <a href=https://mitjafelicijan.com>Mitja Felicijan's blog</a><div><p>Previous project I was working on was being coded in
10<a href=https://golang.org/>Golang</a>. Also was my first project using it. And damn,
11that was an awesome experience. The whole thing is just superb. From how errors
12are handled. The C-like way you handle compiling. The way the language is
13structured making it incredibly versatile and easy to learn.<p>It may cause some pain for somebody that is not used of using interfaces to map
14JSON and doing the recompilation all the time. But we have tools like
15<a href=http://eradman.com/entrproject/>entr</a> and
16<a href=https://www.gnu.org/software/make/>make</a> to fix that.<p>But we are not here to talk about my undying love for <strong>Golang</strong>. Only in some
17way we probably should. It is an excellent example of how modern language should
18be designed. And because I have used it extensively in the last couple of years
19this probably taints my views of other languages. And is doing me a great
20disservice. Nevertheless, here we are.<p>About two years ago I started flirting with <a href=https://nodejs.org/en/>Node.js</a>
21for a project I started working on. What I wanted was to have things written in
22a language that is widely used, and we could get additional developers for. As
23much as <strong>Golang</strong> is amazing it's really hard to get developers for it. Even
24now. And after playing around with it for a week I felt in love with the speed
25of iteration and massive package ecosystem. Do you want SSO? You got it! Do you
26want some esoteric library for something? There is a strong chance somebody
27wrote it. It is so extensive that you find yourself evaluating packages based on
28<strong>GitHub stars</strong> and number of contributors. You get swallowed by the vanity
29metrics and that potentially will become the downfall of Node.js.<p>Because of the sheer amount of choice I often got anxiety when choosing
30libraries. Will I choose the correct one? Is this library something that will be
31supported for a foreseeable future or not? I am used of using libraries that are
32being in development for 10 years plus (Python, C) and that gave me some sort of
33comfort. And it is probably unfair to Node.js and community to expect same
34dedication.<p>Moving forward ... Work started and things were great. <strong>Speed of iteration was
35insane</strong>. For some feature that I would need a day in Golang only took me hour
36or two. I became lazy! Using packages all over the place. Falling into the same
37trap as others. Packages on top of packages. And <a href=https://www.npmjs.com/>npm</a>
38didn't help at all. The way that the package manager works is just
39horrendous. And not allowing to have node_modules outside the project is also
40the stupidest idea ever.<p>So at that point I started feeling the technical debt that comes with Node.js
41and the whole ecosystem. What nobody tells you is that <strong>structuring large
42Node.js apps</strong> is more problematic than one would think. And going microservice
43for every single thing is also a bad idea. The amount of networking you
44introduce with that approach always ends up being a pain in the ass. And I don't
45even want to go into system administration here. The overhead is
46insane. Package-lock.json made many days feel like living hell for me. And I
47would eat the cost of all this if it meant for better development
48experience. Well, it didn't.<p>The <strong>lack of Typescript</strong> support in the interpreter is still mind boggling to
49me. Why haven't they added native support yet for this is beyond me?! That would
50have solved so many problems. Lack of type safety became a problem somewhere in
51the middle of the project where the codebase was sufficiently large enough to
52present problems. We started adding arguments to functions and there was <strong>no
53way to implicitly define argument types</strong>. And because at that point there were
54a lot of functions, it became impossible to know what each one accepts,
55development became more and more trial and error based.<p>I tried <strong>implementing Typescript</strong>, but that would present a large refactor
56that we were not willing to do at that point. The benefits were not enough. I
57also tried <a href=https://flow.org/>Flow - static type checker</a> but implementation
58was also horrible. What Typescript and Flow forces you is to have src folder and
59then <strong>transpile</strong> your code into dist folder and run it with node. WTH is that
60all about. Why can't this be done in memory or some virtual file system? Why? I
61see no reason why this couldn't be done like this. But it is what it is. I
62abandoned all hope for static type checking.<p>One of the problems that resulted from not having interfaces or types was
63inability to model out our data from <strong>Elasticsearch</strong>. I could have done a
64<strong>pedestrian implementation</strong> of it, but there must be a better way of doing
65this without resorting to some hack basically. Or maybe I haven't found a
66solution, which is also a possibility. I have looked, though. No juice!<p><strong>Error handling?</strong> Is that a joke?<p>Thank god for <strong>await/async</strong>. Without it, I would have probably just abandoned
67the whole thing and went with something else like Python. That's all I am going
68to say about this :)<p>I started asking myself a question if Node.js is actually ready to be used in a
69<strong>large scale applications</strong>? And this was a totally wrong question. What I
70should have been asking myself was, how to use Node.js in large scale
71application. And you don't get this in <strong>marketing material</strong> for Express or Koa
72etc. They never tell you this. Making Node.js scale on infrastructure or in
73codebase is really <strong>more of an art than a science</strong>. And just like with the
74whole JavaScript ecosystem:<ul><li>impossible to master,<li>half of your time you work on your tooling,<li>just accept transpilers that convert one code into another (holly smokes),<li>error handling is a joke,<li>standards? What standards?</ul><p>But on the other hand. As I did, you will also learn to love it. Learn to use it
75quickly and do impossible things in crazy limited time.<p>I hate to admit it. But I love Node.js. Dammit, I love it :)<p><strong>2023 Update</strong>: I hate Node.js!</div></article></main><section><hr><h2>Posts from blogs I follow around the net</h2><ul><li><a href=https://utcc.utoronto.ca/~cks/space/blog/linux/NFSv4ServerLockClients target=_blank rel=noopener>Finding which NFSv4 client owns a lock on a Linux NFS(v4) server</a> — <a href=https://utcc.utoronto.ca/~cks/space/blog/>Chris's Wiki :: blog</a><div>A while back I wrote an entry about finding which NFS client owns
76a lock on a Linux NFS server, which turned
77out to be specific to NFS v3 (which I really should have seen coming,
78since it involved NLM and lockd). Finding the NFS v4 client that
79owns a lock is, depending on your perspective, either simpl…<li><a href=http://www.landley.net/notes-2023.html#28-10-2023 target=_blank rel=noopener>October 28, 2023</a> — <a href=http://www.landley.net/notes-2023.html>Rob Landley's Blog Thing for 2023</a><div>Oh good grief, two of my least favorite licensing people, Larry Rosen
80and Bradley Kuhn, are interacting on the OSI's license-discuss
81list where the're doing
82bad computer history and insisting that a guy Larry Rosen
83coincidentally interviewed for a book years ago is clearly the origin of
84somethin…<li><a href="http://offbeatpursuit.com:80/blog/?id=25" target=_blank rel=noopener>A fix by any other name</a> — <a href=http://offbeatpursuit.com:80/blog/>WLOG - blog</a><div>tags:
85i2c, plan9
86Another month, another file system.
87Well, if you can’t fix it in software, fix it in hardware (looking at
88you, bme680, we’re not
89done yet). The show must go on, as they say, and I would like my
90experiments to go on.
91So a “new” addition to the environmental sensor family connected to
92the h…<li><a href=https://mirzapandzo.com/next-image-url-parameter-is-valid-but-upstream-response-is-invalid target=_blank rel=noopener>Next/Image "url" parameter is valid but upstream response is invalid</a> — <a href=https://mirzapandzo.com/>Mirza Pandzo's Blog</a><div>Getting "url" parameter is valid but upstream response is invalid error with Next/Image on WSL2<li><a href=https://drewdevault.com/2023/10/13/Going-off-script.html target=_blank rel=noopener>Going off-script</a> — <a href=https://drewdevault.com>Drew DeVault's blog</a><div>There is a phenomenon in society which I find quite bizarre. Upon our entry to
93this mortal coil, we are endowed with self-awareness, agency, and free will.
94Each of the 8 billion members of this human race represents a unique person, a
95unique worldview, and a unique agency. Yet, many of us have the sam…<li><a href=https://szymonkaliski.com/writing/2023-10-02-building-a-diy-pen-plotter/ target=_blank rel=noopener>Building a DIY Pen Plotter</a> — <a href=http://github.com/dylang/node-rss>Szymon Kaliski</a><div>This article documents my learnings from designing and building a DIY Pen Plotter during the summer of 2023.
96My ultimate goal is to build my…<li><a href=https://neil.computer/notes/chart-of-accounts-for-startups-and-saas-companies/ target=_blank rel=noopener>Chart of Accounts for Startups and SaaS Companies</a> — <a href=https://neil.computer/>Neil Panchal</a><div>Accounting is fundamental to starting a business. You need to have a basic understanding of accounting principles and essential bookkeeping. I had to learn it. There was no choice. For filing taxes, your CPA is going to ask you for an Income Statement (also known as P/L statement). If<li><a href=https://journal.valeriansaliou.name/deploy-a-nomad-cluster-on-alpine-linux-with-vultr/ target=_blank rel=noopener>Deploy a Nomad Cluster on Alpine Linux with Vultr</a> — <a href=https://journal.valeriansaliou.name/>Valerian Saliou</a><div>After spending countless hours trying to understand how to deploy my apps on Kubernetes for the first time to host Mirage, an AI API service that I run, I ended up making myself a promise that the next app I work on would be using a more productive & simpler<li><a href=https://jcs.org/2023/10/25/wifi_da target=_blank rel=noopener>BlueSCSI Wi-Fi Desk Accessory 1.0 Released</a> — <a href=https://jcs.org/>joshua stein</a><div>BlueSCSI Wi-Fi Desk Accessory
971.0 has been released:
98wifi_da-1.0.sit
99(StuffIt 3 archive)
100SHA256: ccfc9d27dd5da7412d10cef73b81119a1fec3848e4d1d88ff652a07ffdc6a69aSHA1: ff124972f202ceda6d7fa4788110a67ccda6a13a
101This is the initial public release of my BlueSCSI Wi-Fi Desk Accessory for
102classic MacOS.<li><a href=https://michael.stapelberg.ch/posts/2023-10-25-my-all-flash-zfs-network-storage-build/ target=_blank rel=noopener>My 2023 all-flash ZFS NAS (Network Storage) build</a> — <a href=https://michael.stapelberg.ch/>Michael Stapelbergs Website</a><div>For over 10 years now, I run two self-built NAS (Network Storage) devices which serve media (currently via Jellyfin) and run daily backups of all my PCs and servers.
103In this article, I describe my goals, which hardware I picked for my new build (and why) and how I set it up.
104Design Goals
105I use my netw…</ul><p>Generated with <a href=https://git.sr.ht/~sircmpwn/openring target=_blank rel=noopener>openring</a>.</section><footer><hr><p><big><strong>Want to comment or have something to add?</strong></big><p>You can write me an email
106at <a href=mailto:mitja.felicijan@gmail.com>mitja.felicijan@gmail.com</a> or
107catch up with me <a href=https://telegram.me/mitjafelicijan target=_blank>on Telegram</a>.<hr><p>This website does not track you. Content is made available under the <a href=https://creativecommons.org/licenses/by/4.0/ target=_blank rel=noreferrer>CC BY 4.0 license</a> unless
108specified otherwise. Blog is also available as <a href=/index.xml target=_blank>RSS feed</a>.</footer><script>
109 window.va = window.va || function () { (window.vaq = window.vaq || []).push(arguments); };
110 </script><script defer src=/_vercel/insights/script.js></script> \ No newline at end of file