- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
原问题:How to decide when to use Node.js?
要想弄明白什么时候该用Node.js,需要弄清楚这几个问题:- Node.js的出现是为了解决什么问题- 什么Node.js- Node.js的特点- Node.js与HTTP Server
Node.js的解决办法:不再使用多进程、线程来处理多个web请求,而是使用多事件、队列来处理。这样就不存在资源瓶颈问题。Node.js自身保持单进程单线程的运行模式。
后端语言Java/PHP等,前端语言JavaScript。- 编译运行环境、语法- 前后端通信、数据封装解包- 代码复用- 工程师沟通障碍
Node.js的解决办法:使用V8引擎、模块化。这样后端应用程序也能使用JavaScript编写,并且代码都是模块化的,在前端也能加载和使用这些模块(通过某些工具)。
Node.js® is a platform built on Chrome’s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.
以上内容取自Node.js官方网站首页的介绍。很直白,说明Node.js:- 是一个平台- 基于Chrome的Javascript runtime (a.k.a. V8 Engine
)- 能用来构建快速、可扩展的网络应用- 使用事件驱动、非阻塞IO模式- 适合用来构建跨平台、数据交换频繁的实时应用
网站首页下方给出了一个使用Node.js的示例:创建一个WebServer。说明基于Node.js可以实现WebServer的功能,但同时也意味这Node.js不仅仅只能做WebServer的事。
任何一项新技术的诞生,都是为了解决原有技术下无法解决的问题,或者有待改进的方面。同时,新技术的引进又可能会带来新的问题。参考
Node.js能解决的问题,或者说使用Node.js能带来的好处有:- 前后端一致的开发环境,工程师顺畅的沟通- 可扩展的高并发连接能力(scalability of active connections)- 模块化开发,靠社区来扩展功能
目前Node.js存在的问题:- 对V8的依赖,对Google的依赖 参考Node.js需要一个JavaScript引擎,用来负责解释并运行JavaScript程序。而V8已经在Chrome中证明了它是一个高效的JavaScript引擎。同时V8并不依赖于Chrome,它可以单独被嵌入任何程序,依然可以正常工作。因此,Node.js使用了V8,没有V8就没有Node.js现在的性能。- Debug困难,回调机制的通病 参考1 参考2- 对计算密集型请求处理能力较弱使用Web Workers模式来解决,开启一个子进程来处理计算密集型任务。- 异常存活性一旦发生异常,会使整个进程崩溃,已经发送到该进程的后续其他请求的处理也就无法继续进行。使用cluster能够一定程度上解决。- 应对网络攻击在应对网络攻击方面还比较脆弱,比如:CVE-2013-4450
Node.js常常跟HTTP Server一起出现,但这只是其冰山一角,被大家经常看到而已,并不代表它的全部。
在Node.js之前,常见的HTTP Server是Apache,继而出现的Nginx。我们来看看这三个东西到底是什么,各自之间有何异同。
HTTP Server本身是一个应用程序,运行在服务器OS上。它的工作就是监听HTTP80/HTTPS443端口,然后:
理论和实际都很简单,你完全可以对照Hypertext Transfer Protocol – HTTP/1.1自己动手写一个HTTP Server。使用任何语言都行,只要它能:
也就是说,只要这种编程语言能够访问系统资源,能够进行socket网络通信,就能用来写一个HTTP Server。
A stable and scalable HTTP Server, but poor ability in terms of concurrency.
A high performance HTTP Server.
Apache和Nginx完成了HTTP Server的功能,你部署并运行它,你就得到了一个监听着80端口的HTTP Server, which means a ready to running environment out of box.
Web is a first class citizen in Node, designed with streaming and low latency in mind. This makes Node well suited for the foundation of web library or framework.
可以看出,HTTP Server只是Node.js能够做的事情的一部分而已。从实际程序设计和实现上看,Node.js:- 是用python和C++写的一个运行环境(因为V8是用C++写的) 源码- 提供用JavaScript写的一些访问系统资源的node模块 源码
比如我们常常使用的http模块,使用它就能构建一个HTTP Server,运行在服务器上监听用户请求。
Node.js只是提供了构建HTTP Server的素材,你需要自己编程去实现这个HTTP Server,当然是比较容易地就能完成。
Node.js is a ready to programming environment.
同时,除了HTTP server之外,Node.js还能做很多其他的事,参考其API文档。
事实上在很多情况下,Node.js是被用作一个更广泛的应用服务器,同时与HTTP Server共存:- 编写多个Node.js应用运行在不同端口,完成不同的服务- 利用Nginx的high performance HTTP Serving特长,通过Nginx来反向代理到80、443等Node.js应用的端口
Node.js这时候扮演的是应用服务器的角色。
Node.js是一个能在浏览器之外、普通OS上运行JavaScript的平台。它的核心是:事件驱动、一切皆异步;一切皆JavaScript。能最大化利用资源,能消除前后端在编程语言上的障碍。你可以用它来构建一个Web Server,还可以用它来做其他任何有趣的事。
现在整理一下SO原问题的答案。
当你的web application需要同时保持多个活动连接active connections,并且每个连接的处理并不是计算密集型,不用消耗太多的CPU时间,可以考虑使用Node.js。
比如:- Browser-based chat application- Online game- Collaboration tools- Twitter队列每秒成千上万条的tweet要写入数据库,只能排队完成。传统的Apache+PHP的方式,需要使用memcached之类的缓存插件来处理这个队列。而Node.js直接就可以完成,它的较色就是收集tweet并将信息传递个另一个负责数据库写入的进程。看上去功能好像差不多,但区别在于Node.js能够更简单与优雅地完成任务。
从以上应用场景可以看出,Node.js主要是扮演信息收集者的角色:收集信息,发送任务;收到任务执行结果,返回结果。具体的任务,是由其他Node.js模块或者其他应用程序完成。
传统Web服务器是“一个连接一个线程”,独享独占;Node.js采用的是“一个连接一个流程”的方式,排队共享。它只负责流程的启动和结束处理,流程中的其他环节,由程序员完成。
最后再次提醒两点:- 多上Node.js官网,那里有你需要的一切- 如果你决定使用它,确保你已经对它有充分地了解
websocket的用途/场景 先总结:高即时性服务,比如聊天室的群聊,server顺序收到了张三,李四的消息,立即就推送给王五,不能让王五等半天。 Ajax也可以一秒一刷,让王五去问张三说话没,如果
前端的工作过程里,本地开发、提供测试环境,总得有个用着顺手的服务器软件,这个场景里nginx很流行。 介绍两个好用的配置项:rewrite try_files @xxxx rewrite 比较
我有一个场景的两个不同角度的 2 个视频文件,我想重建场景的 3D 估计。它类似于 3D 传感器的作用(例如 Kinect、PrimeSense)。我正在寻找一个库,甚至是一个完善的机器视觉算法,以便
我已阅读RebaseProject页面并尝试了一个不平凡的例子(不是对一个完整的分支进行 rebase )。这与 rebase D 的情况类似我场景B。 这是rebase之前的情况: default
有没有办法将我的场景保存在 JavaFx 应用程序中单独的 Java 文件中?我尝试过这样的事情: public class MyApp extends Application { pri
我有这样的场景:用户想要查看大量有关自己的信息。例如:年龄、姓名、地位、收入、工作、爱好、 child 的名字、妻子的名字、酋长的名字、祖父/祖母的名字。大约 50 个变量。他可以选择任何变量来显示信
我希望有人能帮助我解决这个问题:我有一个包含条目的表。我想执行查询并根据模式获取得分最高的记录。模式将是:如果我的话按原样出现,那么该条目的分数将是最高的。如果该单词出现在句子中,则该条目的分数将低于
我正在尝试在我的应用程序委托(delegate)方法中实现一些逻辑。了解当前正在运行哪种场景将非常有帮助。 [[CCDirector sharedDirector] runningScene] 返回当
好的,这是一个有趣的。我有 2 个表:tbl_notes、tbl_notes_categories 简单地说,tbl_notes 有一个 categoryid,我将 2 个表与该 ID 相关联。所以,
我有一个使用并行运行的 Specflow、selenium、NUnit 的测试解决方案在 AssemblyInfo 中添加了这个:[程序集:Parallelizable(ParallelScope.F
我正在尝试弄清楚如何在 SpriteKit 中添加更多场景。如果我在 GameViewController 中使用 SpriteKit 生成的行 if let scene = GameScene.un
目录 1、业务背景 2、场景分析 3、流程设计 1、业务流程 2、导入流程
我是 Unity 的新手,所以修复起来可能非常简单。我使用了一个 3D Google SketchUp 模型,我想让玩家环顾模型。 super 简单。 我添加了 3D 平面,添加了相机并更新了设置以支
我需要标记要跳过的某些测试。但是,有些测试是参数化的,我只需要能够跳过某些场景。 我使用 py.test -m "hermes_only" 调用测试或 py.test -m "not hermes_o
我已经开始使用 SpecFlow 并想知道是否可以在规范之间重用场景 基本上我的想法是这样的(我可能从根本上是错误的:)) 我编写了一项功能来验证导航。 功能:导航 I should be able
在编写验证输入表单上的信息的 BDD 场景时,您将如何列出规则。 选项是: 1) 每个规则一个场景 2)场景大纲,每个领域和规则的例子 我们如何说某些不在特定字符集中的无效内容,例如: 鉴于我输入了一
我们如何使用 StoryQ 来测试预期出现异常的场景? 最佳答案 就实际代码而言,在测试代码的 .Then 部分,您需要创建一个 Action 或 Func 来确定正在测试的内容,然后在代码的 .Th
完成快速初学者努力通过点击按钮向场景添加节点。 我知道我可以使用点击手势来获取点击坐标并执行点击测试,然后在点击的 3D 空间中放置一个对象。但是,我想在设备屏幕的中央显示一个球体或十字准线,当点击屏
如何在表格中传递空格? Background: Given the following books |Author |(here several spaces)
我正在尝试从 Eric Haines' Standard Procedural Database (SPD) 渲染“mount”场景,但折射部分就是不想配合。我已经尝试了所有我能想到的方法来修复它。
我是一名优秀的程序员,十分优秀!