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.html91
1 files changed, 91 insertions, 0 deletions
diff --git a/public/my-love-and-hate-relationship-with-nodejs.html b/public/my-love-and-hate-relationship-with-nodejs.html
new file mode 100755
index 0000000..0062945
--- /dev/null
+++ b/public/my-love-and-hate-relationship-with-nodejs.html
@@ -0,0 +1,91 @@
1<!doctype html><html lang=en-us><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><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."><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>body{padding:1rem;max-width:760px;background:#fff;font-family:sans-serif;line-height:1.35rem;font-size:16px;margin:0 auto}hr{margin-block-start:1.5rem}h1,h2,h3{line-height:initial}h1{font-size:xx-large}footer{margin-block-start:2rem}cap{text-transform:capitalize}table{max-width:100%;width:100%;border-collapse:separate;border-spacing:2px;border:1px solid #000;border-left:1px solid #999;border-top:1px solid #999}blockquote{font-style:italic}table thead{background:#eee}ul.list li{padding:.2em 0}ul{line-height:1.4em}td,th{border:1px solid #000;padding:4px;border-right:1px solid #999;border-bottom:1px solid #999;text-align:left}pre{text-wrap:nowrap;overflow-x:auto;padding:0 1em;border:1px solid #dcdcdc}code{padding:0 3px;font-size:14px;border:0}pre code{line-height:1.3em}pre,code,pre *,code *{font-family:monospace}figure{margin-inline-start:0;margin-inline-end:0}figcaption{text-align:center}figcaption p{margin:.3em 0 0}img,video,audio{max-width:100%}header{display:flex;flex-direction:row;gap:3rem}nav{display:flex;gap:.75rem}nav.main{flex-grow:1}.pstatus-orange{background:gold}.pstatus-green{background:#9acd32}.pstatus-red{background:#cd5c5c}@media only screen and (max-width:600px){body{padding:15px}header{flex-direction:column;gap:1rem}a{word-wrap:break-word}}</style><header><nav class=main itemscope itemtype=http://schema.org/SiteNavigationElement role=toolbar><a href=/>Home</a>
2<a href=https://git.mitjafelicijan.com/ target=_blank>Git</a>
3<a href=https://files.mitjafelicijan.com/ target=_blank>Files</a>
4<a href=/radio.pls target=_blank>Radio</a>
5<a href=/mitjafelicijan.pgp.pub.txt target=_blank>PGP</a>
6<a href=/curriculum-vitae.html>CV</a>
7<a href=/index.xml target=_blank>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
8<a href=https://golang.org/>Golang</a>. Also was my first project using it. And damn,
9that was an awesome experience. The whole thing is just superb. From how errors
10are handled. The C-like way you handle compiling. The way the language is
11structured 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
12JSON and doing the recompilation all the time. But we have tools like
13<a href=http://eradman.com/entrproject/>entr</a> and
14<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
15way we probably should. It is an excellent example of how modern language should
16be designed. And because I have used it extensively in the last couple of years
17this probably taints my views of other languages. And is doing me a great
18disservice. Nevertheless, here we are.<p>About two years ago I started flirting with <a href=https://nodejs.org/en/>Node.js</a>
19for a project I started working on. What I wanted was to have things written in
20a language that is widely used, and we could get additional developers for. As
21much as <strong>Golang</strong> is amazing it's really hard to get developers for it. Even
22now. And after playing around with it for a week I felt in love with the speed
23of iteration and massive package ecosystem. Do you want SSO? You got it! Do you
24want some esoteric library for something? There is a strong chance somebody
25wrote it. It is so extensive that you find yourself evaluating packages based on
26<strong>GitHub stars</strong> and number of contributors. You get swallowed by the vanity
27metrics and that potentially will become the downfall of Node.js.<p>Because of the sheer amount of choice I often got anxiety when choosing
28libraries. Will I choose the correct one? Is this library something that will be
29supported for a foreseeable future or not? I am used of using libraries that are
30being in development for 10 years plus (Python, C) and that gave me some sort of
31comfort. And it is probably unfair to Node.js and community to expect same
32dedication.<p>Moving forward ... Work started and things were great. <strong>Speed of iteration was
33insane</strong>. For some feature that I would need a day in Golang only took me hour
34or two. I became lazy! Using packages all over the place. Falling into the same
35trap as others. Packages on top of packages. And <a href=https://www.npmjs.com/>npm</a>
36didn't help at all. The way that the package manager works is just
37horrendous. And not allowing to have node_modules outside the project is also
38the stupidest idea ever.<p>So at that point I started feeling the technical debt that comes with Node.js
39and the whole ecosystem. What nobody tells you is that <strong>structuring large
40Node.js apps</strong> is more problematic than one would think. And going microservice
41for every single thing is also a bad idea. The amount of networking you
42introduce with that approach always ends up being a pain in the ass. And I don't
43even want to go into system administration here. The overhead is
44insane. Package-lock.json made many days feel like living hell for me. And I
45would eat the cost of all this if it meant for better development
46experience. Well, it didn't.<p>The <strong>lack of Typescript</strong> support in the interpreter is still mind boggling to
47me. Why haven't they added native support yet for this is beyond me?! That would
48have solved so many problems. Lack of type safety became a problem somewhere in
49the middle of the project where the codebase was sufficiently large enough to
50present problems. We started adding arguments to functions and there was <strong>no
51way to implicitly define argument types</strong>. And because at that point there were
52a lot of functions, it became impossible to know what each one accepts,
53development became more and more trial and error based.<p>I tried <strong>implementing Typescript</strong>, but that would present a large refactor
54that we were not willing to do at that point. The benefits were not enough. I
55also tried <a href=https://flow.org/>Flow - static type checker</a> but implementation
56was also horrible. What Typescript and Flow forces you is to have src folder and
57then <strong>transpile</strong> your code into dist folder and run it with node. WTH is that
58all about. Why can't this be done in memory or some virtual file system? Why? I
59see no reason why this couldn't be done like this. But it is what it is. I
60abandoned all hope for static type checking.<p>One of the problems that resulted from not having interfaces or types was
61inability to model out our data from <strong>Elasticsearch</strong>. I could have done a
62<strong>pedestrian implementation</strong> of it, but there must be a better way of doing
63this without resorting to some hack basically. Or maybe I haven't found a
64solution, 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
65the whole thing and went with something else like Python. That's all I am going
66to say about this :)<p>I started asking myself a question if Node.js is actually ready to be used in a
67<strong>large scale applications</strong>? And this was a totally wrong question. What I
68should have been asking myself was, how to use Node.js in large scale
69application. And you don't get this in <strong>marketing material</strong> for Express or Koa
70etc. They never tell you this. Making Node.js scale on infrastructure or in
71codebase is really <strong>more of an art than a science</strong>. And just like with the
72whole 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
73quickly and do impossible things in crazy limited time.<p>I hate to admit it. But I love Node.js. Dammit, I love it :)<p>2023 Update: I hate Node.js!</div></article></main><section><hr><h2>Posts from blogs I follow around the net</h2><ul><li><a href=https://chotrin.org/writing/2023-10-20.html target=_blank rel=noopener>OpenBSD upgrade and fall things.</a><div>Been AFK for a bit. It's autumn and I upgraded this server to OpenBSD 7.4! — <a href=https://chotrin.org>chötrin's wiki.</a><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><div>Getting "url" parameter is valid but upstream response is invalid error with Next/Image on WSL2 — <a href=https://mirzapandzo.com/>Mirza Pandzo's Blog</a><li><a href=https://drewdevault.com/2023/10/13/Going-off-script.html target=_blank rel=noopener>Going off-script</a><div>There is a phenomenon in society which I find quite bizarre. Upon our entry to
74this mortal coil, we are endowed with self-awareness, agency, and free will.
75Each of th… — <a href=https://drewdevault.com>Drew DeVault's blog</a><li><a href=https://solar.lowtechmagazine.com/2023/10/workshop-in-rotterdam-how-to-build-a-bike-generator/ target=_blank rel=noopener>Workshop in Rotterdam: How to Build a Bike Generator</a><div>Afbeelding: Low-tech Magazine workshop in Rotterdam, the Netherlands. Poster: Marie Verdeil. Image: Sara Vercauteren
76The workshop takes place on behalf of the “Hou… — <a href=https://solar.lowtechmagazine.com/posts/>LOW←TECH MAGAZINE English</a><li><a href="http://offbeatpursuit.com:80/blog/?id=24" target=_blank rel=noopener>Printf debugging</a><div>tags:
77plan9
78There’s no shame in that. Yes, there is documentation, code to be
79read, and debuggers to be used. But sometimes you just need to “see”
80what is happening.
81So… — <a href=http://offbeatpursuit.com:80/blog/>WLOG - blog</a><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><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. Ther… — <a href=https://neil.computer/>Neil Panchal</a><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><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 … — <a href=https://journal.valeriansaliou.name/>Valerian Saliou</a><li><a href=https://jcs.org/2023/10/17/wikipedia target=_blank rel=noopener>Wikipedia Reader 1.0 Released</a><div>Wikipedia Reader
821.0 has been released:
83wikipedia-1.0.sit
84(StuffIt 3 archive, includes
85source code
86and THINK C 5 project file)
87SHA256: 360e12d064f6579695f1e627ce34cb2f0… — <a href=https://jcs.org/>joshua stein</a></ul><p><a href=https://git.sr.ht/~sircmpwn/openring>Generated with 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
88at <a href=mailto:m@mitjafelicijan.com>m@mitjafelicijan.com</a> or
89catch 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
90the <a href=https://creativecommons.org/licenses/by/4.0/ target=_blank rel=noreferrer>CC BY 4.0 license</a> unless specified
91otherwise. Blog is also available as <a href=/index.xml target=_blank>RSS feed</a>.</footer> \ No newline at end of file