前语:nodeJs这书早在五月份的时候就已经买了,那时候才刚刚接触node,本想着这书应该是node入门级比较系统化的书,可翻了几页以后呢,发现好多地方都晦涩难懂,特别是看到内建模块的C++实现时,瞬间有想瞌睡的感受....-_-从这以后,这书一直被我闲置在书桌角落,再无动过,看书学习node的想法就这样放弃了,转为上网学习基础的语法API..就这样,边看API边跟着作一些小例子,慢慢的,发现基本的API用法都已经掌握了,因而,去搜搜与node有关的一些技术博客,但愿可以进阶去了解node。开始去尝试用node作一些完整的小例子,好比简单的博客实现,聊天室...就这么过了两个月左右,发现对node的了解基本上已经算是有了一个全面大体的认识了,全部的知识点都了解得差很少了,因而开始着手去实现一个简单的订餐app,在此以前,为了可以强化全部知识点以便顺利完成服务器端的编写,再一次翻开了那本稍有些许灰尘的<<深刻浅出nodeJs>>,这一次,没有了初次的那种陌生羞涩感,有的只是对现有知识体系的扩充与强化,那么,我将用本身的语言来将这本书中的重要知识点一一记下来....javascript
第一章 概述前端
node的起源及基本做用java
node的特色:node
一、异步I/O (发送请求与处理请求互不干扰)linux
$.POST(URL,function(data){ console.log('成功收到'); }) console.log('发送成功');
二、事件与回调函数(node是事件驱动的)c++
var http = require('http'); http.createServer(function(req,res){ var postData = ""; req.setEncoding('url8'); req.on('data',function(trunk){ postData += trunk; }); req.on('end',function(){ res.end(postData); }); }).listen(8080); console.log('服务器正在运行');
三、单线程npm
优点:资源合理分配利用,避免了多线程上下文切换时的开销,性能更佳json
劣势:后端
- 没法利用多核CPU数组
- 单一线程某处一旦出现错误,将致使整个线程退出
- 大量计算占用CPU致使没法继续调用异步I/O
四、共享平台 (linux和window)
node的应用场景:
一、I/O密集型
二、分布式应用
第二章 模块机制
node是基于javascript,而javascript自己又是有许多先天不足的,并且它的使命是为了服务客户端,对于服务器端的支持 (模块系统,标准库,标准接口,缺少包管理系统),简直就是不了了之,根本就不在乎.好在,CommonJS规范面世了,它的使命就是 但愿Javascript可以在任何地方运行.
commonJS对模块的定义有三个部分,分别是:一、模块引用 二、模块定义 三、模块标识
-require
-exports
-module
一、模块引用:
var math = require ('math');
二、模块定义:
//math.js exports.add = function (){ var sum = 0; while (sum < 10){ sum += 1; } return sum; }
而后经过,require来引入模块,就能够调用定义的属性和方法了.require == exports
三、模块标识:
传递给require方法的参数 , 字符串或路径
2.2 Node的模块实现
在Node中引入模块,经历三个步骤:
(1) 路径分析
-- 核心模块 , fs http
-- 文件模块 , .或者..开始的相对路径文件模块
-- 以/开头的绝对路径模块
-- 非路径形式的内建模块,如自定义的connect模块
(2) 文件定位
-- 按路径
-- 按后缀名, .js 、.node 、.json
(3) 编译执行
-- javascript 核心模块,经历标识符分析后,直接定位到内存中,比普通的文件模块从磁盘中查找要快得多
-- c++内建模块,二进制、数组、内存,使用Binding()方法来协助加载内建模块
如何编写: NODE_MODULE()最底层 --> process.binding 定义到内存中
如何导出:层级依赖关系,内建c++ --> 核心模块Javascript --> 文件模块
2.3 包与NPM
模块组织代码,包组织模块
package.json描述文件,dependencies:依赖的包列表
发布包, npm publish <folder>
2.4 先后端共用模块
先后端模块的侧重点不一样。前端须要重服务器加载,用到了异步加载模块,后端的模块都存在本地,用到了同步加载。
CommodJs规范:同步模式,适用后端
AMD规范:异步模式,适用前端
CMD规范:国人自创,前二者的结合体,加载和定义相似AMD,模块导出和引入接近CommonJs规范的定义
兼容多种规范的定义:
为了让同一模块能够在先后端运行,实现以下:
// 将hello 方法定义到不一样的运行环境中
(function(name,definition){ // 检测上下文环境是不是 AMD 或者 CMD var hasDefine = typeof define === 'function'; // 检测上下文环境是不是Node var hasExports = typeof module !=='undefined' && module.exports; if(hasDefine){ // AMD CMD define(definition); }else if(hasExports){ // Node module.exports = definition(); }else{ // 将模块的执行结果挂在window变量中,在浏览器中this指向window对象 this[name] = definition(); } })('hello',function(){ var hello = function(){} return hello; });