等等,你可能误解nodejs了–通俗的概括nodejs的真相
最近刚把产品从cpp平台迁移到nodejs平台了. 很多以前关于nodejs的观念被颠覆了. 这里分享出来, 欢迎大家批评指正.
"nodejs是做服务器端开发的, 它一定和web相关,几乎是用来做网站开发的." 这是我之前一直的观念. 相信这可能也是很多人对nodejs的初步认识吧. 但后来我才发现, 我可能错了.
第一个问题: nodejs到底是什么?
http://nodejs.org/ 官方主页上有一段解释: "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."
我们注意其中的几个关键字: nodejs是一个平台, 它构建在chrome的v8引擎之上, 能简易的构建快速,可扩展的网络应用程序.......
这里官方用的"网络应用程序", 整个描述没有提到"web", "server" 等等概念. 这段话的描述中, 有两个是重点, 第一,就是chrome的v8引擎. 第二, 是事件驱动的非阻塞io模型. 把握住这两点, 我觉得就算掌握了nodejs的真谛了.
这么说吧, 举个例子, 类比来说, 概念上, nodejs相当于.net, jvm 或者 python. 它是一个运行平台, 只不过它运行的是javascript语言而已. 类似地, .net一般运行C#, vb等编译过后的il. 而jvm一般运行java编译成的字节码, python一般运行python语言.
你可能要问, 那么nodejs是不是也能实现 .net等等这些平台的功能呢. 比如写个窗口桌面程序, 做socket网络通信, 以及访问磁盘文件等等.
恩, 这些问题的答案都是肯定的.
nodejs核心主要是由两部分组成的:
第一, 是v8引擎, 它负责把javascript代码解释成本地的二进制代码运行.
第二, 是libuv, 类似windows上的窗口消息机制, 它主要负责订阅和处理系统的各种内核消息. 而且它也实现了消息循环(是不是很耳熟? 没错, 这个几乎就和windows 的窗口消息循环是一个概念.). 它的前身是linux上的libev, 专门封装linux上的内核消息机制. 后来nodejs重写了它, 并在windows上使用iocp技术重新实现了一遍. 所以nodejs现在能跨平台运行在windows上了.
nodejs其实就是libuv的一个应用而已.
你自己写程序也可以集成libuv进来, 这样你的c++程序就有了消息循环了. 不再是简单main函数了. 你可以订阅系统的事件, 然后当事件发生时, 系统会调用你的回调函数, 就跟windows上的button click事件一样方便. 而且是跨平台的哦. 是不是很酷. 你几乎可以订阅所有的系统事件, 比如socket事件, 文件读写事件等等.
nodejs简单的说只是把javascript解释成c++的回调, 并挂在libuv消息循环上, 等待处理. 这样就实现了非阻塞的异步处理机制.
那么为什么是javascript而不是其他的语言. 很简单, 因为javascript的闭包. 这非常适合做回调函数. 因为我们一般都希望当回调发生时, 它能记住它原来所在的上下文. 这就是闭包最好的应用场景.
这里有libuv的详细介绍 http://nikhilm.github.io/uvbook/.
好像扯远了, 说nodejs的, 怎么扯到libuv了. 很简单, 因为 nodejs只是libuv的一个应用. 先了解libuv才能了解nodejs的实质和前世今生.
我们再回来说nodejs.
从另一个角度看, 上面的工作都分别由v8和libuv做了. 那么nodejs到底做了什么呢? 我们先看一下nodejs的文档: http://nodejs.org/api/
对了,除了用javascript封装libuv框架之外, nodejs就是实现了这些api 功能. 这些api大部分是用javascript写的, 也有一部分是c++写的.
这是nodejs官方的仓库, https://github.com/joyent 其中有很多nodejs的插件. 有了这些nodejs就可以实现非常丰富的功能了.
作为结尾, 写一个简单的nodejs 另类常规helloworld 程序.
//test.js
//=================
console.log("hello world!")
//=================
存成test.js. 然后运行: node test.js
就能看到效果了.
怎么样, 看起来是不是很像python的感觉. 但是用的是javascript哦. 用这个代替python, 是不是爽死了.
就到这吧. 关于libuv, 关于nodejs插件. 等等话题, 希望能跟大家沟通交流.
欢迎大家访问我的独立博客: http://byNeil.com
等等,你可能误解nodejs了–通俗的概括nodejs的真相的更多相关文章
- 【安装Nodejs】CentOS7 下安装NodeJs+Express+MongoDB+Redis
最近想拿NodeJS做个文档管理系统玩玩,看看mongdb的gridfs效率咋样,谁晓得因为一个Yeoman的脚手架,整来整去的把文件权限全部搞乱,一想算了,还是重来搞一套吧! 1.安装 yum i ...
- nodeJs入门篇之认识nodejs
摘要:将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏览器就基于V8,同时打开 ...
- nodejs实战:使用原生nodeJs模块实现静态文件及REST请求解析及响应(基于nodejs6.2.0版本,不使用express等webMVC框架 )
一.准备工作 1.安装nodejs 首先你需要安装nodeJs 那么nodejs官网:http://nodejs.cn/,下载相应版本,一步一步安装. 二.使用nodejs开发服务器后台应用 1.创建 ...
- 在阿里云 ECS 搭建 nginx https nodejs 环境(三、nodejs)
在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 第一步 指定版本源 执行 ...
- 前端笔记之NodeJS(一)初识NodeJS&内置模块&特点
一.NodeJS简介 NodeJS是开发服务器后台的东西,和PHP.JavaEE.python类似,和传统的浏览器的关注DOM的JS完全不同,将JavaScript触角伸到了服务器端.内核是Chrom ...
- NodeJS 极简教程 <1> NodeJS 特点 & 使用场景
NodeJS 极简教程 <1> NodeJS 特点 & 使用场景 田浩 因为看开了所以才去较劲儿. 1. NodeJS是什么 1.1 Node.js is a JavaScri ...
- NodeJS在线聊天室(NodeJS & SocketIO & Express & EJS & MongoDB & Gulp)
项目背景 这个项目主要是为了玩玩NodeJS,项目的方向大概是做出类似QQ的在线聊天系统.想要在线体验可以点击在线演示. 项目使用PM2进行部署和管理,功能在不断的迭代开发中.如果你觉得这个项目比较有 ...
- 用Nodejs+Express搭建web,nodejs路由和Ajax传数据并返回状态,nodejs+mysql通过ajax获取数据并写入数据库
小编自学Nodejs,看了好多文章发现都不全,而且好多都是一模一样的 当然了,这只是基础的demo,经供参考,但是相信也会有收获 今天的内容是用Nodejs+Express搭建基本的web,然后呢no ...
- [NodeJs] 用Nodejs+Express搭建web,nodejs路由和Ajax传数据并返回状态,nodejs+mysql通过ajax获取数据并写入数据库
小编自学Nodejs,看了好多文章发现都不全,而且好多都是一模一样的 当然了,这只是基础的demo,经供参考,但是相信也会有收获 今天的内容是用Nodejs+Express搭建基本的web,然后呢no ...
随机推荐
- C# GDI+ 实现橡皮筋技术
原文 C# GDI+ 实现橡皮筋技术 应该有很多人都在寻找这方面的资料,看看下面我做的,或许对你会有所帮助,但愿如此. 为了实现橡皮筋技术,我用了两种方法: 第一种是利用ControlPain ...
- Spring3X升级到Spring4X时,出现的问题
1.1.异常描述 Description Resource Path Location Type Class 'org.springframework.http.converter.json.Mapp ...
- 利用Console来学习、调试JavaScript
一 什么是 Console Console 是用于显示 JS和 DOM 对象信息的单独窗口.并且向 JS 中注入1个 console 对象,使用该对象 可以输出信息到 Console 窗口中. 二 ...
- axis2 webService开发指南(3)
复杂对象类型的WebService 这次我们编写复杂点的WebService方法,返回的数据是我们定义属性带getter.setter方法JavaBean,一维数组.二维数组等 1.服务源代码 新建一 ...
- easyui 验证框
转自:http://blog.csdn.net/pqszq1314/article/details/25896163 例如 校验输入框只能录入0-1000之间 最多有2位小数的数字 表单<inp ...
- 搭建Spring开发环境并编写第一个Spring小程序
搭建Spring开发环境并编写第一个Spring小程序 2015-05-27 0个评论 来源:茕夜 收藏 我要投稿 一.前面,我写了一篇Spring框架的基础知识文章,里面没 ...
- MySQL5.6.35部署
1.下载软件 [root@localhost src]# wget -q http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glib ...
- xdebug 一直报错 upstream timed out (110: Connection timed out) while reading response header from upstream
本地主机(Windows环境192.168.66.1)访问虚拟机(192.168.66.139)里面的搭建的php环境(系统centos6.5版本,php版本是5.5.30 ,xdebug 2.4.0 ...
- Python String模块详解
>>> import string >>> string.ascii_letters 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKL ...
- Java泛型:泛型的定义(类、接口、对象)、使用、继承
地址 http://blog.csdn.net/lirx_tech/article/details/51570138 1. 设计泛型的初衷: 1) 主要是为了解决Java容器无法记忆元素类型的问题 ...