7 ms·
Node.js Fundamentals: Web Server Without Dependencies
- keketi 8y agoBut can it left pad a string?
- GordonS 8y agoJavaScript has come a long way in recent years, but the lack of a comprehensive standard library is still absolutely mind boggling.
- emilfihlman 8y agoThis is really pretty sad. A standard library is paramount to a stable and easy to develop ecosystem.
- hombre_fatal 8y agoIt may be, but this is a weird thread to bring that up since Javascript has padStart, and TFA is about building a web server with only the standard library.
- nurettin 8y agothe OP was referring to this incident https://github.com/stevemao/left-pad/issues/4 https://github.com/stevemao/left-pad/issues/4 where a very basic package everyone depended on was yanked from npmjs. azer's original post: https://news.ycombinator.com/item?id=11340510 https://news.ycombinator.com/item?id=11340510
- paulddraper 8y agoJavaScript's standard library has a fair amount. Not Python levels of completeness, but near Java levels. The parent's example is String.prototype.padStart() [1] [1] https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...
- ng12 8y agoWhat are you missing from the native language + lodash?
- GordonS 8y agoWhile it's a valid point that lodash provides a lot, my point is that with any other language I've ever used, I don't need to add something like lodash.
- Siilwyn 8y agoYes, it is called `padStart`: https://devdocs.io/javascript/global_objects/string/padstart https://devdocs.io/javascript/global_objects/string/padstart
- dang 8y agoPlease don't do this here.
- aaaaaaass 8y agowhy, that is a valid question.
- deleted 8y ago[deleted]
- gyrgtyn 8y agoLove this. There was this project along the same lines, from the olden days of node: https://github.com/Raynos/http-framework https://github.com/Raynos/http-framework
- jpalomaki 8y agoIMHO articles like this played a major role in Node's initial success. After years of working with ever-growing frameworks with huge learning curves, it was so refreshing to get your first thing running in few seconds. Felt like basic in the 1980s or PHP in the late 1990s.
- hardwaresofton 8y agoIIRC before nodejs+express the req/resp/next paradigm and middleware paradigm had never been so accessible. Other frameworks had it of course, but it was often hidden behind layers of abstraction or little quibbly bits. Express gave you just what you needed for both middleware and handlers: app.get('/', function(req, res, next) { res.send('hello world'); }) For comparison, flask: @app.route("/", method='GET') def hello(): return "Hello World!" It's really close, but I find the NodeJS approach even simpler and easier to understand. Need to access the request? use `req`. Need to access the response to set headers or something? use `res`. Is your function actually a middleware? use `next`. It doesn't get much simpler, assuming you understand node's semantics well (as in "return"ing a value doesn't mean it gets sent). Django/Rails required whole project scaffolds and usually a separate routes and handlers files and knowing a whole bunch of stuff. I'm not even going to get into what frameworks like Spring/Struts required. NodeJS made it dead simple to get a HTTP server up and running in something like <10 lines of code. People shit on JS and NodeJS every chance they get, but innovations like the amazing standard library (and express), along with npm's ease of use really pushed the field forward IMO. While I'm praising node I might as well say that node got decent bolt-on (gradual) type system support way faster than the other popular dynamic languages as well, but they got there through transpiling which also looked (is?) ridiculous the first time it became well-known. I find Typescript much more approachable than typed python[0]. Is typed ruby even a thing[1]? I don't keep up with ruby so I'm not sure. [0]: https://docs.python.org/3/library/typing.html https://docs.python.org/3/library/typing.html [1]: https://bugs.ruby-lang.org/issues/9999 https://bugs.ruby-lang.org/issues/9999
- oweiler 8y agoI agree for the most part, except comparing node/express to Rails: node's equivalent in the Ruby world would the Sinatra, which is about as succinct than node.
- brod 8y agoThere are a lot of gotcha's when rolling your own web server based on the http and https packages and I think the conclusion of the article could have gone further in addressing what they are and in what context they might matter. I recently wrote a little zero-dependency NodeJs http/s server[1] with an equally dumb router for some dev tools which could benefit from a simple, promise based api, for most other use cases I'd just pull in express or something more mature. [1]https://github.com/8eecf0d2/decade https://github.com/8eecf0d2/decade
- nurettin 8y agoyou can do the same (except loading certs) with python3 these days thanks to asyncio.
- Vanit 8y agoI still write little http servlets like this sometimes, especially for something like gluing IoT services together.
- tofflos 8y agoIt's nice to get away from frameworks from time to time. If anyone is interested in something similar written in Java I recently created a couple of examples based on Undertow. They are available at https://github.com/tofflos/undertow-examples https://github.com/tofflos/undertow-examples.
- craftoman 8y agoPerformance is also a major advantage. Express is extremely slow compared to a basic "native" API without dependencies. If you check out the results in numbers, you'll be amazed.
- tozeur 8y agoPlease post some citations to back up your performance claims. I haven’t found strong numbers online.
- asien 8y ago> Please post some citations to back up your performance claims. According to TechEmpower benchmark[0],Node.js-MySQL is two time faster than express-mysql. Others benchmarks of TechEmpower tend to point exactly the same result in terms of performance for express. [0] https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query https://www.techempower.com/benchmarks/#section=data-r17&hw=...
- gbuk2013 8y agoExpress is not actually that much slower - I tested it when I wrote a light-weight Express replacement[1] for my own use (which was mainly about reducing the number of dependency packages from 40+ to 2). IIRC the slowest part was the default 404 router. I was testing with only a few routes though - maybe it gets slower with more (IIRC Express architecture is that all routes are run in serial, so those defined last have to go through all the previous routes first). That and I didn’t add any latency to my tests to make it like the real world - that always has an interesting effect on results. :) Maybe I should re-run those tests for fun … [1] https://github.com/borisovg/node-web-framework/blob/master/README.md https://github.com/borisovg/node-web-framework/blob/master/R...
- newsbinator 8y agoFor performance, I prefer Fastify rather than Express (https://www.fastify.io https://www.fastify.io).
- lioeters 8y agoGreat article. Anyone working with Node.js should be familiar with these fundamentals. It also demonstrates the simplicity (and dare I say "elegance", though that's subjective..) of Node.js and its concepts. These days my favorite library for writing an HTTP server is micro [0] (and a few middlewares). I like how it provides a minimal, functional layer of abstraction. [0] https://github.com/zeit/micro https://github.com/zeit/micro
- mirekrusin 8y agoNot 100% related to the article but koa with its maybe 300 LoC is hardly a dependency. However in general nodejs projects definitely suffer from dependency bloat. I encourage anybody to try for themselves to go through node_modules in their own projects, it’s quite englightning to see the scale of the unnecessary, duplicated, reimplementated in different ways crap there. Conscious aim at shallow, minimal or no dependency in packages and end apps is definitely something good; less than 5s installs, code audits, more healthy projects in general. I’m not saying it’s always possible or better to trim the code fat, but if you’re aware of dependency tree single root dep introduces you’re usually able to cut it down a lot.
- asien 8y agoKoa is appreciated to it's true value by the community. Express was the most popular at the start and after StrongLoop got acquired by IBM it made sense for everyone that express was the foundation of Node.JS. It's sad knowing how much bloated express is and every single Node.js library uses it from Next to GraphQL server etc...
- tonyedgecombe 8y ago700 LoC and 40 of its own dependencies.
- partycoder 8y agoThe crimes of these kinds tutorials: - Downplaying the role of error handling - Treating the subjects they cover as a black box - Not warning that the code examples are not suitable for production