<<深入浅出nodeJS>>读书笔记--<一>

   前语:nodeJs这书早在五月份的时候就已经买了,那时候才刚刚接触node,本想着这书应该是node入门级比较系统化的书,可翻了几页之后呢,发现好多地方都晦涩难懂,特别是看到内建模块的C++实现时,瞬间有想瞌睡的感觉....-_-从这之后,这书一直被我闲置在书桌角落,再无动过,看书学习node的想法就这样放弃了,转为上网学习基础的语法API..就这样,边看API边跟着做一些小例子,慢慢的,发现基本的API用法都已经掌握了,于是,去搜搜与node有关的一些技术博客,希望能够进阶去了解node。开始去尝试用node做一些完整的小例子,比如简单的博客实现,聊天室...就这么过了两个月左右,发现对node的了解基本上已经算是有了一个全面大致的认识了,所有的知识点都了解得差不多了,于是开始着手去实现一个简单的订餐app,在此之前,为了能够强化所有知识点以便顺利完成服务器端的编写,再一次翻开了那本稍有些许灰尘的<<深入浅出nodeJs>>,这一次,没有了初次的那种陌生羞涩感,有的只是对现有知识体系的扩充与强化,那么,我将用自己的语言来将这本书中的重要知识点一一记下来....

   第一章  概述

   node的起源及基本作用

   node的特点:

    1、异步I/O  (发送请求与处理请求互不干扰)

$.POST(URL,function(data){
    console.log('成功收到');
})
   console.log('发送成功');

    2、事件与回调函数(node是事件驱动的)

 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('服务器正在运行');

    3、单线程

     优势:资源合理分配利用,避免了多线程上下文切换时的开销,性能更佳

     劣势:

     - 无法利用多核CPU

     - 单一线程某处一旦出现错误,将导致整个线程退出

     - 大量计算占用CPU导致无法继续调用异步I/O

    4、共享平台 (linux和window)

   node的应用场景:

     1、I/O密集型

     2、分布式应用

   第二章  模块机制

    node是基于javascript,而javascript本身又是有许多先天不足的,而且它的使命是为了服务客户端,对于服务器端的支持 (模块系统,标准库,标准接口,缺乏包管理系统),简直就是不了了之,根本就不在意.好在,CommonJS规范面世了,它的使命就是 希望Javascript能够在任何地方运行.

   commonJS对模块的定义有三个部分,分别是:1、模块引用  2、模块定义  3、模块标识

   -require 

   -exports 

   -module 

    1、模块引用:     

var math = require ('math');

    2、模块定义:

//math.js
exports.add = function (){
     var sum = 0;
     while (sum < 10){
        sum += 1;
   }
  return sum;
 } 

    然后通过,require来引入模块,就可以调用定义的属性和方法了.require == exports   

    3、模块标识:

    传递给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; });

 

posted @ 2014-09-08 01:13  veeking  阅读(794)  评论(0编辑  收藏  举报