如何决定何时使用Node.js?


2195

我对这种东西是陌生的,但是最近我已经听到很多关于Node.js有多出色的信息。考虑到总体上我非常喜欢使用jQuery和JavaScript,我不禁想知道如何决定何时使用Node.js。我想到的Web应用程序有点像Bitly-需要一些内容,然后将其存档。

从过去几天我所做的所有作业中,我获得了以下信息。Node.js

  • 是一种命令行工具,可以作为常规Web服务器运行,并且可以运行一个JavaScript程序
  • 利用强大的V8 JavaScript引擎
  • 需要同时做几件事时非常好
  • 基于事件,因此所有出色的类似于Ajax的工作都可以在服务器端完成
  • 让我们在浏览器和后端之间共享代码
  • 让我们与MySQL对话

我遇到的一些来源是:

考虑到Node.js几乎可以在亚马逊的EC2实例上开箱即用地运行,我试图了解Node.js需要哪种类型的问题,而不是像PHPPythonRuby这样的强大之王。我知道这确实取决于一个人在某种语言上的专业知识,但是我的问题更多地归结为以下一般类别:什么时候使用特定框架,它特别适合哪种类型的问题?


4
正在meta(meta.stackoverflow.com/q/332386/497418)上讨论此问题。
zzzzBov

Answers:


1355

在总结Node.js的出色功能方面,您做了出色的工作。我的感觉是,Node.js特别适用于您想要保持从浏览器到服务器的持久连接的应用程序。使用一种称为“长轮询”的技术,您可以编写一个向用户实时发送更新的应用程序。在Ruby on RailsDjango之类的许多Web巨人上进行长时间的轮询会在服务器上产生巨大的负载,因为每个活动的客户端都要吃掉一个服务器进程。这种情况相当于一次沥青袭击。使用Node.js之类的服务器时,服务器无需为每个打开的连接维护单独的线程。

这意味着您可以在Node.js中创建一个基于浏览器的聊天应用程序,该应用程序几乎不需要占用系统资源即可为大量客户端提供服务。每当您想进行这种长轮询时,Node.js都是一个不错的选择。

值得一提的是,Ruby和Python都具有执行此类操作的工具(分别是eventmachinetwisted),但是Node.js从头开始就表现出色。JavaScript在基于回调的并发模型中处于特殊位置,并且在这里很有用。而且,能够使用客户端和服务器都原生的JSON进行序列化和反序列化非常漂亮。

我期待在这里阅读其他答案,这是一个很棒的问题。

值得指出的是,Node.js对于在客户端/服务器之间重复使用大量代码的情况也非常有用。该流星框架使得这个非常容易,而且很多人都暗示这可能是网络发展的未来。我可以从经验中说,用Meteor编写代码非常有趣,其中很大一部分是花更少的时间思考如何重组数据,因此可以轻松地在浏览器中运行代码操纵它,并将其传递回去。

这是一篇有关金字塔和长轮询的文章,事实证明,在gevent的一点帮助下,设置起来非常容易:TicTacToe和金字塔长轮询


12
是的,我认为'node.js特别适合需要从浏览器回到服务器的持久连接的应用程序非常重要。-诸如聊天程序或互动游戏之类的东西。如果只是构建一个不一定需要用户/服务器通信的应用程序,那么使用其他框架进行开发就可以了,并且所花费的时间会更少。
user482594 2011年

1
谢谢你的回答……很棒的Q和A ;-)我还要考虑掌握一项用于数种不同前端和后端开发的出色技术的概念;)
Stokedout 2013年

12
为什么要使用长轮询?未来和套接字发生了什么?
hitautodestruct

1
我的简短答案是后台流程。请求和响应(包括rest API)都可以使用任何其他语言和服务器来实现。因此,对于那些正在考虑在node中转换其Web项目的人。再想一想!将节点用作后台进程,例如使用imap读取电子邮件,图像处理,将文件上传到云或任何漫长或永无止境的进程,这些进程大多是面向事件的……
Vikas

409

我认为Node.js最适合实时应用程序:在线游戏,协作工具,聊天室或任何一个用户(或机器人?或传感器?)对应用程序有什么要求的其他用户必须立即看到的任何东西,没有页面刷新。

我还应该提到,与长轮询相比,将Socket.IO与Node.js结合使用将减少您的实时延迟。在最坏的情况下,Socket.IO将退回到长时间轮询,如果可用,则改用Web套接字,甚至使用Flash。

但是我还应该提到,使用Node.js可以更好地解决代码可能因线程而阻塞的任何情况。或任何需要应用程序由事件驱动的情况。

同样,Ryan Dahl在一次谈话中说,我曾经参加过,对于常规的旧HTTP请求,Node.js基准测试与Nginx紧密竞争。因此,如果我们使用Node.js进行构建,则可以非常有效地服务于我们的常规资源,并且当我们需要事件驱动的东西时,就可以对其进行处理。

再加上所有时间都是JavaScript。Lingua Franca整个筹码量。


17
只是从某人在.Net和Node之间进行切换的观察得出的结论,在上下文切换时,系统不同区域的不同语言有很大帮助。当我查看Javascript时,我正在客户端中工作,C#表示App Server,SQL =数据库。整个过程中都使用Javascript,我发现自己混淆了这些层,或者只是花了更长的时间进行上下文切换。这可能是一整天都在.NET堆栈上工作而在晚上点头工作的产物,但这确实有所作为。
迈克尔·布莱克本

9
有趣的是,跨文化个体在主流文化与本土文化之间切换时切换方言的做法被称为“代码切换”。
迈克尔·布莱克本

1
就在前几天,我在考虑如何.js以某种方式为不同的文件分配不同的颜色。绿色表示客户端,蓝色表示服务器端。我自己一直在“迷失”。
AJB

209

使用NodeJS的原因:

  • 它运行Javascript,因此您可以在服务器和客户端上使用相同的语言,甚至在它们之间共享一些代码(例如,用于表单验证或在任一端呈现视图)。

  • 单线程事件驱动系统是快速甚至还可以同时处理大量的请求时,也简单,相比传统的多线程的Java或ROR框架。

  • 通过NPM可以访问不断增长的软件包池,包括客户端和服务器端库/模块,以及用于Web开发的命令行工具。其中大多数都方便地托管在github上,有时您可以在其中报告问题,并在数小时内发现问题!将所有内容都放在一个屋顶下非常好,它具有标准化的问题报告和易于分叉的功能。

  • 它已成为事实上的标准环境,可以在其中运行与Javascript相关的工具和与其他Web相关的工具,包括任务运行程序,缩小程序,美化程序,短毛绒,预处理程序,捆绑程序和分析处理器。

  • 它似乎非常适合原型设计,敏捷开发和快速产品迭代

使用NodeJS的原因:

  • 它运行Javascript,而Javascript没有编译时类型检查。对于大型的,复杂的,对安全至关重要的系统,或者包括不同组织之间的协作在内的项目,从长远来看,鼓励合同界面并提供静态类型检查的语言可以为您节省一些调试时间(和爆炸时间)。(尽管JVM一直受困于null,所以请为您的核反应堆使用Haskell。)

  • 除此之外,NPM中的许多软件包都有些原始,并且仍在快速开发中。一些用于较旧框架的库已经经历了十年的测试和错误修复,并且目前非常稳定Npmjs.org没有对包进行评分的机制,这导致了做相同事情的包激增,其中很大一部分不再被维护。

  • 嵌套回调地狱。(当然,有20种不同的解决方案 ...)

  • 不断增长的软件包池可以使一个NodeJS项目与下一个完全不同。由于存在大量可用的选项(例如Express / Sails.js / Meteor / Derby),因此实现的多样性很大。有时候,这会使新开发人员更难以加入Node项目。与Rails开发人员加入现有项目相反:他应该能够很快熟悉该应用程序,因为鼓励所有Rails应用程序使用类似的结构

  • 处理文件可能会有些麻烦。在其他语言中琐碎的事情(例如从文本文件中读取一行)对于使用Node.js来说是很奇怪的,因此有80个以上的表决存在StackOverflow问题。有没有简单的方法从一个CSV文件一次读取一个记录。等等。

我喜欢NodeJS,它快速又狂野又有趣,但是我担心它对可证明的正确性兴趣不大。希望我们最终能够融合两全其美。我渴望看到将来将取代Node的... :)


1
@nane是,我确实认为它们可以解决该问题,但是您必须将自己限制为仅使用以类型安全的语言编写的库,或者接受并非所有代码库都是静态类型的。但是有一个论点:由于无论哪种语言,都应该为代码编写好的测试,因此即使对于动态键入的代码,您的置信度也应该相等。如果我们接受该论点,则强类型化的优点将减少到帮助开发/调试时间,可证明性和优化
joeytwiddle

1
@kervin,我同意某些基准测试会很棒,但是我对可以在网上找到的内容感到失望。有人认为.NET的性能与Node 媲美,但是您实际要做的是至关重要的。Node可能会很好地传递带有多个并发连接的小消息,但对于繁重的数学计算却不是那么好。良好的性能比较将需要测试各种情况。
joeytwiddle

2
@joeytwiddle在处理大型复杂程序和静态类型检查时,像Typescript这样的东西对Node.js不利吗?
CodeMonkey

2
@joeytwiddle表示它的价值,您可以使用stillmaintained.com来确定是否仍维护了npm软件包(因为大多数软件包在github上)。此外,npm searchnpm show会告诉你一个包的最后一个版本的日期。
Dan Pantry

3
通过将Rails与Node进行比较,您会将平台与框架混淆了。Rails是Ruby的框架,就像Sails和meteor是Javascript的框架一样。
BonsaiOak '16

206

简而言之:

Node.js非常适合具有大量并发连接的应用程序,并且每个请求仅需要很少的CPU周期,因为在执行函数期间会阻塞事件循环(与所有其他客户端一起使用)。

Mixu的技术博客很好地介绍了Node.js中的事件循环:了解node.js事件循环


127

我有一个使用Node.js的真实示例。我工作的公司有一位客户希望拥有一个简单的静态HTML网站。该网站用于使用PayPal出售一件商品,客户还希望拥有一个可以显示所售商品数量的柜台。客户预计将有大量访问该网站的访客。我决定使用Node.js和Express.js框架进行计数。

Node.js应用程序很简单。从Redis数据库获取已售商品数量,在售出商品时增加计数器,并通过API将计数器值提供给用户。

我在这种情况下选择使用Node.js的一些原因

  1. 它非常轻巧且快速。在三周内,该网站的访问量已超过200000,并且最少的服务器资源已能够处理所有这些。
  2. 计数器很容易成为实时计数器。
  3. Node.js易于配置。
  4. 有许多免费的模块。例如,我找到了PayPal的Node.js模块。

在这种情况下,Node.js是一个了不起的选择。


7
您如何托管这样的东西?然后,您是否必须在生产服务器上设置nodejs?在Linux中?
Miguel Stevens 2014年

1
有一些PaaS,例如nodejitsu和Heroku。或者,您确实可以在Linux机器上(即从Amazon EC2)设置nodejs。参见:lauradhamilton.com/…–
哈里·

13
1,814,400秒内有200,000次访问。根本不相关。即使是bash,也可以在最慢的服务器上处理这么多请求。临时服务器。最慢的VM。
Tiberiu-Ionuț Stan's

105

使用Node启动下一个项目的最重要原因...

  • 所有最酷的家伙都加入其中...所以它必须很有趣。
  • 您可以在凉爽的地方闲逛,并有很多值得夸耀的Node冒险。
  • 当涉及到云托管成本时,您是一分钱pin。
  • 曾经在那里与Rails做到这一点
  • 您讨厌IIS部署
  • 您过去的IT工作变得越来越乏味,您希望自己处于崭新的起步阶段。

期待什么...

  • 借助Express,您将感到安全无忧,而无需使用您不需要的所有服务器膨胀软件。
  • 像火箭一样运行,并且缩放良好。
  • 你梦到了。您已安装。节点软件包repo npmjs.org是世界上最大的开源库生态系统。
  • 您的大脑将在嵌套的回调中浪费时间...
  • ...直到您学会遵守诺言
  • SequelizePassport是您的新API朋友。
  • 调试大多数异步代码将变得非常有趣
  • 是所有提名人掌握Typescript的时间

谁使用它?

  • 贝宝,Netflix,沃尔玛,LinkedIn,Groupon,Uber,GoDaddy,道琼斯
  • 这就是为什么他们切换到Node的原因。

18
是的,我本可以用传统方式回答这个问题。我认为我有资格这样做,但其中大部分已经讲过了,我认为一些轻松的乐趣会打破单调。我会定期提供其他问题的技术解答。
Tony O'Hagan 2014年

1
可以使用ES6生成器生成异步代码来避免嵌套的回调
重构

1
@CleanCrispCode:的确是!ES6采用了C#样式async/,await因此现在我们可以推出更清晰的异步Node代码,该代码也支持传统的try/ catch。在2016/17年度,JS编码人员将切换到ES6。
Tony O'Hagan

1
数以万计的次数:“无需使用您不需要的所有服务器膨胀软件,借助Express,您将感到安全,放心”
Simone Poggi

60

没有什么比银子弹更像了。一切都伴随着一些成本。就像您吃油腻的食物一样,您会损害自己的健康,健康的食物不会像油腻的食物那样带有香料。他们是想要健康还是在食物中添加香料是个人选择。Node.js被认为用于特定场景的方式相同。如果您的应用程序不适合这种情况,则不应在应用程序开发中考虑它。我只是将我的想法放在相同的地方:

何时使用Node.JS

  1. 如果您的服务器端代码需要很少的cpu周期。在其他情况下,您正在执行非阻塞操作,并且没有繁重的算法/作业,因此不占用大量CPU周期。
  2. 如果您来自Javascript领域,并且喜欢像客户端JS一样编写单线程代码。

何时不使用Node.JS

  1. 您的服务器请求取决于占用大量CPU的算法/作业。

Node.JS的可伸缩性注意事项

  1. Node.JS本身并未利用底层系统的所有核心,并且默认情况下它是单线程的,因此您必须自己编写逻辑以利用多核处理器并使之成为多线程。

Node.JS替代品

还有其他选项可以代替Node.JS,但是Vert.x似乎很有前途,并具有诸如polygot和更好的可伸缩性考虑之类的许多附加功能。


24
我不确定“何时不使用”中列出了“如果您的服务器端请求包含阻止文件IO或套接字IO之类的操作”。如果我的理解是正确的,那么node.js的优势之一就是它具有强大的异步方式来处理IO而不会阻塞。因此,可以将Node.js视为阻止IO的“良方”。
2013年

3
@OndraPeterka:对,Node.js可以解决阻塞服务器IO的问题是正确的,但是,如果服务器上的请求处理程序本身正在对其他Web服务/文件操作进行阻塞调用,Node.js将无济于事。它不阻塞IO,仅用于服务器的传入请求,而不是应用程序请求处理程序的传出请求。
Ajay Tiwari 2013年

4
从@ajay nodejs.org他们说:“非阻塞I / O”,请检查你的“当不是” 2和3
奥马尔·Ithawi

5
在当前版本中,节点实际上通过使用群集来支持多核支持。确实至少两次提高了节点应用程序的性能。但是,我认为稳定群集库时的性能应该是其两倍以上。
南阮

4
您可以使用node.js进行大量计算。使用fork。参见stackoverflow.com/questions/9546225/…。Node通过该cluster模块很好地处理了多个内核。 nodejs.org/api/cluster.html
Jess

41

我认为没有人提到过Node.js的另一件事是令人惊叹的社区,程序包管理系统(npm)以及只需将它们包含在package.json文件中就可以包含的现有模块数量。


6
而且这些软件包都是相对较新的,因此它们具有事后见识的优点,并且倾向于符合最新的Web标准。
joeytwiddle13年

3
出于所有应有的尊重,npm上的许多软件包都很糟糕,因为npm没有评估软件包的机制。来自CPAN的后见之明吗?
Dan Dascalescu 2014年

太糟糕了,没有一个websockets库可以满足rfc 6455规范。当给出这个事实时,node.js的狂热者是聋哑人和盲人。
r3wt 2014年

1
我不知道您何时发表评论,但截至目前,ws库支持该规范
Jonathan Gray

37

我的作品:nodejs非常适合制作实时系统,例如分析,聊天应用程序,api,广告服务器等。该死,我在2小时内使用nodejs和socket.io制作了我的第一个聊天应用程序,而考试周也是如此!

编辑

自从我开始使用nodejs以来已经有好几年了,我将它用于制作许多不同的东西,包括静态文件服务器,简单的分析,聊天应用程序等等。这是我何时使用nodejs的观点

何时使用

在制作强调并发性和速度的系统时。

  • 仅套接字服务器,例如聊天应用程序,irc应用程序等。
  • 社交网络强调实时资源,例如地理位置,视频流,音频流等。
  • 像分析网络应用程序一样,真正快速地处理小块数据。
  • 公开仅REST的api。

什么时候不使用

它是一个非常通用的Web服务器,因此您可以在任何地方使用它,但可能不在这些地方。

  • 简单的博客和静态站点。
  • 就像静态文件服务器一样。

请记住,我只是在挑剔。对于静态文件服务器,apache更好,主要是因为它广泛可用。这些年来,nodejs社区变得越来越大,越来越成熟,可以肯定地说,如果您有自己的托管选择,那么nodejs几乎可以在任何地方使用。


简单的博客仍然可以从Node.js中受益。为了提供静态文件,您仍然可以使用Node.js,并且如果负载增加,只需按照当前的最佳做法在其前面添加Nginx反向代理。Apache httpd服务器是一种濒临灭绝的恐龙-请参阅此Netcraft调查
Endrju

否则我会说-看一下ghost.org,看起来很棒,它建立在NodeJ之上-协作,实时文章编辑。另外,在NodeJs中创建一个简单页面(例如使用sailsjs.org)非常容易,快速,并且您无需费心学习任何服务器端编程语言
Bery

30

可以在哪里使用

  • 高度事件驱动且受I / O约束的应用程序
  • 处理与其他系统的大量连接的应用程序
  • 实时应用程序(Node.js专为实时而设计,并且易于使用。)
  • 杂乱地往返于其他来源的信息流的应用程序
  • 高流量,可扩展的应用程序
  • 无需进行大量数据分析即可与平台API和数据库进行通信的移动应用程序
  • 构建联网的应用程序
  • 需要经常与后端对话的应用程序

在移动方面,黄金时段公司依靠Node.js来提供移动解决方案。看看为什么?

领英是杰出的用户。他们的整个移动堆栈均基于Node.js。他们从在每台物理机上运行15台服务器(每个实例有15个实例)到仅4个实例–可以处理两倍的流量!

eBay推出了用于HTTP API的网络查询语言ql.io,该语言使用Node.js作为运行时堆栈。他们能够调整常规的开发人员质量的Ubuntu工作站,以每个node.js进程处理超过120,000个活动连接,每个连接消耗大约2kB内存!

沃尔玛重新设计了其移动应用程序以使用Node.js,并将其JavaScript处理推到了服务器上。

有关更多信息,请访问:http//www.pixelatingbits.com/a-closer-look-at-mobile-app-development-with-node-js/


20

最适合并发请求处理的节点-

因此,让我们从一个故事开始。从最近的两年开始,我从事JavaScript的开发和Web前端的开发,对此我感到很满意。后端人员为我们提供了一些用Java,python(我们不在乎)编写的API,我们只需编写一个AJAX调用,获取我们的数据并猜测一下!我们完了。但是实际上并不是那么容易,如果获取的数据不正确或服务器出现错误,那么我们就停滞了,我们必须通过邮件或聊天(有时也在whatsApp上)与我们的后端人员联系。)不酷。如果我们用JavaScript编写API并从前端调用这些API怎么办?是的,这很酷,因为如果我们在API中遇到任何问题,我们可以对其进行调查。你猜怎么了 !您现在可以执行此操作吗?–节点在那里。

好的,您可以用JavaScript编写API,但是如果我对上述问题没问题,该怎么办。您还有其他理由将节点用于rest API吗?

所以这就是魔术的开始。是的,我确实有其他理由将节点用于我们的API。

让我们回到基于阻塞操作或线程的传统rest API系统。假设发生两个并发请求(r1和r2),每个请求都需要数据库操作。因此,在传统系统中会发生什么:

1.等待方式:我们的服务器开始处理r1请求并等待查询响应。完成后r1,服务器开始提供服务r2并以相同方式进行服务。所以等待不是一个好主意,因为我们没有那么多时间。

2.线程方式:我们的服务器将为两个请求创建两个线程r1r2并在查询数据库后服务于它们的目的,这样会使其冷却得很快。但是这会占用大量内存,因为您可以看到我们启动了两个线程,当两个请求都在查询相同数据时问题也增加了那么你就不得不处理僵局之类的问题。因此,它比等待方式更好,但仍然存在问题。

现在是,节点将如何执行:

3. Nodeway:当同一个并发请求进入节点时,它将在其回调中注册一个事件并向前移动,它将不等待特定请求的查询响应。因此,当r1请求到达时,节点的事件循环(是的,有一个事件循环)在用于此目的的节点中。)使用回调函数注册一个事件,然后继续处理r2请求,并通过回调类似地注册其事件。每当任何查询完成时,它都会触发其相应的事件并执行其回调以完成操作而不会被中断。

因此,没有等待,没有线程,没有内存消耗–是的,这是服务其余API的节点。


1
嗨安舒尔 您能否详细说明或建议一些有关如何以线程方式发生死锁的资源。
jsbisht

16

我为新项目选择Node.js的另一个原因是:

能够进行基于纯云的开发

我已经使用Cloud9 IDE一段时间了,现在没有它我无法想象,它涵盖了所有开发生命周期。您所需要的只是一个浏览器,您可以随时随地在任何设备上进行编码。您无需在一台计算机(例如在家)中检入代码,然后在另一台计算机(例如在工作场所)中检出代码。

当然,也许有适用于其他语言或平台的基于云的IDE(Cloud 9 IDE也添加了对其他语言的支持),但是使用Cloud 9进行Node.js开发对我来说确实是很棒的体验。


1
实际上,Cloud9 IDE和其他(我使用的一种)支持几乎所有类型的Web语言。
Wanny Miarelli,2015年

7
你是认真的家伙吗?这是选择堆叠的标准?:)很高兴为您工作!
matanster

15

节点提供的另一项功能是可以动态使用节点的子进程(每个doc要求10mb内存创建节点的多个v8实例,因此不会影响运行服务器的主进程。因此,卸载需要大量服务器负载的后台作业就成了小孩子的事,我们可以在需要时轻松杀死它们。

我已经使用了很多节点,并且在我们构建的大多数应用程序中,都需要同时连接服务器,因此网络流量很大。诸如Express.js和新的框架 Koajs(已删除回调地狱)之使在节点上的工作变得更加容易。


15

唐宁石棉画法...

昨天我的头衔是Packt Publications,《使用JavaScript进行反应式编程》。它实际上不是以Node.js为中心的标题;前几章旨在介绍理论,而后几章则涵盖实践。因为我真的不认为这将是适当的失败给读者一个Web服务器,Node.js的似乎远远的不二之选。案件在打开之前就已经关闭了。

对于Node.js的使用经验,我本可以给出非常乐观的看法。相反,我对遇到的好点和坏点很诚实。

让我在这里提供一些相关的报价:

警告:Node.js及其生态系统很热,足以严重烧伤您!

当我是数学的助教时,有人告诉我一个不明显的建议,那就是不要告诉学生某些事情“容易”。回想起来,原因有些明显:如果您告诉别人一些简单的事情,那么没有看到解决方案的人可能最终会感到(甚至更多)愚蠢,因为他们不仅不知道如何解决问题,而且还解决问题他们太愚蠢了,不容易理解!

有些陷阱不仅惹恼了来自Python / Django的人们,如果您进行了任何更改,它们会立即重新加载源代码。使用Node.js,默认行为是,如果您进行了更改,则旧版本将一直处于活动状态,直到时间结束或您手动停止并重新启动服务器为止。这种不适当的行为不仅惹恼了Pythonistas;它还会激怒提供各种解决方法的本机Node.js用户。在撰写本文时,StackOverflow问题“在Node.js中自动重新加载文件”已超过200次投票和19个答案;编辑将用户定向到保姆脚本(节点主管),其主页位于 http://tinyurl.com/reactjs-node-supervisor。这个问题使新用户有很大的机会感到愚蠢,因为他们认为自己已经解决了问题,但是旧的越野车行为是完全不变的。而且很容易忘记弹起服务器。我已经做过多次了。我要传达的信息是:“不,您并不傻,因为Node.js的这种行为使您不寒而栗;只是Node.js的设计人员没有理由在此处提供适当的行为。请尝试解决它,也许会从节点主管或其他解决方案中获得一些帮助,但是请不要觉得自己很愚蠢。你不是那个有问题的人。问题出在Node.js的默认行为上。”

经过一番辩论后,本节留在了这里,正是因为我不想给人以“这很容易”的印象。在使事情正常进行的过程中,我反复伸手,我不想克服困难,而是让您相信让Node.js及其生态系统正常运行是一件容易的事,如果这对您也不是一件容易的事,您不知道自己在做什么。如果您没有在使用Node.js时遇到麻烦,那就太好了。如果这样做,我希望您不要走开,感觉到“我很愚蠢–我一定有什么不对劲。” 如果遇到Node.js带来的令人惊讶的惊喜,那么您并不傻。不是你!这是Node.js及其生态系统!

在上一章和结论不断上升之后,我并不想真正看到的附录,它讲述了我在生态系统中能够找到的东西,并为moronic文字主义提供了一种解决方法:

HTML5键值存储的服务器端实现是另一个看起来很合适但仍可以兑换的数据库。这种方法具有API的基本优势,大多数优秀的前端开发人员都足够了解。因此,它也是大多数不太出色的前端开发人员都足够了解的API。但是,使用node-localstorage包时,虽然不提供字典语法访问(您想使用localStorage.setItem(key,value)或localStorage.getItem(key),而不是localStorage [key]),但实现了完整的localStorage语义,包括默认的5MB配额- 为什么?服务器端JavaScript开发人员是否需要免受自身保护?

对于客户端数据库功能,每个网站5MB的配额确实是一个宽敞且有用的喘息空间,可让开发人员使用它。您可以设置一个低得多的配额,并且仍然可以为开发人员在cookie管理方面的改进提供不可估量的改进。5MB的限制并不能很快地将其用于大数据客户端处理,但是有足够的余地,足智多谋的开发人员可以用来做很多事情。但是,另一方面,5MB并不是最近任何时候购买的大多数磁盘的特别大的部分,这意味着,如果您和某个网站对合理使用磁盘空间的观点存在分歧,或者某个站点只是呆板,那么它实际上并不会花费除非您的硬盘已经太满,否则您将没有任何危险。

但是,可能会轻轻指出,当您是服务器的唯一编写代码时,不需要任何额外的保护就可以使数据库的大小超出可容忍的5MB。大多数开发人员既不需要也不想充当保姆的工具,也可以防止工具存储超过5MB的服务器端数据。而5MB的配额是客户端的黄金平衡行为,在Node.js服务器上显得有些愚蠢。(而且,对于本附录中所述的用于多个用户的数据库,可能会有些痛苦地指出,除非每个用户帐户在磁盘上创建一个单独的数据库,否则每个用户帐户不是5MB;在每个用户帐户之间共享5MB所有用户帐户在一起。痛苦如果您病毒式传播!)文档指出配额是可自定义的,但是一周前发给开发人员的电子邮件询问如何更改配额,但StackOverflow问题也是如此。我唯一能找到的答案是在Github CoffeeScript源代码中,该源代码作为构造函数的可选第二整数参数列出。这样就很容易了,您可以指定一个等于磁盘或分区大小的配额。但是,除了移植没有意义的功能外,该工具的作者完全没有遵循非常标准的惯例,即对于整数或整数来指定某些资源使用的最大限制,该变量将0解释为“无限”。最好的办法是将配额指定为Infinity:

if (typeof localStorage === 'undefined' || localStorage === null)
  {      
  var LocalStorage = require('node-localstorage').LocalStorage;
  localStorage = new LocalStorage(__dirname + '/localStorage',
    Infinity);
  }

按顺序交换两个评论:

人们不必要地不停地使用JavaScript来作为整体,而JavaScript成为受人尊敬的语言的一部分实际上是道格拉斯·克罗克福德(Douglas Crockford)说的:这是好零件。只是忘记那里还有其他东西。” 也许炙手可热的Node.js生态系统将发展自己的 “ Douglas Crockford”,他会说:“ Node.js生态系统是编码狂野西部的代码,但仍有一些真正的宝石。这是一个路线图。这是几乎不需付出任何代价即可避免的领域。这是在任何语言或环境下都能找到的最丰富的薪水的领域。”

也许其他人可以将这些话当作挑战,并跟随克罗克福德的领导,为Node.js及其生态系统写下“好的部分”和/或“更好的部分”。我会买一份!

考虑到所有项目的热情程度和纯粹的工作时间,可能有必要在一年或两年或三年内,对撰写本文时有关未成熟生态系统的任何言论进行大幅度的调整。在五年内说“ 2015年Node.js生态系统有几个雷区”确实很有意义。2020年的Node.js生态系统具有多个天堂。”


9

如果您的应用程序主要是束缚Web api或其他io通道,提供或使用用户界面,那么node.js可能是您的不二之选,特别是如果您想获得最大的可扩展性,或者如果您的生活中的主要语言是javascript(或各种javascript编译器)。如果您构建微服务,node.js也可以。Node.js也适用于任何规模较小或简单的项目。

它的主要卖点是它允许前端人员对后端内容负责,而不是典型的鸿沟。另一个合理的卖点是,如果您的工作人员一开始就以JavaScript为导向。

但是,在某个特定点之外,如果没有可怕的黑客来强迫模块性,可读性和流程控制,就无法扩展代码。不过,有些人喜欢这些骇客,尤其是来自事件驱动的javascript背景,他们似乎很熟悉或可以原谅。

特别是,当您的应用程序需要执行同步流时,就会开始使用半熟的解决方案,这会大大降低您的开发流程速度。如果您的应用程序中有计算密集型部分,请谨慎选择(仅)node.js。与我最初使用node.js或编写此代码时相比,也许http://koajs.com/或其他新颖性缓解了那些最初棘手的方面。


3
现有许多用于扩展Node.js应用程序的方法,并且您似乎并未提供有关“半熟的解决方案”,“可怕的骇客”和“可怕的API”声明的任何参考。介意那些?
Sven Slootweg 2015年

我将其作为练习留给读者,但这足以研究所谓的流控制解决方案。
matanster

2
那不是真正的答案。您声称现有解决方案是“可怕的骇客”,但没有指出其中的任何一个。您是否认为您可能根本不了解或不知道扩展Node.js应用程序的正确方法?
Sven Slootweg

我更新了我的答案。也许您仍然有抱怨,但是如果您认为这是错误的,则应详细说明...,而不要在答案中指出缺少的地方。这对于社区imo会更有生产力。
matanster

-2

我可以分享在哪里以及为什么要使用节点js的几点。

  1. 对于更好的实时应用程序,如聊天,协作编辑,我们选择使用nodejs,因为它是事件基础,可将事件和数据从服务器发送到客户端。
  2. 简单易懂,因为它是大多数人都有想法的javascript库。
  3. 当前的大多数Web应用程序都趋向于有角度的js&backbone,有了node,就很容易与客户端代码进行交互,因为两者都将使用json数据。
  4. 有很多可用的插件。

缺点:-

  1. Node将支持大多数数据库,但最好的是mongodb,它将不支持复杂的联接和其他联接。
  2. 编译错误...如果任何符合错误的应用程序将停止工作,那么开发人员应该以其他方式处理所有异常,我们需要再次手动启动或使用任何自动化工具来启动它。

结论:-Nodejs最好用于简单和实时的应用程序。如果您有很大的业务逻辑和复杂的功能,最好不要使用nodejs。如果您希望与聊天和任何协作功能一起构建应用程序,则可以在特定部分使用节点,而其余部分应与您的便捷技术一起使用。


-3
  1. Node非常适合快速创建原型,但是我再也不会将它用于任何复杂的事情。我花了20年的时间开发与编译器的关系,但我肯定会错过它。

  2. 对于维护您已经一段时间没有访问的代码,Node尤其痛苦。类型信息和编译时错误检测是一件好事。为什么要把所有这些都扔掉?为了什么?当当东西往南走时,堆栈痕迹常常完全没用。


2
尽管您没有进行编译时检查,但JSDoc允许您添加所需的任何类型信息,以便您回来时更有意义。适当分解的(小的)函数由于其定义良好的环境(闭包),通常也很容易被破解。错误的堆栈跟踪通常可以通过一些重构来解决,以确保您不会在两者之间使用异步回调来拆分逻辑。将异步回调保留在同一个闭包中,可以轻松地进行推理和维护。
Rich Remer 2014年

2
我在编译语言方面已经花费了30年,但是在使用了大约一年之后,现在JavaScript是我的首选语言。它是如此高效-与Java C#C ++或C相比,我可以用更少的代码来做更多的事情。但这是不同的想法。在许多情况下,无类型变量实际上是一个优势。JSLINT是必不可少的。当您需要同时执行操作时,与必须使用线程的任何语言相比,异步回调要安全得多,更容易实现并最终提高生产力。而且,无论如何,您都必须了解JavaScript,因为它是浏览器的语言。
詹姆斯

我确实对提出的关切表示同情,并指出尽管已将它们普遍地应用了一些努力,但仍为解决这些问题作出了一些努力。有一个了不起的项目叫Tern,它可以提供对Javascript代码和库的静态分析的类型派生。它具有适用于各种编辑器的插件。还有Typescript,JSDoc和BetterJS。然后是Go,它是许多可编译为Java语言的语言之一
joeytwiddle
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.