javascript express官网 - 如何决定何时使用Node.js?




express中文 web开发 (15)

我有一个真实世界的例子,我使用Node.js. 我工作的公司有一个客户希望拥有一个简单的静态HTML网站。 本网站用于使用PayPal销售一件商品,客户也希望有一个显示销售商品数量的柜台。 客户预计会有大量访问者访问本网站。 我决定使用Node.js和Express.js框架制作计数器。

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

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

  1. 它非常轻巧,快速。 本网站在三周内访问量超过20万次,最小的服务器资源已经能够处理。
  2. 计数器很容易实时。
  3. Node.js很容易配置。
  4. 有很多模块可以免费使用。 例如,我找到了PayPal的Node.js模块。

在这种情况下,Node.js是一个很棒的选择。

我是这类新手,但最近我听到很多关于Node.js好处。 考虑到我一般喜欢使用jQuery和JavaScript,我不禁想知道如何决定何时使用Node.js. 我想到的Web应用程序就像Bitly一样 - 需要一些内容,归档它。

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

  • 是一个命令行工具,可以作为常规Web服务器运行,并让一个人运行JavaScript程序
  • 利用伟大的V8 JavaScript引擎
  • 当你需要同时做几件事时非常好
  • 是基于事件的所以所有美妙的Ajax类似的东西都可以在服务器端完成
  • 让我们在浏览器和后端之间共享代码
  • 让我们与MySQL交谈

我遇到的一些消息来源是:

考虑到Node.js几乎可以在亚马逊的EC2实例上运行,我试图了解哪些类型的问题需要Node.js,而不是像PHPPythonRuby那样强大的国王。 。 我知道这实际上取决于人们对语言的专业知识,但我的问题更多地涉及一般类别:何时使用特定框架以及它特别适合哪种类型的问题?


使用NodeJS的原因:

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

  • 与传统的多线程Java或ROR框架相比, single-threaded事件驱动系统即使在一次处理大量请求时也fast ,而且也很简单。

  • 可通过NPM访问的不断增长的packages池,包括客户端和服务器端库/模块,以及用于Web开发的命令行工具。 其中大部分都方便地托管在github上,有时您可以报告问题并在几小时内找到它! 把所有东西放在一个屋檐下很好,标准化的问题报告和简单的分叉。

  • 它已经成为运行Javascript相关工具和其他与Web相关的工具的事实标准环境,包括任务运行器,缩小器,美化器,链接器,预处理器,捆绑器和分析处理器。

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

使用NodeJS的原因:

  • 它运行Javascript,没有编译时类型检查。 对于大型,复杂的安全关键系统或项目,包括不同组织之间的协作,鼓励合同接口并提供静态类型检查的语言可以从长远来看节省一些调试时间(和爆炸 )。 (虽然JVM卡住了null ,但请将Haskell用于你的核反应堆。)

  • 除此之外,NPM中的许多软件包都有点原始 ,并且仍处于快速发展阶段。 旧框架的一些库经历了十年的测试和错误修正,并且现在非常稳定Npmjs.org没有对包进行评级的机制 ,这导致包大量增加或多或少相同的东西,其中大部分不再维护。

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

  • 不断增长的软件包池可以使一个NodeJS项目与下一个项目显得截然不同 。 由于可用的选项数量巨大(例如Express / Sails.js / Meteor / Derby ),实现方式有很大差异。 这有时会使新开发人员更难进入Node项目。 与Rails开发人员加入现有项目相比:他应该能够很快熟悉应用程序,因为鼓励所有Rails应用程序使用类似的结构

  • 处理文件可能有点痛苦。 在其他语言中微不足道的事情,比如从文本文件中读取一行, 对Node.js来说很奇怪 ,有80多个upvotes的问题。 从CSV文件中一次读取一条记录没有简单的方法 。 等等。

我喜欢NodeJS,它既快速又狂野又有趣,但我担心它对可证明的正确性几乎没有兴趣。 让我们希望我们最终可以融合两全其美。 我很想知道将来取代Node会有什么...... :)


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

那么,让我们从一个故事开始吧。 从过去2年开始,我正致力于JavaScript和开发Web前端,我很享受。 后端人员提供了一些用Java编写的API,python(我们不关心),我们只是编写一个AJAX调用,获取我们的数据并猜测是什么! 我们完了。 但实际上并不是那么容易,如果我们得到的数据不正确或者存在服务器错误,那么我们就会陷入困境,我们必须通过邮件或聊天联系我们的后端人员(有时也会在whatsApp上:)。)并不酷。 如果我们用JavaScript编写API并从前端调用这些API,该怎么办? 是的,这很酷,因为如果我们在API中遇到任何问题,我们可以调查它。 你猜怎么着 ! 你现在可以这样做,怎么样? - 节点就在你身边。

Ok同意您可以用JavaScript编写API,但如果我对上述问题感到满意怎么办。 您是否有任何其他理由将节点用于rest API?

所以这就是神奇的开始。 是的我还有其他理由将节点用于我们的API。

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

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

2.线程方式:我们的服务器将为请求r1r2创建两个线程,并在查询数据库之后为其目的服务,以便快速实现它的目的。但它是内存消耗,因为你可以看到我们启动了两个线程,当两个请求都查询时问题也增加了相同的数据然后你必须处理死锁类问题。 所以它比等待方式更好,但仍有问题。

现在这里是节点将如何做到:

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

所以没有等待,没有线程,没有内存消耗 - 是的,这是服务休息API的节点。


没有像银弹一样的东西。 一切都带来了与之相关的一些成本。 就像你吃油腻的食物,你会损害你的健康,健康的食物不会像油性食物一样含有香料。 无论他们是否想要健康或香料,都是个人选择。 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和更好的可扩展性考虑因素。


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

能够进行基于纯云的开发

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

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


你做了很好的总结Node.js的精彩内容。 我的感觉是Node.js特别适合于您希望保持从浏览器到服务器的持久连接的应用程序。 使用称为"long-polling" ,您可以编写一个实时向用户发送更新的应用程序。 对许多网络巨头进行长时间轮询,比如Ruby on RailsDjango ,会在服务器上产生巨大的负担,因为每个活动客户端都会占用一个服务器进程。 这种情况相当于一个tarpit攻击。 当您使用Node.js之类的东西时,服务器不需要为每个打开的连接维护单独的线程。

这意味着您可以在Node.js中创建基于浏览器的聊天应用程序 ,几乎不需要任何系统资源来为很多客户端提供服务。 任何时候你想做这种长轮询,Node.js是一个很好的选择。

值得一提的是Ruby和Python都有工具来做这种事情(分别是eventmachinetwisted ),但是Node.js非常好地完成了它,并且从头开始。 JavaScript非常适合基于回调的并发模型,它在这里很有优势。 此外,能够使用本机的JSON序列化和反序列化客户端和服务器是非常好的。

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

值得指出的是,Node.js对于在客户端/服务器间隙中重复使用大量代码的情况也很有用。 Meteor框架使这很容易,很多人都认为这可能是Web开发的未来。 我可以从经验中说,在Meteor中编写代码非常有趣,其中很大一部分是花更少的时间考虑如何重构数据,因此浏览器中运行的代码很容易操纵它并将其传回。

这是一篇关于金字塔和长轮询的文章,结果很容易在gevent的帮助下设置: TicTacToe和Long Polling with Pyramid


穿石棉longjohns ...

昨天我的标题是Packt Publications, 使用JavaScript进行反应式编程 。 它不是一个以Node.js为中心的标题; 前面的章节旨在涵盖理论,后来代码密集的章节涵盖了实践。 因为我不认为没有给读者一个网络服务器是合适的,所以Node.js似乎是最明显的选择。 该案件在开盘前已经关闭。

我本可以非常乐观地看到我对Node.js的体验。 相反,我诚实地谈到了我遇到的好点和坏点。

让我在这里提供一些相关的引用:

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

当我在数学方面担任教师助理时,我被告知的一个非显而易见的建议是不要告诉学生一些事情是“容易的”。回想起来,原因有点明显:如果你告诉别人一些事情很容易,那么没有看到解决方案可能最终感觉(甚至更多)愚蠢,因为他们不仅没有得到如何解决问题,而且他们太愚蠢无法理解的问题是一个简单的问题!

有些问题不仅会让来自Python / Django的人感到烦恼,如果你改变任何东西,它会立即重新加载源代码。 对于Node.js,默认行为是,如果进行一次更改,旧版本将继续处于活动状态,直到时间结束或直到您手动停止并重新启动服务器。 这种不恰当的行为不仅会惹恼Pythonistas; 它还会激怒提供各种解决方法的本机Node.js用户。 在撰写本文时,问题“在Node.js中自动重新加载文件”有200多个upvotes和19个答案; 编辑将用户定向到保姆脚本,节点主管,主页位于http://tinyurl.com/reactjs-node-supervisor 。 这个问题为新用户提供了很大的机会感到愚蠢,因为他们认为他们已经解决了问题,但旧的,错误的行为完全没有改变。 并且很容易忘记反弹服务器; 我已多次这样做了。 我想提供的信息是,“不,你不是傻瓜,因为Node.js的这种行为让你感到厌倦; 只是Node.js的设计者没有理由在这里提供适当的行为。 试着应对它,也许从节点主管或其他解决方案中获得一些帮助,但请不要走开,感觉你是愚蠢的。 你不是那个有问题的人; 问题出在Node.js的默认行为中。“

经过一些辩论之后,这部分被遗留下来,正是因为我不想给人一种“很容易”的印象。我在工作中反复切手,而且我不想平息困难。让你相信让Node.js及其生态系统运行良好是一件简单的事情,如果它对你来说也不是直截了当的,你就不知道你在做什么。 如果你没有使用Node.js遇到令人讨厌的困难,那太好了。 如果你这样做,我希望你不要离开感觉,“我是愚蠢的 - 我一定有问题。”如果你遇到与Node.js有关的令人讨厌的惊喜,你就不是傻瓜。 不是你! 它是Node.js及其生态系统!

在最后几章和结论中逐渐提升后,我并不真正想要的附录讨论了我在生态系统中能够找到的内容,并为愚蠢的文字主义提供了一种解决方法:

另一个看起来非常合适并且可以兑换的数据库是HTML5键值存储的服务器端实现。 这种方法具有API的主要优势,大多数优秀的前端开发人员都能很好地理解。 就此而言,它也是一个API,大多数不那么优秀的前端开发人员都能很好地理解。 但是使用node-localstorage包,虽然不提供字典语法访问(您希望使用localStorage.setItem(key,value)或localStorage.getItem(key),而不是localStorage [key]),但实现了完整的localStorage语义,包括默认的5MB quota ?为什么? 服务器端JavaScript开发人员是否需要受到保护?

对于客户端数据库功能,每个网站5MB的配额确实是一个慷慨而有用的空间,让开发人员可以使用它。 你可以设置一个低得多的配额,并且仍然为开发人员提供了一个不可估量的改进,而不是一瘸一拐地进行cookie管理。 5MB的限制并不能很快地适应大数据客户端处理,但是资源丰富的开发人员可以用来做很多事情,这是一个非常慷慨的限制。 但另一方面,5MB并不是最近购买的大多数磁盘的一个特别大的部分,这意味着如果你和一个网站不同意什么是合理使用磁盘空间,或者某些网站只是很糟糕,它并不真正花费你很多,除非你的硬盘已经太满,否则你没有淹没硬盘的危险。 如果平衡稍微少一点或多一点,我们可能会更好,但总的来说,它是解决客户端背景的内在紧张的一个不错的解决方案。

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

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

按顺序交换两条评论:

人们不断地使用JavaScript作为一个整体来自己的脚,并且JavaScript的一部分被制作成可敬的语言是Douglas Crockford本质上说,“JavaScript作为一种语言有一些非常好的部分和一些非常糟糕的部分。这是好的部分。只要忘记其他任何东西都在那里。“也许热门的Node.js生态系统会发展自己的 ”道格拉斯·克罗克福德“,他会说,”Node.js生态系统是一个编码狂野的西部,但有一些真正的宝石可以找到。这是一个路线图。以下是几乎不惜任何代价避免的区域。以下是可以在任何语言或环境中找到最丰富的付费区域。“

也许其他人可以将这些话作为挑战,并遵循Crockford的主导并为Node.js及其生态系统写下“好的部分”和/或“更好的部分”。我买了一份!

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


简而言之:

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

关于Node.js中事件循环的一篇好文章是Mixu的技术博客:了解node.js事件循环


我可以分享点和使用节点js的原因。

  1. 对于聊天,协作编辑等实时应用程序,我们更好地使用nodejs,因为它是事件库,其中火灾事件和数据来自服务器的客户端。
  2. 简单易懂,因为它是javascript基础,大多数人都有想法。
  3. 大多数当前的Web应用程序都转向角度js和骨干,使用节点很容易与客户端代码交互,因为它们都将使用json数据。
  4. 很多插件可用。

缺点:-

  1. Node将支持大多数数据库,但最好的是mongodb,它不支持复杂的连接和其他。
  2. 编译错误......如果任何错误,应用程序将停止工作,我们需要再次手动或使用任何自动化工具启动它,开发人员应该处理其他每个例外。

结论: - Nodejs最适合用于简单和实时的应用程序。如果你有非常大的业务逻辑和复杂的功能,那么最好不要使用nodejs。如果您想构建一个应用程序以及聊天和任何协作功能..节点可以在特定部分使用,并保持应该与您的便利技术。


如果您的应用程序主要使用web apis或其他io频道,提供或采用用户界面,node.js可能是一个公平的选择,特别是如果你想要挤出最大的可扩展性,或者,如果你的生活中的主要语言是javascript(或各种javascript转换器)。如果你构建微服务,node.js也没关系。Node.js也适用于任何小型或简单的项目。

它的主要卖点是允许前锋负责后端的东西,而不是典型的鸿沟。另一个合理的卖点是,如果您的员工以javascript为导向开始。

但是,除了某一点之外,如果没有可怕的黑客攻击来强制模块化,可读性和流量控制,就无法扩展代码。有些人喜欢那些黑客,特别是来自事件驱动的javascript背景,他们似乎熟悉或可原谅。

特别是,当您的应用程序需要执行同步流程时,您会开始放弃半生不熟的解决方案,这会使您在开发过程中大大减慢速度。如果您的应用程序中有计算密集型部件,请谨慎选择(仅限)node.js. 与我最初使用node.js或写这篇文章相比,也许Koajs或其他新奇事物可以缓解那些最初棘手的问题。


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

我还要提一下,Socket.IO与Node.js相结合,可以比长轮询更进一步减少实时延迟。 作为最坏的情况,Socket.IO将回归长轮询,而是使用网络套接字甚至Flash(如果可用的话)。

但是我还应该提一下,使用Node.js可以更好地解决因线程而导致代码阻塞的任何情况。 或者您需要应用程序进行事件驱动的任何情况。

此外,Ryan Dahl在一次谈话中说,我曾经参加过Node.js基准测试,与Ng​​inx的常规旧HTTP请求密切相关。 因此,如果我们使用Node.js构建,我们可以非常有效地服务我们的常规资源,当我们需要事件驱动的东西时,它就可以处理它了。

另外,它一直都是JavaScript。 Lingua Franca整个堆栈。


它可以在哪里使用

  • 高度事件驱动且I / O严重受限的应用程序
  • 处理与其他系统的大量连接的应用程序
  • 实时应用程序(Node.js是从头开始设计的,实时且易于使用。)
  • 将大量信息流传输到其他来源和从其他来源流动的应用程序
  • 高流量,可扩展的应用程序
  • 移动应用程序必须与平台API和数据库通信,而无需进行大量数据分析
  • 构建网络应用程序
  • 需要经常与后端通信的应用程序

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

LinkedIn是一位杰出的用户。 他们的整个移动堆栈都是基于Node.js构建的。 他们从每个物理机器上运行15个服务器,15个实例,到4个实例 - 可以处理双倍的流量!

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

Walmart重新设计其移动应用程序以使用Node.js并将其JavaScript处理推送到服务器。

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


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


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

  • 所有最酷的家伙都进入了它...所以它一定很有趣。
  • 你可以在冷却器上进行聚会,并有很多Node冒险来吹嘘。
  • 在云托管成本方面,你是一个便宜的pincher。
  • 用Rails完成了那个
  • 你讨厌IIS部署
  • 你的旧IT工作变得相当沉闷,你希望你处于一个闪亮的新起点。

期待什么......

  • 如果没有您从未需要的所有服务器膨胀软件,您将感受到安全和安全。
  • 像火箭一样运行并且可以很好地扩展。
  • 你梦想着它。 你安装了它。 节点包repo packages是世界上最大的开源库生态系统。
  • 你的大脑会在嵌套回调的土地上扭曲时间......
  • ......直到你学会遵守Promises
  • SequelizePassport是您的新API朋友。
  • 调试大多数异步代码将会变得有趣
  • 所有Noders掌握Typescript

谁用它?

  • PayPal,Netflix,沃尔玛,LinkedIn,Groupon,优步,GoDaddy,道琼斯
  • 这就是他们切换到Node的原因。

ebdiv应设置为style="display:none;" 。 它适用于show和hide:

$(document).ready(function(){
    $("#eb").click(function(){
        $("#ebdiv").toggle();
    });    
});




javascript node.js web-applications