Node 入门<1>

1. Node

   JavaScript web服务器框架,主要特点:事件驱动,异步 I/O,强制不共享任何资源的单线程,单进程系统。

  每一个node进程都构成网络应用中的一个节点。

           

左图是Chrome浏览器的大体框架,右图是Node大体框架。补充说明webkit是用c语言开发的浏览器内核。

  浏览器的主要组件有:

  1. HTML,XML,CSS,JavaScript 解析器
  2. LayOut
  3. 文字和图形渲染
  4. 图像解码
  5. GPU交互
  6. 网络访问
  7. 硬件加速

  Node是一个JavaScript web应用服务器框架,即在Node中,JavaScript 可以访问本地文件,搭建websocket服务器端,可以连接数据库,可以创建web worker多线程。

2. 异步事件如何协作

  Node是事件驱动的,而事件又是异步的。这里就需要解决多个异步事件如何协作的问题,也就是异步事件之间如何通信。

  方法:将函数作为对象传递给方法作为实参进行调用。

  Node的优势主要事件驱动异步I/O,即避免CPU等待I/O或者网络请求,从而达到高效利用CPU,快速处理大量网络请求的效果。但是Node保持JavaScript单线程的特点,意味这,Node 线程之间无法共享任何状态。单线程避免了多线程上下文切换,和资源共享带来的问题,但是它也避免了多线程的优势,带来了一些问题:

  • 单线程无法利用多核CPU
  • 错误会导致整个应用退出,应用的健壮性值得考验
  • 如果大量计算占用cpu,将导致无法调用异步I/O

  解决方案是:创建工作线程来进行计算,避免大量计算主线程的I/O处理。

  补充:CPU,进程,线程之间的关系

  单个CPU一次只能运行一个任务,即一个进程。一个进程可以包含多个线程,进程内的内存空间是多个线程共享的,多个线程可以同时运行。但是由于进程内的内存空间的数量或者性质不同,<1>导致某些内存空间(a)一次只允许一个线程使用,那么如何解决多线都要使用的情况呢,利用互斥锁来解决这个问题,即如果有一个线程正在使用a内存空间,那么就给a内存空间上锁,其他要访问a内存空间的线程,只能等待,当使用完之后,a内存空间的锁被打开,下一个线程才允许访问。<2>某些内存空间(b)只允许特定数量的线程访问,如何解决超过该限制数量的线程使用该内存空间呢,利用信号量来解决这个问题,即给(b)设置一个信号量,当一个线程进入则该信号量-1,如果一个线程使用完毕,则信号量+1,若信号量=0时,表示该资源已经达到线程的访问上限,不再允许其他线程访问,其他线程只能等待。

  进程是由程序,数据集合和进程控制块三部分组成。程序是指令的集合,数据集合是程序在执行时分配的数据和工作区,进程控制块包含进程描述信息和控制信息,是进程存在的唯一标识。进程拥有独立的地址空间,处理机分配给线程,线程通过消息通信协同完成一个任务。

  JavaScript是单线程的,是指JavaScript只在一个线程上运行(创建了web worker 的JavaScript脚本例外)。而V8 JavaScript 引擎是由C++ 编写,是一个多线程程序,单个JavaScript 只能在一个线程上运行,其他的V8线程在后台配合浏览器的I/O线程。补充:web worker允许一个JavaScript脚本创建多个线程,子线受主线程的控制,不能操作DOM。JavaScript 单线程也是为了避免多线程同时造作DOM带来不一致性。worker 线程与主线程的通信也是通过事件机制来完成的。

3.语言规范

  

  浏览器端是W3C标准,Node端是CommonJs标准。

  

时间: 2024-09-28 18:51:05

Node 入门<1>的相关文章

node入门笔记

看了<node入门>http://www.nodebeginner.org/index-zh-cn.html.有些疑难点记下来. 在导出模块的时候给出的代码是这样的 1 var http = require("http"); 2 3 function start() { 4 function onRequest(request, response) { 5 console.log("Request received."); 6 response.writ

Node入门(转)

原文链接:http://www.nodebeginner.org/index-zh-cn.html Node入门 作者: Manuel Kiessling翻译: goddyzhao & GrayZhang & MondayChen 关于 本书致力于教会你如何用Node.js来开发应用,过程中会传授你所有所需的“高级”JavaScript知识.本书绝不是一本“Hello World”的教程. 状态 你正在阅读的已经是本书的最终版.因此,只有当进行错误更正以及针对新版本Node.js的改动进行

《node入门》学习

node入门原书地址:https://www.nodebeginner.org/index-zh-cn.html node入门,循序渐进讲了javascript,node的回调和一些api的应用,很清晰,翻译也很给力.最终是一个例子,可以上传图片以及展示. 最后例子,遇到了麻烦,运行报错 可见零时文件已经创建 代码如下 1 function upload(response, request){ 2 console.log("Request handler 'upload' was called.

node入门(二)——gulpfile.js初探

本文关于gulpfile.js怎么写,利于完成个性化需求.本文开发环境默认已安装node,详情参考<node入门(一)——安装>. 一.安装gulp npm install -g gulp 二.进入项目根目录,创建package.json文件 npm init 现在项目目录下新增了package.json文件,内容如下: 三.在package.json里增加devDependencies配置项,告诉node在install时要下载哪些插件模块,例如下面是要加载gulp-less插件: gulp

《Node入门》读书笔记——用Node.js开发一个小应用

如需转载请注明出处 http://blog.csdn.net/as645788 Android APP的开发告一段落,一个稳定的.实现了基本功能的APP已经交付用户使用了!我和老板交流了下,接下来准备转战Node.js了,而且一部分前端的功能也要做进去!哈哈哈~~~接下来要朝一个全(zuo)栈(si)工程师进发了,想想都有点小激动呢!这几天一直在学新东西,HTML CSS JavaScript jQuery SQL bootstrap Node.js ··········· (好吧,看着这么多前

[整理]Node入门 &#187; 一本全面的Node.js教程 - Demo实践所遇到的问题

花了一个上午看完[转载]Node入门 » 一本全面的Node.js教程 根据里面的Demo自己手动实现过程中还是需到写问题,特整理在此. <1>.由于node.msi安装包已经自动添加了系统环境变量,所以可以在任意地方路径下运行node xxx.js.<2>.确定2个环境变量是否已添加(1)一个是PATH上增加node.exe的目录C:\Program Files\nodejs,(已自动添加)(2)一个是增加环境变量NODE_PATH,值为C:\Program Files\node

node入门开发遇到的问题

最近在看node入门这本书,https://cnodejs.org/getstart 里面是跟随作者完成一个小的demo,书中不免会有遗漏的,下面是我在实现里面最后一个例子时遇到的问题,希望能够帮助其他人. 先来看看整体的代码: index.js /** * Created with IntelliJ IDEA. * User: Administrator * Date: 15-4-18 * Time: 下午6:08 * To change this template use File | Se

Node入门教程(1)目录

aicoder.com 全栈实习之简明 Node 入门文档 aicoder.com 线下实习: 不 8000 就业,不还实习费. 如果需要转载本文档,请联系老马,Q: 515154084 JS基础教程 如果您没有js的基础,建议您先学一下老马的前端免费视频教程 table list 第一章:NodeJS 概述 第二章:NodeJS 安装 第三章:NodeJs 第一个程序 第四章:global 全局变量 第五章:node 模块化(上)模块化演进 第五章:node 模块化(下)npm与yarn详解

Node 入门

Node 入门 NodeJs 安装,HelloWorld 下载地址 https://nodejs.org/zh-cn/ https://nodejs.org/dist/ 用 Node命令行输出HelloWorld console.log("Hello World"); NodeJs 创建应用 http 模块引用 require('http') 服务器创建 http.createServer() 端口的监听 server.listen(8888) 使用 node环境运行 node ser

node入门学习(二)

一.模块系统 1.创建模块和引用模块 //如何创建一个模块 exports.hello = function(){ console.log('hello worl'); }; //这创建了一个模块 //如何引用模块 //1.require(); var hello = require('./module.js'); hello.hello(); //2. var {hello} = require('./module.js'); hello(); 2.服务端的模块 //服务端的模块 var ht