frontpage.
newsnewestaskshowjobs

Made with ♥ by @iamnishanth

Open Source @Github

Modern Node.js Patterns

https://kashw1n.com/blog/nodejs-2025/
342•eustoria•6h ago•140 comments

Writing a good design document

https://grantslatton.com/how-to-design-document
143•kiyanwang•5h ago•40 comments

Persona vectors: Monitoring and controlling character traits in language models

https://www.anthropic.com/research/persona-vectors
279•itchyjunk•8h ago•94 comments

Typed languages are better suited for vibecoding

https://solmaz.io/typed-languages-are-better-suited-for-vibecoding
15•hosolmaz•1h ago•3 comments

So you want to parse a PDF?

https://eliot-jones.com/2025/8/pdf-parsing-xref
55•UglyToad•3h ago•35 comments

How to grow almost anything

https://howtogrowalmostanything.notion.site/htgaa25
35•car•2h ago•11 comments

Names are not type safety (2020)

https://lexi-lambda.github.io/blog/2020/11/01/names-are-not-type-safety/
22•azhenley•2h ago•2 comments

If you're remote, ramble

https://stephango.com/ramblings
668•lawgimenez•14h ago•368 comments

Life, Work, Death and the Peasant: Family Formation

https://acoup.blog/2025/08/01/collections-life-work-death-and-the-peasant-part-iiia-family-formation/
58•Khaine•1d ago•0 comments

A study of lights at night suggests dictators lie about economic growth (2022)

https://www.economist.com/graphic-detail/2022/09/29/a-study-of-lights-at-night-suggests-dictators-lie-about-economic-growth
67•mooreds•2h ago•23 comments

Shrinking freshwater availability increasing land contribution to sea level rise

https://news.asu.edu/20250725-environment-and-sustainability-new-global-study-shows-freshwater-disappearing-alarming
116•ornel•5h ago•46 comments

Welcome to url.town, population 465

https://url.town/
93•plaguna•1d ago•11 comments

"If you can rack it, you can run UniFi OS" Ubiquiti self-hosted UniFi OS release

https://deluisio.com/networking/unifi/2025/08/03/everything-you-need-to-know-about-unifi-os-server-before-you-waste-time-testing-it/
28•codydeluisio•4h ago•1 comments

This Old SGI: notes and memoirs on the Silicon Graphics 4D series (1996)

https://archive.irixnet.org/thisoldsgi/
68•exvi•10h ago•3 comments

Learnable Programming (2012)

https://worrydream.com/LearnableProgramming/
6•kunzhi•2h ago•0 comments

2,500-year-old Siberian 'ice mummy' had intricate tattoos, imaging reveals

https://www.bbc.com/news/articles/c4gzx0zm68vo
180•dxs•3d ago•50 comments

System-Wide Safety Project

https://www.nasa.gov/directorates/armd/aosp/sws/
4•pieterk•1d ago•0 comments

Cloud Drawing Gallery

https://cloudgazing.online/
8•speckx•2d ago•0 comments

Tokens are getting more expensive

https://ethanding.substack.com/p/ai-subscriptions-get-short-squeezed
208•admp•14h ago•150 comments

Twenty Eighth International Obfuscated C Code Contest

https://www.ioccc.org/2024/index.html
310•mdl_principle•20h ago•88 comments

UN report finds UN reports are not widely read

https://www.reuters.com/world/un-report-finds-united-nations-reports-are-not-widely-read-2025-08-01/
236•anjneymidha•8h ago•100 comments

Converge (YC S23) well-capitalized New York startup seeks product developers

https://www.runconverge.com/careers
1•thomashlvt•8h ago

A 3D model of the human airways via a digital light processing bioprinter

https://analyticalsciencejournals.onlinelibrary.wiley.com/doi/10.1002/bit.29013
20•PaulHoule•3d ago•1 comments

How to make almost anything (2019)

https://fab.cba.mit.edu/classes/863.19/CBA/people/dsculley/index.html
141•teleforce•13h ago•21 comments

Schematra: A Sinatra love letter in Scheme

https://github.com/rolandoam/schematra
14•funkaster•2d ago•2 comments

The Ski Rental Problem

https://lesves.github.io/articles/ski-rental/
52•skywalqer•4d ago•69 comments

Lina Khan points to Figma IPO as vindication of M&A scrutiny

https://techcrunch.com/2025/08/02/lina-khan-points-to-figma-ipo-as-vindication-for-ma-scrutiny/
373•bingden•1d ago•369 comments

Build Your Own Minisforum N5 Inspired Mini NAS

https://jackharvest.com/index.php/2025/07/27/build-your-own-minisforum-n5-inspired-mini-nas-a-comprehensive-guide/
119•LorenDB•4d ago•37 comments

The Fulbright Program: Chock Full of Bright Ideas

https://bastian.rieck.me/blog/2025/fulbright/
60•Pseudomanifold•12h ago•14 comments

A Real PowerBook: The Macintosh Application Environment on a Pa-RISC Laptop

http://oldvcr.blogspot.com/2025/08/a-real-powerbook-macintosh-application.html
126•todsacerdoti•18h ago•21 comments
Open in hackernews

Modern Node.js Patterns

https://kashw1n.com/blog/nodejs-2025/
341•eustoria•6h ago

Comments

keysdev•5h ago
About time! The whole dragging the feet on ESM adoption is insane. The npm are still stuck on commonjs is quite a lot. In some way glad jsr came along.
DimmieMan•48m ago
I blame tooling folks doing too good of a job abstracting the problem away, and no this of course isn't a jab at them.

probably 70 to 80% of JS users have barely any idea of the difference because their tooling just makes it work.

chickenzzzzu•5h ago
Yet more architecture astronaut behavior by people who really should just be focusing on ifs, fors, arrays, and functions.
triyambakam•5h ago
Architecture astronaut is a term I hadn't heard but can appreciate. However I fail to see that here. It's a fair overview of newish Node features... Haven't touched Node in a few years so kinda useful.
chickenzzzzu•5h ago
It's a good one with some history and growing public knowledge now. I'd encourage a deep dive, it goes all the way back to at least CPP and small talk.

While I can see some arguments for "we need good tools like Node so that we can more easily write actual applications that solve actual business problems", this seems to me to be the opposite.

All I should ever have to do to import a bunch of functions from a file is

"import * from './path'"

anything more than that is a solution in search of a problem

MrJohz•5h ago
Isn't that exactly the syntax being recommended? Could you explain what exactly in the article is a solution in search of a problem?
WickyNilliams•4h ago
Did you read the article? Your comments feel entirely disconnected from its contents - mostly low level piece or things that can replace libraries you probably used anyway
programmarchy•5h ago
One of the core things Node.js got right was streams. (Anyone remember substack’s presentation “Thinking in streams”?) It’s good to see them continue to push that forward.
chickenzzzzu•5h ago
Why? Why is a stream better than an array? Why is the concept of a realtime loop and for looping through a buffer not sufficient?
bblaylock•5h ago
I think there are several reasons. First, the abstraction of a stream of data is useful when a program does more than process a single realtime loop. For example, adding a timeout to a stream of data, switching from one stream processor to another, splitting a stream into two streams or joining two streams into one, and generally all of the patterns that one finds in the Observable pattern, in unix pipes, and more generally event based systems, are modelled better in push and pull based streams than they are in a real time tight loop. Second, for the same reason that looping through an array using map or forEach methods is often favored over a for loop and for loops are often favored over while loops and while loops are favored over goto statements. Which is that it reduces the amount of human managed control flow bookkeeping, which is precisely where humans tend to introduce logic errors. And lastly, because it almost always takes less human effort to write and maintain stream processing code than it does to write and maintain a real time loop against a buffer.

Hopefully this helps! :D

dwb•5h ago
A stream is not necessarily always better than an array, of course it depends on the situation. They are different things. But if you find yourself with a flow of data that you don't want to buffer entirely in memory before you process it and send it elsewhere, a stream-like abstraction can be very helpful.
cluckindan•4h ago
Streams have backpressure, making it possible for downstream to tell upstream to throttle their streaming. This avoids many issues related to queuing theory.

That also happens automatically, it is abstracted away from the users of streams.

WickyNilliams•4h ago
Why is an array better than pointer arithmetic and manually managing memory? Because it's a higher level abstraction that frees you from the low level plumbing and gives you new ways to think and code.

Streams can be piped, split, joined etc. You can do all these things with arrays but you'll be doing a lot of bookkeeping yourself. Also streams have backpressure signalling

chickenzzzzu•3h ago
Backpressure signaling can be handled with your own "event loop" and array syntax.

Manually managing memory is in fact almost always better than what we are given in node and java and so on. We succeed as a society in spite of this, not because of this.

There is some diminishing point of returns, say like, the difference between virtual and physical memory addressing, but even then it is extremely valuable to know what is happening, so that when your magical astronaut code doesn't work on an SGI, now we know why.

flufluflufluffy•5h ago
what? This is an overview of modern features provided in a programming language runtime. Are you saying the author shouldn’t be wasting their time writing about them and should be writing for loops instead? Or are you saying the core devs of a language runtime shouldn’t be focused on architecture and should instead be writing for loops?
lvl155•5h ago
Thank you for this. Very helpful as I was just starting to dig into node for first time in a few years.
tyleo•5h ago
This is great. I learned several things reading this that I can immediately apply to my small personal projects.

1. Node has built in test support now: looks like I can drop jest!

2. Node has built in watch support now: looks like I can drop nodemon!

pavel_lishin•3h ago
I still like jest, if only because I can use `jest-extended`.
vinnymac•3h ago
If you haven't tried vitest I highly recommend giving it a go. It is compatible with `jest-extended` and most of the jest matcher libraries out there.
pavel_lishin•3h ago
I've heard it recommended; other than speed, what does it have to offer? I'm not too worried about shaving off half-a-second off of my personal projects' 5-second test run :P
tkcranny•2h ago
It has native TS and JSX support, excellent spy, module, and DOM mocking, benchmarking, works with vite configs, and parallelises tests to be really fast.
hungryhobbit•3h ago
Eh, the Node test stuff is pretty crappy, and the Node people aren't interested in improving it. Try it for a few weeks before diving headfirst into it, and you'll see what I mean (and then if you go to file about those issues, you'll see the Node team not care).
upcoming-sesame•2h ago
still I would rather use that than import mocha, chai, Sinon, istanbul.

At the end it's just tests, the syntax might be more verbose but Llms write it anyway ;-)

gabrielpoca118•5h ago
Don’t forget the native typescript transpiler which reduces the complexity a lot for those using TS
mmcnl•5h ago
Exactly. You don't even need --experimental-strip-types anymore.
sroussey•2h ago
It strips TS, it does not transpile.

Things like TS enums will not work.

throwitaway1123•43m ago
In Node 22.7 and above you can enable features like enums and parameter properties with the --experimental-transform-types CLI option (not to be confused with the old --experimental-strip-types option).
theThree•2h ago
It's still not ready for use. I don't care Enum. But you can not import local files without extensions. You can not define class properties in constructor.
erikpukinskis•1h ago
Why would you want to do either of those?
solarkraft•42m ago
Both are very common Typescript patterns.
throwitaway1123•23m ago
Enums and parameter properties can be enabled with the --experimental-transform-types CLI option.

Not being able to import TypeScript files without including the ts extension is definitely annoying. The rewriteRelativeImportExtensions tsconfig option added in TS 5.7 made it much more bearable though. When you enable that option not only does the TS compiler stop complaining when you specify the '.ts' extension in import statements (just like the allowImportingTsExtensions option has always allowed), but it also rewrites the paths if you compile the files, so that the build artifacts have the correct js extension: https://www.typescriptlang.org/docs/handbook/release-notes/t...

farkin88•5h ago
The killer upgrade here isn’t ESM. It’s Node baking fetch + AbortController into core. Dropping axios/node-fetch trimmed my Lambda bundle and shaved about 100 ms off cold-start latency. If you’re still npm i axios out of habit, 2025 Node is your cue to drop the training wheels.
yawnxyz•5h ago
node fetch is WAY better than axios (easier to use/understand, simpler); didn't really know people were still using axios
Raed667•4h ago
I do miss the axios extensions tho, it was very easy to add rate-limits, throttling, retry strategies, cache, logging ..

You can obviously do that with fetch but it is more fragmented and more boilerplate

farkin88•4h ago
Totally get that! I think it depends on your context. For Lambda where every KB and millisecond counts, native fetch wins, but for a full app where you need robust HTTP handling, the axios plugin ecosystem was honestly pretty nice. The fragmentation with fetch libraries is real. You end up evaluating 5 different retry packages instead of just grabbing axios-retry.
hiccuphippo•4h ago
Sounds like there's space for an axios-like library built on top of fetch.
farkin88•4h ago
I think that's the sweet spot. Native fetch performance with axios-style conveniences. Some libraries are moving in that direction, but nothing's really nailed it yet. The challenge is probably keeping it lightweight while still solving the evaluating 5 retry packages problem.
crabmusket•3h ago
Is this what you're looking for? https://www.npmjs.com/package/ky

I haven't used it but the weekly download count seems robust.

farkin88•3h ago
Ky is definitely one of the libraries moving in that direction. Good adoption based on those download numbers, but I think the ecosystem is still a bit fragmented. You've got ky, ofetch, wretch, etc. all solving similar problems. But yeah, ky is probably the strongest contender right now, in my opinion.
farkin88•4h ago
Right?! I think a lot of devs got stuck in the axios habit from before Node 18 when fetch wasn't built-in. Plus axios has that batteries included feel with interceptors, auto-JSON parsing, etc. But for most use cases, native fetch + a few lines of wrapper code beats dragging in a whole dependency.
benoau•3h ago
axios got discontinued years ago I thought, nobody should still be using it!
creatonez•1h ago
No? Its last update was 12 days ago
reactordev•3h ago
You still see axios used in amateur tutorials and stuff on dev.to and similar sites. There’s also a lot of legacy out there.
bravesoul2•3h ago
AI is going to bring that back like an 80s disco playing Wham. If you gonna do it do it wrong...
reactordev•2h ago
hahaha, I see it all the time in my responses. I immediately reject.
macNchz•2h ago
I've had Claude decide to replace my existing fetch-based API calls with Axios (not installed or present at all in the project), apropos of nothing during an unrelated change.
mcv•2h ago
This is all very good news. I just got an alert about a vulnerability in a dependency of axios (it's an older project). Getting rid of these dependencies is a much more attractive solution than merely upgrading them.
thewisenerd•2h ago
isn't upgrading node going to ba bigger challenge? (if you're on a node version that's no longer receiving maintenance)
franciscop•4h ago
As a library author it's the opposite, while fetch() is amazing, ESM has been a painful but definitely worth upgrade. It has all the things the author describes.
farkin88•4h ago
Interesting to get a library author's perspective. To be fair, you guys had to deal with the whole ecosystem shift: dual package hazards, CJS/ESM compatibility hell, tooling changes, etc so I can see how ESM would be the bigger story from your perspective.
franciscop•3h ago
I'm a small-ish time author, but it was really painful for a while since we were all dual-publishing in CJS and ESM, which was a mess. At some point some prominent authors decided to go full-ESM, and basically many of us followed suit.

The fetch() change has been big only for the libraries that did need HTTP requests, otherwise it hasn't been such a huge change. Even in those it's been mostly removing some dependencies, which in a couple of cases resulted in me reducing the library size by 90%, but this is still Node.js where that isn't such a huge deal as it'd have been on the frontend.

Now there's an unresolved one, which is the Node.js streams vs WebStreams, and that is currently a HUGE mess. It's a complex topic on its own, but it's made a lot more complex by having two different streaming standards that are hard to match.

farkin88•3h ago
What a dual-publishing nightmare. Someone had to break the stalemate first. 90% size reduction is solid even if Node bundle size isn't as critical. The streams thing sounds messy, though. Two incompatible streaming standards in the same runtime is bound to create headaches.
bikeshaving•1h ago
The fact that CJS/ESM compatibility issues are going away indicates it was always a design choice and never a technical limitation (most CJS format code can consume ESM and vice versa). So much lost time to this problem.
vinnymac•4h ago
Undici in particular is very exciting as a built-in request library, https://undici.nodejs.org
farkin88•3h ago
Undici is solid. Being the engine behind Node's fetch is huge. The performance gains are real and having it baked into core means no more dependency debates. Plus, it's got some great advanced features (connection pooling, streams) if you need to drop down from the fetch API. Best of both worlds.
pbreit•3h ago
It has always astonished me that platforms did not have first class, native "http client" support. Pretty much every project in the past 20 years has needed such a thing.

Also, "fetch" is lousy naming considering most API calls are POST.

rendall•1h ago
That's a category error. Fetch is just refers to making a request. POST is the method or the HTTP verb used when making the request. If you're really keen, you could roll your own

  const post = (url) => fetch(url, {method:"POST"})
catlifeonmars•1h ago
I read this as OP commenting on the double meaning of the category. In English, “fetch” is a synonym of “GET”, so it’s silly that “fetch” as a category is independent of the HTTP method
catlifeonmars•1h ago
“Most” is doing a lot of heavy lifting here. I use plenty of APIs that are GET
exhaze•3h ago
Tangential, but thought I'd share since validation and API calls go hand-in-hand: I'm personally a fan of using `ts-rest` for the entire stack since it's the leanest of all the compile + runtime zod/json schema-based validation sets of libraries out there. It lets you plug in whatever HTTP client you want (personally, I use bun, or fastify in a node env). The added overhead is totally worth it (for me, anyway) for shifting basically all type safety correctness to compile time.

Curious what other folks think and if there are any other options? I feel like I've searched pretty exhaustively, and it's the only one I found that was both lightweight and had robust enough type safety.

farkin88•2h ago
Type safety for API calls is huge. I haven't used ts-rest but the compile-time validation approach sounds solid. Way better than runtime surprises. How's the experience in practice? Do you find the schema definition overhead worth it or does it feel heavy for simpler endpoints?
_heimdall•1h ago
I always try to throw schema validation of some kind in API calls for any codebase I really need to be reliable.

For prototypes I'll sometimes reach for tRPC. I don't like the level of magic it adds for a production app, but it is really quick to prototype with and we all just use RPC calls anyway.

For procudtion I'm most comfortable with zod, but there are quite a few good options. I'll have a fetchApi or similar wrapper call that takes in the schema + fetch() params and validates the response.

pnappa•1h ago
How do you supply the schema on the other side?

I found that keeping the frontend & backend in sync was a challenge so I wrote a script that reads the schemas from the backend and generated an API file in the frontend.

jbryu•2h ago
Just last week I was about to integrate `ts-rest` into a project for the same reasons you mentioned above... before I realized they don't have express v5 support yet: https://github.com/ts-rest/ts-rest/issues/715

I think `ts-rest` is a great library, but the lack of maintenance didn't make me feel confident to invest, even if I wasn't using express. Have you ever considered building your own in-house solution? I wouldn't necessarily recommend this if you already have `ts-rest` setup and are happy with it, but rebuilding custom versions of 3rd party dependencies actually feels more feasible nowadays thanks to LLMs. I ended up building a stripped down version of `ts-rest` and am quite happy with it. Having full control/understanding of the internals feels very good and it surprisingly only took a few days. Claude helped immensely and filled a looot of knowledge gaps, namely with complicated Typescript types. I would also watch out for treeshaking and accidental client zod imports if you decide to go down this route.

I'm still a bit in shock that I was even able to do this, but yeah building something in-house is definitely a viable option in 2025.

cassepipe•1h ago
For what it's worth, happy user of ts-rest here. Best solution I landed upon so far.
avandekleut•58m ago
Also want to shout out ts-rest. We have a typescript monorepo where the backend and frontend import the api contract from a shared package, making frontend integration both type-safe and dead simple.
synergy20•3h ago
axios works for both node and browser in production code, not sure if fetch can do as much as axios in browser though
tanduv•3h ago
I never really liked the syntax of fetch and the need to await for the response.json, implementing additional error handling -

  async function fetchDataWithAxios() {
    try {
      const response = await axios.get('https://jsonplaceholder.typicode.com/posts/1');
      console.log('Axios Data:', response.data);
    } catch (error) {
      console.error('Axios Error:', error);
    }
  }



  async function fetchDataWithFetch() {
    try {
      const response = await fetch('https://jsonplaceholder.typicode.com/posts/1');

      if (!response.ok) { // Check if the HTTP status is in the 200-299 range
        throw new Error(`HTTP error! status: ${response.status}`);
      }

      const data = await response.json(); // Parse the JSON response
      console.log('Fetch Data:', data);
    } catch (error) {
      console.error('Fetch Error:', error);
    }
  }
farkin88•3h ago
Yeah, that's the classic bundle size vs DX trade-off. Fetch definitely requires more boilerplate. The manual response.ok check and double await is annoying. For Lambda where I'm optimizing for cold starts, I'll deal with it, but for regular app dev where bundle size matters less, axios's cleaner API probably wins for me.
hn_throwaway_99•56m ago
Agreed, but I think that in every project I've done I've put at least a minimal wrapper function around axios or fetch - so adding a teeny bit more to make fetch nicer feels like tomayto-tomahto to me.
TheRealPomax•34m ago
Those... are not mutually exclusive as killer upgrade. No longer having to use a nonsense CJS syntax is absolutely also a huge deal.

Web parity was "always" going to happen, but the refusal to add ESM support, and then when they finally did, the refusal to have a transition plan for making ESM the default, and CJS the fallback, has been absolutely grating for the last many years.

andai•26m ago
16 years after launch, the JS runtime centered around network requests now supports network requests out of the box.
kfuse•5h ago
Node now has limited supports for Typescript and has SQLite built in, so it becomes really good for small/personal web oriented projects.
yawnxyz•5h ago
I feel like node and deno conventions are somehow merging (which is a good thing)
mdhb•2h ago
I think this partly at least is coming from the WinterCG efforts.
upcoming-sesame•1h ago
Yes around web standards
azangru•4h ago
Matteo Collina says that the node fetch under the hood is the fetch from the undici node client [0]; and that also, because it needs to generate WHATWG web streams, it is inherently slower than the alternative — undici request [1].

[0] - https://www.youtube.com/watch?v=cIyiDDts0lo

[1] - https://blog.platformatic.dev/http-fundamentals-understandin...

vinnymac•3h ago
If anyone is curious how they are measuring these are the benchmarks: https://github.com/nodejs/undici/blob/main/benchmarks/benchm...

I did some testing on an M3 Max Macbook Pro a couple of weeks ago. I compared the local server benchmark they have against a benchmark over the network. Undici appeared to perform best for local purposes, but Axios had better performance over the network.

I am not sure why that was exactly, but I have been using Undici with great success for the last year and a half regardless. It is certainly production ready, but often requires some thought about your use case if you're trying to squeeze out every drop of performance, as is usual.

rco8786•4h ago
I've been away from the node ecosystem for quite some time. A lot of really neat stuff in here.

Hard to imagine that this wasn't due to competition in the space. With Deno and Bun trying to eat up some of the Node market in the past several years, seems like the Node dev got kicked into high gear.

amclennon•4h ago
Some good stuff in here. I had no idea about AsyncIterators before this article, but I've done similar things with generators in the past.

A couple of things seem borrowed from Bun (unless I didn't know about them before?). This seems to be the silver lining from the constant churn in the Javascript ecosystem

prmph•4h ago
I think slowly Node is shaping up to offer strong competition to Bun.js, Deno, etc. such that there is little reason to switch. The mutual competition is good for the continued development of JS runtimes
gear54rus•4h ago
Slowly, yes, definitely welcome changes. I'm still missing Bun's `$` shell functions though. It's very convenient to use JS as a scripting language and don't really want to run 2 runtimes on my server.
adriancooney•4h ago
You might find your answer with `zx`: https://google.github.io/zx/
denysonique•59m ago
Or YavaScript https://github.com/suchipi/yavascript
serguzest•4h ago
One thing you should add to section 10 is encouraging people to pass `cause` option while throwing new Error instances. For example

new Error("something bad happened", {cause:innerException})

upcoming-sesame•1h ago
Cool didn't know about this
fleebee•4h ago
Nice post! There's a lot of stuff here that I had no idea was in built-in already.

I tried making a standalone executable with the command provided, but it produced a .blob which I believe still requires the Node runtime to run. I was able to make a true executable with postject per the Node docs[1], but a simple Hello World resulted in a 110 MB binary. This is probably a drawback worth mentioning.

Also, seeing those arbitrary timeout limits I can't help but think of the guy in Antarctica who had major headaches about hardcoded timeouts.[2]

[1]: https://nodejs.org/api/single-executable-applications.html

[2]: https://brr.fyi/posts/engineering-for-slow-internet

llimllib•4h ago
I have a blog post[1] and accompanying repo[2] that shows how to use SEA to build a binary (and compares it to bun and deno) and strip it down to 67mb (for me, depends on the size of your local node binary).

[1]: https://notes.billmill.org/programming/javascript/Making_a_s...

[2]: https://github.com/llimllib/node-esbuild-executable#making-a...

sgarland•52m ago
> 67 MB binary

I hope you can appreciate how utterly insane this sounds to anyone outside of the JS world. Good on you for reducing the size, but my god…

refulgentis•4h ago
The LLM made this sound so epic: "The node: prefix is more than just a convention—it’s a clear signal to both developers and tools that you’re importing Node.js built-ins rather than npm packages. This prevents potential conflicts and makes your code more explicit about its dependencies."
wavemode•4h ago
so in other words, it's a convention
Hackbraten•3h ago
Also no longer having to use an IIFE for top-level await is allegedly a „game changer.“
bashtoni•3h ago
Agreed. It's surprising to see this sort of slop on the front page, but perhaps it's still worthwhile as a way to stimulate conversation in the comments here?
refulgentis•3h ago
I have an increasing feeling of doom re: this.

The forest is darkening, and quickly.

Here, I'd hazard that 15% of front page posts in July couldn't pass a "avoids well-known LLM shibboleths" check.

Yesterday night, about 30% of my TikTok for you page was racist and/or homophobic videos generated by Veo 3.

Last year I thought it'd be beaten back by social convention. (i.e. if you could showed it was LLM output, it'd make people look stupid, so there was a disincentive to do this)

The latest round of releases was smart enough, and has diffused enough, that seemingly we have reached a moment where most people don't know the latest round of "tells" and it passes their Turing test., so there's not enough shame attached to prevent it from becoming a substantial portion of content.

I commented something similar re: slop last week, but made the mistake of including a side thing about Markdown-formatting. Got downvoted through the floor and a mod spanking, because people bumrushed to say that was mean, they're a new user so we should be nicer, also the Markdown syntax on HN is hard, also it seems like English is their second language.

And the second half of the article was composed of entirely 4 item lists.

jmkni•2h ago
I learned quite a few new things from this, I don't really care if OP filtered it through an LLM before publishing it
refulgentis•2h ago
Same, but, I'm struggling with the idea that even if I learn things I haven't before, at the limit, it'd be annoying if we gave writing like this a free pass continuously - I'd argue filtered might not be the right word - I'd be fine with net reduction. Theres something bad about adding fluff (how many game changers were there?)

An alternative framing I've been thinking about is, there's clearly something bad when you leave in the bits that obviously lower signal to noise ratio for all readers.

Then throw in the account being new, and, well, I hope it's not a harbinger.*

* It is and it's too late.

asgr•4h ago
Deno has sandboxing tho
serguzest•3h ago
I love Node's built-in testing and how it integrates with VSCode's test runner. But I still miss Jest matchers. The Vitest team ported Jest matchers for their own use. I wish there were a similar compatibility between Jest matchers and Node testing as well.
tkzed49•3h ago
assertions in node test feel very "technically correct but kind of ugly" compared to jest, but I'll use it anyway
serguzest•59m ago
yes but consider this Jest code, replicating such in node testing is painful. testing code should be DSL-like, should be very easy to read.

            expect(bar).toEqual(
                expect.objectContaining({
                    symbol: `BTC`,
                    interval: `hour`,
                    timestamp: expect.any(Number),
                    o: expect.any(Number),
                    h: expect.any(Number),
                    l: expect.any(Number),
                    c: expect.any(Number),
                    v: expect.any(Number)
                })
            );
vinnymac•3h ago
Currently for very small projects I use the built in NodeJS test tooling.

But for larger and more complex projects, I tend to use Vitest these days. At 40MBs down, and most of the dependency weight falling to Vite (33MBs and something I likely already have installed directly), it's not too heavy of a dependency.

serguzest•1h ago
It is based on vite and a bundler has no place in my backend. Vite is based on roll-up, roll-up uses some other things such as swc. I want to use typescript projects and npm workspaces which vite doesn't seem to care about.
austin-cheney•3h ago
I see two classes of emerging features, just like in the browser:

1. new technologies

2. vanity layers for capabilities already present

It’s interesting to watch where people place their priorities given those two segments

ctoth•3h ago
One man's "vanity layers?" is another man's ergonomics.
spankalee•2h ago
And in many of the cases talked about here, the "vanity layers" are massive interoperability improvements.
insin•3h ago
"SlopDetector has detected 2 x seamlessly and 7 x em-dash, would you like to continue?"
Lockal•3h ago
Screaming "you’re not just writing contemporary code—you’re building applications that are more maintainable, performant, and aligned"
vinnymac•3h ago
You no longer need to install chalk or picocolors either, you can now style text yourself:

`const { styleText } = require('node:util');`

Docs: https://nodejs.org/api/util.html#utilstyletextformat-text-op...

bravesoul2•3h ago
Anyone else find they discover these sorts of things by accident. I never know when a feature was added but vague ideas of "thats modern". Feels different to when I only did C# and you'd read the new language features and get all excited. In a polyglot world and just the rate even individual languages evolve its hard to keep up! I usually learn through osmosis or a blog post like this (but that is random learning).
moralestapia•2h ago
I'm truly a fan of node (and V8) so once in a while (2-3 months?) I read their release notes and become aware of these things.

Sometimes I also read the proposals, https://github.com/tc39/proposals

I really want the pipeline operator to be included.

panzi•3h ago
Unless it changed how NodeJS handles this you shouldn't use Promise.all(). Because if more than one promise rejects then the second rejection will emit a unhandledRejection event and per default that crashes your server. Use Promise.allSettled() instead.
vinnymac•3h ago
Promise.all() itself doesn't inherently cause unhandledRejection events. Any rejected promise that is left unhandled will throw an unhandledRejection, allSettled just collects all rejections, as well as fulfillments for you. There are still legitimate use cases for Promise.all, as there are ones for Promise.allSettled, Promise.race, Promise.any, etc. They each serve a different need.

Try it for yourself:

> node

> Promise.all([Promise.reject()])

> Promise.reject()

> Promise.allSettled([Promise.reject()])

Promise.allSettled never results in an unhandledRejection, because it never rejects under any circumstance.

mijkal•2h ago
When using Promise.all(), it won't fail entirely if individual promises have their own .catch() handlers.
kaoD•2h ago
This didn't feel right so I went and tested.

    process.on("uncaughException", (e) => {
        console.log("uncaughException", e);
    });

    try {
        const r = await Promise.all([
            Promise.reject(new Error('1')),
            new Promise((resolve, reject) => {
                setTimeout(() => reject(new Error('2'), 1000));
            }),
        ]);

        console.log("r", r);
    } catch (e) {
        console.log("catch", e);
    }

    setTimeout(() => {
        console.log("setTimeout");
    }, 2000);
Produces:

    alvaro@DESKTOP ~/Projects/tests
    $ node -v
    v22.12.0

    alvaro@DESKTOP ~/Projects/tests
    $ node index.js 
    catch Error: 1
        at file:///C:/Users/kaoD/Projects/tests/index.js:7:22
        at ModuleJob.run (node:internal/modules/esm/module_job:271:25)
        at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:547:26)
        at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:116:5)
    setTimeout
So, nope. The promises are just ignored.
MuffinFlavored•3h ago
Is current node.js a better language than .NET 6/7/8/9, why or why not?
bloomca•3h ago
Node.js is a runtime, not a language. It is quite capable, but as per usual, it depends on what you need/have/know, ASP.NET Core is a very good choice too.
MuffinFlavored•2h ago
> ASP.NET Core is a very good choice too.

I have found this to not be true.

jiggawatts•1h ago
Recently?

In my experience ASP.NET 9 is vastly more productive and capable than Node.js. It has a nicer developer experience, it is faster to compile, faster to deploy, faster to start, serves responses faster, it has more "batteries included", etc, etc...

What's the downside?

jiggawatts•1h ago
In my experience, no.

It's still single-threaded, it still uses millions of tiny files (making startup very slow), it still has wildly inconsistent basic management because it doesn't have "batteries included", etc...

NackerHughes•3h ago
Be honest. How much of this article did you write, and how much did ChatGPT write?
Our_Benefactors•2h ago
What, surely you’re not implying that bangers like the following are GPT artifacts!? “The changes aren’t just cosmetic; they represent a fundamental shift in how we approach server-side JavaScript development.”
jameshart•2h ago
And now we need to throw the entire article out because we have no idea whether any of these features are just hallucinations.
growbell_social•3h ago
I'm just happy to see Node.js patterns as a #1 on HN after continually being dismissed from 2012-2018.
nikanj•2h ago
By the time you finish reading this guide and update your codebase, the state-of-the-art JS best practices have changed at least twice
ale•2h ago
Why bother with node when bun is a much better alternative for new projects?
tonypapousek•2h ago
Why bother with bun when deno 2 is a much better alternative for new projects?
0x073•2h ago
Why bother with deno 2 when node 22 is a much better alternative for new projects?

(closing the circle)

crabmusket•1h ago
I am being sincere and a little self deprecating when I say: because I prefer Gen X-coded projects (Node, and Deno for that matter) to Gen Z-coded projects (Bun).

Bun being VC-backed allows me to fig-leaf that emotional preference with a rational facade.

DimmieMan•37m ago
I think I kind of get you, there's something I find off putting about Bun like it's a trendy ORM or front end framework where Node and Deno are trying to be the boring infrastructure a runtime should be.

Not to say Deno doesn't try, some of their marketing feels very "how do you do fellow kids" like they're trying to play the JS hype game but don't know how to.

simonw•2h ago
Whoa, I didn't know about this:

  # Run with restricted file system access
  node --experimental-permission \
    --allow-fs-read=./data --allow-fs-write=./logs app.js
  
  # Network restrictions
  node --experimental-permission \
    --allow-net=api.example.com app.js
Looks like they were inspired by Deno. That's an excellent feature. https://docs.deno.com/runtime/fundamentals/security/#permiss...
rvz•1h ago
Perhaps the technology that you are using is loaded with hundreds of foot-guns if you have to spend time on enforcing these patterns.

Rather than taking the logical focus on making money, it is wasting time on shuffling around code and being an architecture astronaut with the main focus on details rather than shipping.

One of the biggest errors one can make is still using Node.js and Javascript on the server in 2025.

jmull•21m ago
Something's missing in the "Modern Event Handling with AsyncIterators" section.

The demonstration code emits events, but nothing receives them. Hopefully some copy-paste error, and not more AI generated crap filling up the internet.