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

   前语: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; });
相关文章
相关标签/搜索