《深入浅出nodejs》读书笔记(1)

时间:2022-12-14 15:20:29

概述

本来是想着学学node.js试试的,后来发现node.js才是真正的js啊,它里面用到了很多我们平时没用过的js特性,而且还非常优雅,比如它里面的异步编程思想,总之,《深入浅出node.js》绝对值得一看。

下面是我的读书笔记。

单线程

单线程node有如下弱点:

  1. 无法利用多核CPU。
  2. 错误会引起整个应用退出(因为异步编程任何一个错误会导致事件循环失败),应用的健壮性值得考验。
  3. 大量计算占用CPU导致无法继续调用异步I/O。
  4. 不擅长处理CPU密集型业务。

对于1和2,node采用了与Web Workers相同的思路来解决单线程中大计算量的问题:child_process。通过把计算分发到各个子进程,可以将大量计算分解掉。这也解决了问题3,大量计算占用CPU的问题。

对于问题4,node可以通过编写C/C++扩展的方式更高效地利用CPU,甚至可以通过子进程的方式,将一部分node进程当做常驻服务进程用于计算,然后利用进程间的消息来传递结果。所以,CPU密集不可怕,如何合理调度是诀窍。

生态系统

  1. W3C: BOM,DOM
  2. 浏览器: BOM,DOM,ECMAScript
  3. CommonJS: FS,TCP,Stream,Buffer等等。
  4. Node: ECMAScript,FS,TCP,Stream,Buffer等等。

Node模块

1.Node中引入模块需要经历3个步骤:路径分析,文件定位,编译执行。

2.require()在分析标识符的过程中,会出现标识符不包含文件扩展名的情况,这种情况下,Node会按.js、.json、.node的次序补足扩展名,依次尝试。

3.require()在分析文件扩展名之后,可能会得到一个目录,这时Node会将目录当做一个包来处理。Node会在当前目录下查找package.json文件,通过JSON.parse()解析出包描述对象,从中取出main属性指定的文件名进行定位。

4.在node中用下面方式可以知道系统中已有的扩展加载方式:

console.log(require.extensions);
//{ '.js': [Function], '.json': [Function], '.node': [Function] }

5.Node会对获取的js文件内容进行头尾包装,如下所示。所以我们不能直接用exports来导出模块,而应该用module.exports把模块挂载到module下面。

//添加头部
(function(exports, require, module, __filename, __dirname) {
//文件内容开始
var math = require('math');
exports.area = function(radius) {
return Math.PI * radius * radius;
};
//文件内容结束
//添加尾部
});

6.js的一个典型弱点就是位运算,js的位运算是参照java的位运算实现的,但是java位运算是在int型数字的基础上进行的,而js中只有double型的数据类型,在进行位运算的过程中,需要将double型转换为int型,然后再进行。所以在js层面上做位运算的效率不高。

7.Node的原生模块一定程度上是可以跨平台的,在*nix下通过gcc等编译为动态链接共享对象文件(.so),在Windows下则需要通过Visual C++的编译器编译为动态链接库文件(.dll)。

8.在gpy工具的帮助下,可以很简单的编译C/C++模块。

9.符合CommonJS规范的包目录应该包含如下这些文件:

package.json: 包描述文件。
bin: 用于存放可执行二进制文件的目录。
lib: 用于存放js代码的目录。
doc: 用于存放文档的目录。
test: 用于存放单元测试用例的代码。

10.利用下面的命令可以分析出当前路径下能够通过模块路径找到的所有包,并生成依赖树。

$ npm ls

11.AMD模块需要用define来明确定义一个模块,并需要利用return来返回内容。

12.能够兼容Node、AMD、CMD以及常见浏览器环境的代码:

;(function (name, definition) {
// 检测上?文环境是否为AMD?CMD
var hasDefine = typeof define === 'function',
// 检查上?文环境是否为Node
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;
});

《深入浅出nodejs》读书笔记(1)的更多相关文章

  1. 深入浅出Nodejs读书笔记

    深入浅出Nodejs读书笔记 转:http://tw93.github.io/2015-03-01/shen-ru-qian-chu-nodejs-reading-mind-map.html cate ...

  2. 深入浅出Nodejs读书笔记(转)

    Node简介 这一章简要介绍了Node,从中可以了解Node的发展历程及其带来的影响和价值. 为什么叫Node?起初,Ryan Dahl称他的项目为web.js,就是一个Web服务器,但是项目的发展超 ...

  3. 《深入浅出Nodejs》笔记——模块机制(1)

    前言 这是我读<深入浅出Nodejs>的笔记,真是希望我的机械键盘快点到啊,累死我了. CommonJS规范 主要分为模块引用.模块定义.模块标识三个部分. 模块引用 上下文提供requi ...

  4. 《深入浅出Nodejs》笔记——模块机制&lpar;2&rpar;

    前言 书上还有很大一部分讲了C/C++模块的编译过程.核心模块编写和C/C++扩展模块的内容,不过我对C++一窍不通因此没有仔细看,如果以后需要再自习看吧. 包与NPM 第三方模块中,模块和模块之间是 ...

  5. Smashing Nodejs 读书笔记(二)

    了不起的Node.js:将JavaScript进行到底 书名:SMASHING Node.js : JavaScript Everywhere 原作者:(美)劳奇 Rauch.G 译者:赵静 出版日期 ...

  6. Smashing Nodejs 读书笔记(一)

    了不起的Node.js:将JavaScript进行到底 书名:SMASHING Node.js : JavaScript Everywhere 原作者:(美)劳奇 Rauch.G 译者:赵静 出版日期 ...

  7. 《深入浅出nodejs》读书笔记(2)

    概述 本来是想着学学node.js试试的,后来发现node.js才是真正的js啊,它里面用到了很多我们平时没用过的js特性,而且还非常优雅,比如它里面的异步编程思想,总之,<深入浅出node.j ...

  8. 读书笔记之第五回深入浅出关键字---把new说透

    第五回深入浅出关键字---把new说透  ------你必须知道的.net读书笔记 new一个class时,new完成了以下两个方面的内容:一是调用newobj命令来为实例在托管堆中分配内存:二是调用 ...

  9. Mysql实战45讲 04讲深入浅出索引(上)读书笔记 极客时间

    极客时间 Mysql实战45讲 04讲深入浅出索引 极客时间(上)读书笔记  笔记体悟 1.索引的作用:提高数据查询效率2.常见索引模型:哈希表.有序数组.搜索树3.哈希表:键 - 值(key - v ...

随机推荐

  1. &lbrack;转&rsqb;OOAD基本概念

    转载地址:http://www.cnblogs.com/zfc2201/archive/2012/12/09/2810532.html 尊重原作者,转载请注明 学习目标: 1.理解与掌握面向对象的概念 ...

  2. 剑指Offer 把字符串转换成整数

    题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法 ...

  3. ado&period;net增删改查操作

    ado.net是数据库访问技术将数据库中的数据,提取到内存中,展示给用户看还可以将内存中的数据写入数据库中去 并不是唯一的数据库访问技术,但是它是最底层最基础的数据库访问技术 使用ado.net对数据 ...

  4. Android 背景图片重复平铺

    有时候我们需要将一个图片横向或者纵向的平铺(重复循环),这个时候我们需要创建一个xml文件,如下: <?xml version ="1.0" encoding =" ...

  5. oracle 查询谁在用undo

    SELECT TO_CHAR(s.sid)||','||TO_CHAR(s.serial#) sid_serial,NVL(s.username, 'None') orauser,s.program, ...

  6. v880 debug

    zte v880手机,ubuntu中配置真机调试, 1.开启手机调试模式2.增加/etc/udev/rules.d/51-android.rules. 内容如下:SUBSYSTEM=="us ...

  7. jxl对excel删除行

    简单记录下: package com.pingan; import java.io.File; import java.util.regex.Matcher; import java.util.reg ...

  8. Mongodb 集群搭建以及常见错误

    Mongodb 集群搭建以及常见错误 1 关于Replica Sets +Sharding(主从复制加分片)搭建,不这详细去说,网上有很多,大部分的例子就三台服务器之间做主从复制,分2个shard,架 ...

  9. AVR之BOOTLOADER技术详解(转)

    源:http://blog.csdn.net/zhenhua10/article/details/6442412 ATmega128具备引导加载支持的用户程序自编程功能(In-System Progr ...

  10. iOS开发 - 啰嗦讲解 Runloop

    写在前面的 为什么要了解 RunLoop?如果你想成为一个高级iOS开发工程师,那这是你必须了解的东西,他能帮助你更好的理解底层实现的原理,可以利用它的特性做出一些高效又神奇的功能.RunLoop这个 ...