最近刚把产品从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的真相的更多相关文章

  1. 【安装Nodejs】CentOS7 下安装NodeJs+Express+MongoDB+Redis

    最近想拿NodeJS做个文档管理系统玩玩,看看mongdb的gridfs效率咋样,谁晓得因为一个Yeoman的脚手架,整来整去的把文件权限全部搞乱,一想算了,还是重来搞一套吧! 1.安装  yum i ...

  2. nodeJs入门篇之认识nodejs

    摘要:将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏览器就基于V8,同时打开 ...

  3. nodejs实战:使用原生nodeJs模块实现静态文件及REST请求解析及响应(基于nodejs6.2.0版本,不使用express等webMVC框架 )

    一.准备工作 1.安装nodejs 首先你需要安装nodeJs 那么nodejs官网:http://nodejs.cn/,下载相应版本,一步一步安装. 二.使用nodejs开发服务器后台应用 1.创建 ...

  4. 在阿里云 ECS 搭建 nginx https nodejs 环境(三、nodejs)

    在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 第一步 指定版本源 执行 ...

  5. 前端笔记之NodeJS(一)初识NodeJS&内置模块&特点

    一.NodeJS简介 NodeJS是开发服务器后台的东西,和PHP.JavaEE.python类似,和传统的浏览器的关注DOM的JS完全不同,将JavaScript触角伸到了服务器端.内核是Chrom ...

  6. NodeJS 极简教程 <1> NodeJS 特点 & 使用场景

    NodeJS 极简教程 <1> NodeJS 特点 & 使用场景 田浩 因为看开了所以才去较劲儿.   1. NodeJS是什么 1.1 Node.js is a JavaScri ...

  7. NodeJS在线聊天室(NodeJS & SocketIO & Express & EJS & MongoDB & Gulp)

    项目背景 这个项目主要是为了玩玩NodeJS,项目的方向大概是做出类似QQ的在线聊天系统.想要在线体验可以点击在线演示. 项目使用PM2进行部署和管理,功能在不断的迭代开发中.如果你觉得这个项目比较有 ...

  8. 用Nodejs+Express搭建web,nodejs路由和Ajax传数据并返回状态,nodejs+mysql通过ajax获取数据并写入数据库

    小编自学Nodejs,看了好多文章发现都不全,而且好多都是一模一样的 当然了,这只是基础的demo,经供参考,但是相信也会有收获 今天的内容是用Nodejs+Express搭建基本的web,然后呢no ...

  9. [NodeJs] 用Nodejs+Express搭建web,nodejs路由和Ajax传数据并返回状态,nodejs+mysql通过ajax获取数据并写入数据库

    小编自学Nodejs,看了好多文章发现都不全,而且好多都是一模一样的 当然了,这只是基础的demo,经供参考,但是相信也会有收获 今天的内容是用Nodejs+Express搭建基本的web,然后呢no ...

随机推荐

  1. Spring Data MongoDB 三:基本文档查询(Query、BasicQuery

    一.简介 spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一篇我 ...

  2. 关于No ManagedConnections available within configured blocking timeout异常的解决

    最近由于系统和业务重构需要,需要把线上1亿数据迁移到新库,由于业务变更,新表老表结构有变化,没法直接用dba dump的方式,需要自己写转换程序迁移.今天在调试的时候,碰到一个蛋疼的问题,就是一开始查 ...

  3. create-react-app react脚手架

    create-react-app react脚手架 官方脚手架 1.安装 npm install -g create-react-app 2.创建项目 create-react-app react-c ...

  4. GeoServer之sqlserver插件使用

     GeoServer之sqlserver插件使用 安装好sqlserver插件后,点击出现的第一个选项,开始创建wms服务. 输入参数: 工作区:为geoserver中创建的工作区 数据源名称:自定义 ...

  5. winform 实现局部更新(如ajax实现)而整个界面不产生闪烁的解决方案

    转自原文winform 实现局部更新(如ajax实现)而整个界面不产生闪烁的解决方案 一.通过对窗体和控件使用双缓冲来减少图形闪烁(当绘制图片时出现闪烁时,使用双缓冲) 对于大多数应用程序,.NET ...

  6. STL源码剖析之空间配置器

    本文大致对STL中的空间配置器进行一个简单的讲解,由于只是一篇博客类型的文章,无法将源码表现到面面俱到,所以真正感兴趣的码农们可以从源码中或者<STL源码剖析>仔细了解一下. 1,为什么S ...

  7. centos7+tomcat部署JavaWeb项目超详细步骤

    我们平时访问的网站大多都是发布在云服务器上的,比如阿里云.腾讯云等.对于新手,尤其是没有接触过linux系统的人而言是比较有困难的,而且至今使用云服务器也是有成本的,很多时候我们可以通过虚拟机自己搭建 ...

  8. Django实现支付宝付款和微信支付

    支付宝支付和微信支付是当今互联网产品常用的功能,我使用Django Rest Framework实现了网页上支付宝支付和微信支付的一个通用服务,提供rpc接口给其他服务,包括获取支付宝支付页面url的 ...

  9. split files test

    python split_upload.py   /root/github/python/s3_test/test.txt    dbelt      dumps python download_to ...

  10. Python与Go插入排序

    #!/usr/bin/env python # -*- coding: utf-8 -*- # 插入排序 # 时间复杂度 O(n^2) import time def logger(func): st ...