DEV Community

Cover image for 10 Things I Regret About Node.js
Nick Taylor
Nick Taylor Subscriber

Posted on Edited on Originally published at iamdeveloper.com

10 Things I Regret About Node.js

Photo courtesy of flickr user Trygve Lie.

The creator of Node JS, Ryan Dahl, recently gave a talk at JSConf EU 2018 titled "10 Things I Regret About Node.js"

It's a great talk about Node and he also goes into some details about his new project Deno, a secure TypeScript runtime on V8.

Here's some of the things he regrets:

  • dynamic languages are great for certain things. In a server though, you want things to be statically typed. (Probably why he wrote Deno in TypeScript and Go)
  • design mistakes:
    • didn't stick with Promises in Node (in the beginning), keeping them could have sped up async/await development.
    • security
    • Build system (GYP)
    • package.json

Even Brendan Eich chimed in

Give it a watch. I'm curious what everyone's thoughts are.

Top comments (23)

Collapse
 
antonrich profile image
Anton •

The goal of Node was event driven HTTP servers.

5:04
1 Regret: Not sticking with Promises.
* I added promises to Node in June 2009 but foolishly removed them in February 2010.
* Promises are the necessary abstraction for async/await.
* It's possible unified usage of promises in Node would have sped the delivery of the eventual standartization and async/await.
* Today Node's many async APIs are aging baldly due to this.

6:02
2 Regret: Security
* V8 by itself is a very good security sandbox
* Had I put more thought into how that could be maintained for certain applications, Node could have had some nice security guarantees not available in any other language.
* Example: Your linter shouldn't get complete access to your computer and network.

7:01
3 Regret: The Build System (GYP)
* Build systems are very difficult and very important.
* V8 (via Chrome) started using GYP and I switched Node over in tow.
* Later Chrome dropped GYP for GN. Leaving Node the sole GYP user.
* GYP is not an ugly internal interface either - it is exposed to anyone who's trying to bind to V8.
* It's an awful experience for users. It's this non-JSON, Python adaptation of JSON.
* The continued usage of GYP is the probably largest failure of Node core.
* Instead of guiding users to write C++ bindings to V8, I should have provided a core foreign function interface (FFI)
* Many people, early on, suggested moving to an FFI (namely Cantrill) and regrettably I ignored them.
* (And I am extremely displeased that libuv adopted autotools.)

9:52
4 Regret: package.json
* Isaac, in NPM, invented package.json (for the most part)
* But I sanctioned it by allowing Nod's require() to inspect package.json files for "main"
* Ultimately I included NPM in the Node distribution, which much made it the defacto standard.
* It's unfortunate that there is centralized (privately controlled even) repository for modules.
* Allowing package.json gave rise to the concept of a "module" as a directory of files.
* This is no a stictly necessary abstraction - and one that doesn't exist on the web.
* package.json now includes all sorts of unnecessary information. License? Repository? Description? It's boilerplate noise.
* If only relative files and URLs were used when importing, the path defines the version. There is no need to list dependencies.

12:35
5 Regret: node_modules
* It massively complicates the module resolution algorithm.
* vendored-by-default has good intentios, but in practice just using $NODE_PATH wouldn't have precluded that.
* Deviates greatly from browser semantics
* It's my fault and I'm very sorry.
* Unfortunately it's impossible to undo now.

14:00
6 Regret: require("module") without the extension ".js"
* Needlessly less explicit.
* Not how browser javascript works. You cannot omit the ".js" in a script tag src attribute.
* The module loader has to query the file system at multiple locations trying to guess what the user intended.

14:40
7 Regret: index.js
* I thought it was cute, because there was index.html
* It needlessly complicated the module loading system.
* It became especially unnecessary after require supported package.json

15:28 Talks about Deno.

Collapse
 
keva profile image
keva •

From someone who often forgets his headphones you sir are awesome.

Collapse
 
shreyasminocha profile image
Shreyas Minocha • • Edited

His slide deck.

Edit: Fix my markdown 😛.

Collapse
 
nickytonline profile image
Nick Taylor •

Thanks for the notes. tinyclouds.org/jsconf2018.pdf works, but the URL you have when you click on it is not that. Just FYI.

Collapse
 
shreyasminocha profile image
Shreyas Minocha •

I just noticed "de-no" ↔︎ "no-de"

Collapse
 
marcellothearcane profile image
marcellothearcane •
'node'.split('').sort().join('')
Enter fullscreen mode Exit fullscreen mode
Collapse
 
nickytonline profile image
Nick Taylor •

🤯 😜

Collapse
 
rhymes profile image
rhymes • • Edited

I have an odd question born of lazyness I admit: would you mind summarizing or listing the 10 points in your post?

I've never used Node.js but I'm still curious and this might help the conversation :D

Collapse
 
nickytonline profile image
Nick Taylor •

I'll summarize it later tonight my lazy friend ;)

Collapse
 
nickytonline profile image
Nick Taylor • • Edited

Posted a few of the items he mentioned during my coffee break. Gotta give it a second listen to gather the rest.

Collapse
 
rhymes profile image
rhymes •

Thanks!

Collapse
 
zeerorg profile image
Rishabh Gupta •

I think every software developer can learn a lot from this video. It's pretty inspiring to see someone as big in the industry as him admitting his mistakes. These were not on the lines of "yeah, that was a small mistake it doesn't matter", but he totally meant "I screwed up, big time".

Collapse
 
barryblando profile image
Barry⚡ •

I rarely have a conflict with Build System but when I do. Damn that GYP! #REBUILD

Collapse
 
realabbas profile image
Ali Abbas •

Deno is the future 👍

Collapse
 
frankdspeed profile image
Frank Lemanschik •

Deno is not the future github.com/stealify/stealify powered by Oracles NodeJS Compatible GraalVM is the future today!!!

Collapse
 
khrome83 profile image
Zane Milakovic •

Nothing that has the words Oracle in it will be the future outside of enterprises...

Collapse
 
nickytonline profile image
Nick Taylor •

They also discuss Ryan's talk on JS Party episode 29: Node's survey, Ry's regrets, Microsoft's GitHub. If you're not already subscribed to this podcast, I highly recommend it.

Collapse
 
nickytonline profile image
Nick Taylor •

I'm excited to see where the Deno project goes as I'm a big fan of TypeScript.

Collapse
 
kspeakman profile image
Kasey Speakman •

What I took from this video is that node.js is destined to be replaced by competitor that solves a lot of the issues that node does not currently do well, because they were added as afterthoughts. I don't know of such a competitor that currently exists (aside from the presenter's attempt), but it is only a matter of time.

Collapse
 
frankdspeed profile image
Frank Lemanschik •

it has happened already github.com/stealify/stealify

A Framework for graaljs a nodejs compatible runtime :) powerd by Oracle GraalVM :)

Collapse
 
antonrich profile image
Anton •

One thing that I don't understand. Why did he created new kind of Node? Why not use another language instead?

Collapse
 
tojacob profile image
Jacob Samuel G. •

I asked the same. I guess it's because he's a builder. Thanks to people like him, today we have many alternatives in the world of software.

Collapse
 
antonrich profile image
Anton •

When I asked the question I didn't watch the full talk.
After watching the talk, however, I know that the author really likes JavaScript. That is the reason he didn't choose another language.