TE
科技回声
首页24小时热榜最新最佳问答展示工作
GitHubTwitter
首页

科技回声

基于 Next.js 构建的科技新闻平台,提供全球科技新闻和讨论内容。

GitHubTwitter

首页

首页最新最佳问答展示工作

资源链接

HackerNews API原版 HackerNewsNext.js

© 2025 科技回声. 版权所有。

The node.js aesthetic

136 点作者 substack超过 13 年前

8 条评论

gbog超过 13 年前
Hmm, seems a bit hand-waving to me, but to be fair I have never tried Node.js and would probably have hard time convincing my finger to type javascript code for server things.<p>Javascript always seemed to me a language that you used, and tried to use correctly, because you <i>had</i> to. On a server I have the choice, right? So my choice is currently Python so I read this article with some bias.<p>In the section "batteries not included":<p>&#62; modules in the core distribution get an unfair advantage over the libraries in userspace by virtue of availability and prominance.<p>I would call it "unfair" if some modules had access to special backdoors and APIs, but it seem to not be the case for most modules I checked in Python. For instance, 20 mn ago, I did vim /usr/lib64/python2.6/unittest.py and could check this piece of code directly. I did see no special magic that could not be provided by other modules, like Nose or py.test. Moreover, the code was not looking like "neglected code", even if it did not look like the most modern kind.<p>&#62; experimenting, and iterating is much harder<p>Well, that's what I like the most with core modules: they don't change overnight, and, while some of them like urllib(2) may be replaced by some because they have a better competitor, most of them are just good old friends, like scipy, that don't need to be put upside down every month because someone found a slightly more elegant way to call two of it's functions.<p>&#62; "core modules"' advantage evaporates in the face of baked-in concurrent library versioning and sophisticated package management.<p>I have never been considered as a shy sysadmin when I was sysadmin. I am actually strongly against the "Tool X have misbehaved once therefore tool X is evil and will never put a foot again on my machine" philosophy. I know some guys who are. (I was also sound engineer before and mostly all musicians I met are this way, by the way). But still, having dealt with library version issues sometimes, I think "concurrent library versioning" and "sophisticated package management" sound awfully nightmarishly black-magic to me. I guess I would be more on the "let's understand the most of what happens and not change what don't need to" kind.
评论 #3295281 未加载
评论 #3296168 未加载
评论 #3295501 未加载
评论 #3295353 未加载
评论 #3296611 未加载
评论 #3295266 未加载
评论 #3295662 未加载
zzzeek超过 13 年前
&#62;You don't need to reason about multiple instruction pointers or mutexes or re-entrant, interruptible execution because all the javascript you write just lives in a single thread.<p>I see....on the other hand, when I write request-handling code using (any web framework ever on any platform), you're suggesting that we <i>do</i> worry about mutexes and reentrance (not to mention, handling a single request uses <i>multiple</i> threads?) and that these details aren't already handled by (any web framework ever) ?<p>Interesting.
评论 #3295594 未加载
评论 #3295509 未加载
评论 #3296025 未加载
评论 #3295741 未加载
评论 #3295452 未加载
评论 #3296306 未加载
sktrdie超过 13 年前
The way modules are looked up - localized to the piece of code that needs it, inside the /node_modules directory - is one of the greatest strengths of the node ecosystem.<p>It's just dead simple and solves dependency conflicts like nothing I've ever seen before.
munificent超过 13 年前
&#62; So if a module "foo" was tested against and depends on "baz@0.1.x" and a module "bar" depends on "baz@0.2.x", then when you go to use both "foo" and "bar" in your own program, "foo" and "bar" will both use the version of "baz" that they were tested and depend against!<p>That sounds like a recipe for disaster if I get an object from "bar" that came from "baz@0.2.x" and try to give it to "foo" which then gives it to "baz@0.1.x".<p>I'm suspicious of silver bullets in general and I'm deeply suspicious of any silver bullet that claims to slay version hell. Versioning is hard.
评论 #3296922 未加载
评论 #3296208 未加载
scubaguy超过 13 年前
&#62; Instead of the http server being an external service that we configure to run our code, it becomes just another tool in our arsenal.<p>This is unfair. If I create a framework cal Java.js and make it possible to create a httpserver by running server.start(8080, aCallbackObject), does that make Java great? One day someone might make node.js "configurable" via a configuration file (that is not written in JavaScript). Will having a configuration file make node.js less useful?<p>&#62; Note also that the http snippet from earlier isn't inheriting from an http.Server base class or anything of the sort.<p>That is also unfair. You typically don't use inheritance in JavaScript because you can compose objects or clone from a prototype. There is no static analysis of classes, which in the main benefit of classical inheritance. Programming via callbacks is simply the JavaScript style. This might even change when the language provides better support for classes, or when more people write their node.js code using CoffeeScript.<p>&#62; If software ecosystems are like economies then core libraries are at best government bureaucracies and at worst nationalized state corporations.<p>This is very subjective and I strongly disagree. There is a great advantage in using a language and framework that has a strong core library and a common way of doing thing, especially when you start building teams or start recruiting people to maintain legacy code. If anything, Node should start including more batteries, such as a module for concurrency.<p>PS - Here's the thing. I am really excited about the event driven nature of node.js and the community. However, I am new to node.js and I want to see quality critical analysis of its strength and weaknesses. If you are going to tell me its great, you better have pretty solid reasons. This article simply doesn't cut it.
phamilton超过 13 年前
Could someone clarify something for me?<p>Is http.createServer robust enough for production?<p>It is my understanding that running it as is in production is not a good idea. You want to at least configure nginx between node and the world. If that's the case, doesn't that undermine the whole "focus on your application, not the configuration" point he's making? Sure you can call startServer multiple times, but then you would still have to focus on configuration.
评论 #3295765 未加载
评论 #3296490 未加载
评论 #3296074 未加载
评论 #3297465 未加载
koen超过 13 年前
&#62; A big part of what empowers node to make these kinds of interfaces possible is its asynchronous nature. No longer do you have statelessness imposed from on high by the likes of apache or rails. You can keep intermediate state around in memory just like in any ordinary program.<p>Should that not be:<p>A big part of what empowers node to make these kinds of interfaces possible is its "statefull" nature. ...<p>Really, that it is asynchronous is nice for performance (but only complicates the implementation). But the fact that you keep state in memory is indeed a big win for ease of implementation, and also performance, especially if state is not global but only relates to a single session. Of course, that is usually frowned upon by the web developer community which believes that this somehow hurts scalability (while it actually helps scalability).
评论 #3296750 未加载
评论 #3295913 未加载
MostAwesomeDude超过 13 年前
I find the spinning in this article to be <i>incredible</i>.<p>The "limited surface area" is all well and fine in JS, because <i></i>there is no object inheritance in JavaScript<i></i>. The author tries to emphasize usability over extensibility, which is a false dilemma in my book since it's possible to code to an <i>interface</i> in other languages. You define a usable interface, and then everybody codes things that fit that interface. You don't even have to care about whether your objects are inherited or composed. Of course, languages with inheritance are even more reusable because it's possible to inherit from, and extend, objects which implement the given interface. This is a key tenet of design in Java and Python.<p>The second part of "limited surface area" talks about how namespaces and qualified imports are great. Yep. Welcome to the party, guys. You're only a couple decades late.<p>The "batteries not included" section is a great dig at Python, but he could have bothered to actually bring up examples. It's easy; things like asyncore are so god-awful that it's trivial to point out where Python's batteries have expired.<p>However, he's comparing apples and pomegranates here; Node is not a language! It's a <i>framework</i>. It has a large library of its own which doesn't come standard with JS. That library provides stuff which is built-in on other languages, like unit testing, cryptographic primitives, zlib, filesystem accessors, URL handlers, buffers, iterables, type checkers, and a REPL. To repeat: <i></i>These are batteries which are native to other languages.<i></i><p>Let's go ahead and compare with Twisted, shall we? I'll omit things for which Twisted provides protocols and Node provides streams, since those are (technically) equivalent. Node doesn't appear to contain these things which Twisted provides: Common protocols for handling lines, netstrings, and prefixed strings; non-blocking stdio as a protocol, serial port as a protocol, DNS as a protocol, a DNS server, a handful of RPC protocols like XML-RPC, AMP, and PB; and full suites for: NNTP, telnet, SSH, mail, more chat protocols than I care to remember... Not to mention powerful utilities like credential handling, and enhancements to the Python standard library like object-based file and module handling. And that's just what's included in the main tarball; there's a big community of third-party code which implements whatever you might happen to need. I didn't bother to list the reverse, because <i></i>there is nothing in Node which is not in Twisted<i></i>.<p>"Core distributions with too many modules result in neglected code that can't make meaningful changes without breaking everything." Are you not aware of deprecation? Write the new code, mark the old code as broken or deprecated, wait a few years, remove the old code. This isn't hard. Of course, if Node or JS actually provided useful tools to mark things as deprecated, it might happen more often. Python's got DeprecationWarning; why doesn't Node?<p>The "radical reusability" section is just the author realizing that modules are awesome. Again, welcome to the party.
评论 #3296361 未加载
评论 #3296494 未加载
评论 #3296314 未加载
评论 #3297559 未加载