当前位置: 首页 > 编程日记 > 正文

了解node.js

转载自http://debuggable.com/posts/understanding-node-js:4bd98440-45e4-4a9a-8ef7-0f7ecbdd56cb

当我向人们介绍node.js时,通常会得到两种反应,一种人马上就能了解,另一种则是非常困惑。

如果你是第二种人,请看一下我对node的解释:

  • 它是一个命令行工具。你可以通过下载源码压缩包,编译并安装;
  • 它能让你在你的终端上运行JavaScript程序,只需要输入"node my_app.js";
  • V8 javascript引擎(Google Chrome的脚本引擎,保证了Chrome的快速运行)负责执行JS文件;
  • Node 提供了一个JavaScript API用于访问网络和文件系统。

“但是我用ruby、python、php、java……就可以做所有的事情了!”

我知道。一点也没错!Node并没有神奇到可以帮你完成你的工作,抱歉。它只是一个工具,而它至少现在还不足以完全取代你惯用的工具。

“说重点!”

好的。当你需要同时做几件事情的时候,Node是很好用的。你有没有写过一段代码然后说:”我希望这个可以并行运行“?在node里一切都可以并行运行,除了你的代码。

“啥?”

是的,除了你的代码,一切都可以并行运行。想象一下你的代码是国王,node是他的侍从们。

一个侍从把国王叫醒,看看他有什么需要。国王交给侍从一系列任务后就回去睡觉了。侍从把任务分配给他的同事,大家开始工作了。

一旦某一个侍从完成了一个任务,他就进入一个队列等待向国王报告。国王依次接受每个侍从的报告。有时国王会在听完报告后给侍从更多的任务。

虽然侍从们可以并行地完成任务,但是每次只能报告一个结果,以便让国王保持专注。

“那很棒,不过能不能停止这个愚蠢的比喻,说点专业的?”

当然。一个简单的node程序如下:

var fs = require('fs'), sys = require('sys');fs.readFile('treasure-chamber-report.txt', function(report) {sys.puts("oh, look at all my money: "+report);
});fs.writeFile('letter-to-princess.txt', '...', function() {sys.puts("can't wait to hear back from her!");
});

你的代码交给node两个任务,分别是读和写一个文件,然后就sleep了。一旦node完成一个任务,就调用回调函数。但是每次只能调用一个回调函数。在该回调函数执行完之前,其他回调函数必须排队等待。此外,我们无法确定回调函数的执行顺序。

“所以我不用担心数据的并发访问问题?”

对!这正是JavaScript单线程和事件循环设计的美妙之处。

“很好,但我为啥要用它?”

一个原因是执行效率。在一个web应用中,你的总响应时间通常是数据库查询时间的总和。使用node,你可以同时进行所有的查询,将响应时间减少到执行最慢查询的时间。

另一个原因是Javascript。你可以使用node实现浏览器和后端共享代码。JavaScript正在逐步成为一个通用编程语言。无论你过去使用python、ruby、java还是php……你或多或少都用过JS,不是吗?

最后一个原因是运行速度。V8正在持续地提高运行速度以成为最快的动态语言解释器之一。我找不到任何其他语言像JavaScript这样如此激进地提高运行速度。此外,node的I/O工具非常地轻,使你可以尽可能完全利用系统的I/O能力。

“所以你是说将来我应该一直用node编写我的所有程序?”

是又不是。只使用一种编程语言和工具会让我们的眼光变得狭窄。(原文:当你开始挥舞node大锤时,一切事物在你眼里都像是一个钉子)但是如果你面临某个任务的deadline时,你可以基于如下的分析进行选择:

  • 低响应时间和高并发是否重要?Node非常擅长这个;
  • 工程的规模有多大?小工程还好。大工程则需要认真评估。(可用的库,修正bug和并行开发的资源等)

“node可以在Windows上运行么?”

不行,如果你用的是windows,你需要运行linux的虚拟机。支持Windows是node的开发计划之一。但是不要为此而等待。(PS:这篇文章是2010年写的,现在已经有支持windows的node了)

“我可以通过node访问DOM么?”

好问题!不行,DOM是浏览器的一个接口,node的JS引擎(V8)则完全从那些混乱中分离出来了。但是,有些人在实现DOM的node模块,这将使浏览器端代码的单元测试成为可能。

“事件驱动编程不是很难么?”

这取决于你过去的经验了。如果你已经学过浏览器的AJAX调用和用户事件模型,那么使用node完全不是问题。另外,测试驱动开发可以帮助你进行可维护的设计。

“谁在用node?”

这是一个不完整清单。node wiki(滚动到"Companies using Node")Yahoo正在尝试将node用在YUI上,Plurk正在使用它做大规模评论(原文:massive comet,怀疑是笔误),Paul Bakaus(jQUery UI作者)正在制作一个牛逼的游戏引擎,其中在后端用到了node。Joyent聘请了Ryan Dahl(node创始人)并让其担任主要开发。

噢,Heroku刚宣布支持node.js主机。

“我去哪了解更多信息?”

Time Caswell 的博客How To Node。在twitter上Follow#nodejs。订阅这些邮件清单。加入IRC channel, #node.js。

此外,我也将继续在debuggable.com发表文章。

相关文章:

VS2013中Image Watch插件的使用(OpenCV)

之前在vs2010中写OpenCV程序时经常用NativeViewer,安装此插件后,在调试代码时,对于cv::Mat变量,CV_TYPE类型为CV_8UC1或CV_8UC3,可以随时查看显示结果。其操作步骤为:1. 从http://sourceforge.net/p…

【spring boot2】第8篇:spring boot 中的 servlet 容器及如何使用war包部署

嵌入式 servlet 容器 在 spring boot 之前的web开发,我们都是把我们的应用部署到 Tomcat 等servelt容器,这些容器一般都会在我们的应用服务器上安装好环境,但是 spring boot 中并不需要外部应用服务器安装这些servlet容器,spring …

让织梦内容页arclist标签的当前文章标题加亮显示

很多人在用织梦做站的时候,会用到在当前栏目页面,给当前栏目标题使用指定样式如标题加亮,或者放个背景图。这是一个很常用和实用的功能,比如在导航页面,标识当前在浏览哪个栏目。如下图: 但是有些时候&…

RHEL6入门系列之九,常用命令2

今天还是继续来学习Linux的基本命令。4、touch命令——建立空文件touch命令用于建立空文件。[rootlocalhost ~]# mkdir /root/test ‘创建目录/root/test[rootlocalhost ~]# touch /root/test/test1.txt ‘在目录/root/test中创建空文件test1.txt[rootlocalhos…

为什么华为200万招聘AI博士,马斯克却推出脑机接口对抗AI?

作者 | 伍杏玲来源 | CSDN(ID:CSDNnews)7 月,华为一则薪资通知刷爆朋友圈:华为给8位博士应届生给予 89.6 万至 201 万的年薪。其中薪资最高的两位博士均研究人工智能相关专业。7 月还有一件大事:马斯克发布…

Artistic Style在windows下的使用(C/C++)

ArtisticStyle是一个开源的源代码格式化工具。主页地址为:http://astyle.sourceforge.net/,它可以应用在C、C、Objective-C、C#、Java等程序语言中。http://astyle.sourceforge.net/astyle.html中为对使用它的详细介绍。从http://sourceforge.net/projec…

ESXi主机与网络中其他主机的网咯数据包捕获

1、tcpdump-uw -i vmk0 -s 1514 host x.x.x.x 指定捕获与某台主机间的网络数据包2、tcpdump -i vmk0 -s 1514 port not 22 and port not 53 在捕获的数据包中,过滤掉指定端口的数据包3、tcpdump-uw -i vmk0 -s 1514 -w traffic.pcap 捕获的数据包保存成PCAP文件&…

Windows下批处理文件(.bat)的使用

批处理(Batch),就是进行批量的处理,英文译文BATCH,批处理文件后缀BAT就取的前三个字母,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。批处理文件是扩展名为.bat或.cmd的文本文件,包含一条或…

金融业加速智能化,解析360金融AI基础架构和应用

传统金融信贷业务中,催收、客服及电销人员占比超过 60%,人员素质参差不齐的现状造成了管理成本过高的问题,由此衍生的客户体验差,也成为困扰金融业的一大通病。 8 月 15 日,在 360金融 AI 媒体开放日上,360…

正则:匹配一个汉字姓名

//汉字姓名正则var reg/^[\u4e00-\u9fa5]{2,}(\.[\u4e00-\u9fa5])?$/console.log(reg.test(张卫健.爱新觉罗))console.log(reg.test(兔子)) 复制代码

NLP命名实体识别开源实战教程 | 深度应用

作者 | 小宋是呢来源 | CSDN博客近几年来,基于神经网络的深度学习方法在计算机视觉、语音识别等领域取得了巨大成功,另外在自然语言处理领域也取得了不少进展。在NLP的关键性基础任务—命名实体识别(Named Entity Recognition,NER…

poj 2063完全背包

题意:给出总资金和投资年份 ,n个股票 给出股票价格和其一年的利润。问如何选择能获得最大利润。 思路:股票可以重复选择,完全背包问题,完全背包也是从01背包衍生而行的,其主要区别在于中间那层循环的次序不…

UTF-8 CPP的使用

UTF-8 CPP是一个简单、小巧、轻量级、跨平台的UTF-8编码字符串库。下面对其使用方法进行简单的介绍:1. 从http://sourceforge.net/projects/utfcpp/下载最新的utf8_v2_3_4.zip源码,将其解压缩;2. 新建一个vs2013 控制台工程TestUTF…

一行js代码识别Selenium+Webdriver及其应对方案

有不少朋友在开发爬虫的过程中喜欢使用Selenium Chromedriver,以为这样就能做到不被网站的反爬虫机制发现。 先不说淘宝这种基于用户行为的反爬虫策略,仅仅是一个普通的小网站,使用一行Javascript代码,就能轻轻松松识别你是否使用…

Android系统移植与调试之-------如何修改Android设备添加重启、飞行模式、静音模式等功能(一)...

1、首先先来看一下修改前后的效果对比图 修改之后的图片 确认重启界面 具体的修改内容在下一篇中具体介绍。 Android系统移植与调试之------->如何修改Android设备添加重启、飞行模式、静音模式等功能(二) 作者:欧阳鹏 欢迎转载&#xf…

鸿蒙霸榜GitHub,从最初的Plan B到“取代Android”?

整理 | 郭芮出品 | CSDN(ID:CSDNnews)距离 8 月 9 日鸿蒙(HarmonyOS)正式发布刚刚过去九天,这场由华为领衔的技术风暴,经过十年蛰伏,终于成功引爆全球。与此同时,一个非官…

CODING 最佳实践:快课网研发效能提升之路

快课企业移动学习平台是上海快微网络科技有限公司自主研发的企业级 SaaS 平台,提供移动学习、考试练习、培训管理、知识分享、统计分析等学习和培训功能,为员工、经销商及客户等全价值链合作伙伴提供全面的知识服务。本文将详细介绍快课网的研发团队是如…

基于chyh1990/caffe-compact在windows vs2013上编译caffe步骤

1. 从https://github.com/chyh1990/caffe-compact下载caffe-compact代码; 2. 通过CMake(cmake-gui)生成vs2013 x64 caffe工程; 3. 从https://github.com/google/protobuf下载ProtoBuf,解压缩,编译ProtoBuf&#xf…

菜鸟学***——菜鸟的旅程

第一章.菜鸟的旅程作为一个典型的菜鸟,第一次去网吧上网我不知道怎么开机是很正常的事情,但是无论怎么菜怎么无知也无法阻止我对于***的崇拜,我喜欢他们的那种神秘和在我们普通人眼中的无所不能,在网络世界里他们就想鱼…

程序员假冒AI,印度公司竟骗取2亿元投资

作者 | 神经小姐姐来源 | HyperAI超神经(ID:HyperAI)人工智能界有句调侃的话——「有多少智能,就有多少人工」,今天,印度的一家人工智能公司就印证了这句话。据《华尔街日报》报道,印度创业公司…

Windows7上使用VS2013编译Caffe源码(不带GPU支持)步骤

1. 从https://github.com/BVLC/caffe/通过git clone下载caffe源码,master分支,版本号为09868ac:$ git clone https://github.com/BVLC/caffe.git ;2. 先使用cmake-gui构建生成vs2013工程,发现有很多错误,提示缺少各种依…

区块链之比特币的潜在激励

想知道更多区块链技术知识,请百度【链客区块链技术问答社区】链客,有问必答!! 比特币,这个建立在开放P2P(点对点)网络结构之上的货币(文献9),继续享受人们的追…

每天超50亿推广流量、3亿商品展现,阿里妈妈的推荐技术有多牛?

作者 | 夕颜出品 | AI科技大本营(ID:rgznai100)随着深度学习、强化学习、知识图谱、AutoML 等 AI 技术出现更多突破,推荐系统领域的企业和开发者开始将这些技术与传统推荐算法相结合,使得推荐效果得到显著提升。不过,越…

常用的JQuery数字类型验证正则表达式

var regexEnum { intege:"^-?[1-9]//d*$", //整数 intege1:"^[1-9]//d*$", //正整数 intege2:"^-[1-9]//d*$", //负整数 num:"^([-]?)//d*//.?//d$", //数字 num1:"^([1-9]//d*|0)$", //正数&#xff…

Java多线程编程实战:模拟大量数据同步

背景 最近对于 Java 多线程做了一段时间的学习,笔者一直认为,学习东西就是要应用到实际的业务需求中的。否则要么无法深入理解,要么硬生生地套用技术只是达到炫技的效果。 不过笔者仍旧认为自己对于多线程掌握不够熟练,不敢轻易应…

Ubuntu中Atom编辑器显示中文乱码的处理方法

在Ubuntu14.04 64位机上安装Atom,依次在终端输入如下命令: 1. $ sudo add-apt-repository ppa:webupd8team/atom 2. $ sudo apt-get update 3. $ sudo apt-get install atom处理中文乱码的问题: 1. 安装文泉驿正黑等相关中文字体&#…

我的世界游戏安装

2019独角兽企业重金招聘Python工程师标准>>> Minecraft 是一款沙盘独立视频游戏,灵感来自于Infiniminer,使用Java编写,由Markus "Notch" Persson 所建立,现由Mojang AB 公司开发。 这里我们介绍如何在pcDuin…

RSA签名的PSS模式

本文由云社区发表作者:mariolu 一、什么是PSS模式? 1.1、两种签名方式之一RSA-PSS PSS (Probabilistic Signature Scheme)私钥签名流程的一种填充模式。目前主流的RSA签名包括RSA-PSS和RSA-PKCS#1 v1.5。相对应PKCS(Public Key Cryptography …

AI真人表情包、斗地主AI......DeeCamp学员做了50个好玩又实用的AI项目

8月16日,2019 DeeCamp人工智能训练营的结营仪式上,展示了600名DeeCamp学员的50个AI实践课题。 结营仪式上,由2019 DeeCamp学员组成的6个项目小组作为代表,现场展示了自己Demo成果,并由李开复、张潼等学术及产业导师现…

libcurl库的使用(通过libcurl库下载url图像)

1. 从http://curl.haxx.se/download.html下载libcurl源码,解压缩; 2. 通过CMake(cmake-gui)生成vs2013 x64位 CURL.sln; 3. 打开CURL.sln,编译会生成libcurl.dll动态库; 4. 在CURL.sln基础上&a…