概述

本来是想着学学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. 【读书笔记】《Computer Organization and Design: The Hardware/Software Interface》(1)

    笔记前言: <Computer Organization and Design: The Hardware/Software Interface>,中文译名,<计算机组成与设计:硬件 ...

  2. 算法设计手冊(第2版)读书笔记, Springer - The Algorithm Design Manual, 2ed Steven S.Skiena 2008

    The Algorithm Design Manual, 2ed 跳转至: 导航. 搜索 Springer - The Algorithm Design Manual, 2ed Steven S.Sk ...

  3. [读书笔记]设计原本[The Design of Design]

    第1章 设计之命题 1.设计首先诞生于脑海里,再慢慢逐步成形(实现) 2.好的设计具有概念完整性:统一.经济.清晰.优雅.利落.漂亮... 第2章 工程师怎样进行设计思维——理性模型 1.有序模型的有 ...

  4. 《Unix编程艺术》读书笔记(1)

    <Unix编程艺术>读书笔记(1) 这两天開始阅读该书,以下是自己的体会,以及原文的摘录,尽管有些东西还无法全然吃透. 写优雅的代码来提高软件系统的透明性:(P134) Elegance ...

  5. 【英语魔法俱乐部——读书笔记】 3 高级句型-简化从句&倒装句(Reduced Clauses、Inverted Sentences) 【完结】

    [英语魔法俱乐部——读书笔记] 3 高级句型-简化从句&倒装句(Reduced Clauses.Inverted Sentences):(3.1)从属从句简化的通则.(3.2)形容词从句简化. ...

  6. 【英语魔法俱乐部——读书笔记】 2 中级句型-复句&合句(Complex Sentences、Compound Sentences)

    [英语魔法俱乐部——读书笔记] 2 中级句型-复句&合句(Complex Sentences.Compound Sentences):(2.1)名词从句.(2.2)副词从句.(2.3)关系从句 ...

  7. Computer architecture Computer organization

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCEComputer architectureNINTH EDITION C ...

  8. 图解TCP/IP读书笔记(一)

    图解TCP/IP读书笔记(一) 第一章 网络基础知识 本学期的信安概论课程中有大量的网络知识,其中TCP/IP占了相当大的比重,让我对上学期没有好好学习计算机网络这门课程深感后悔.在老师的推荐下开始阅 ...

  9. 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)

    <Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...

  10. 《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)

    <Linux/Unix系统编程手册>读书笔记 目录 第11章 这章主要讲了关于Linux和UNIX的系统资源的限制. 关于限制都存在一个最小值,这些最小值为<limits.h> ...

随机推荐

  1. API Test WebApiTestClient工具安装及使用

    一.guget安装: 1.解决方案右键-管理解决方案的nuget程序包打开如下图: 搜索WebApiTestClient,然后选择查询出的项目,右边点击安装即可:   2.安装会有如下图提示: 确定即 ...

  2. centos-0 基础

    netstat -nap #会列出所有正在使用的端口及关联的进程/应用kill -9 1777        #杀掉编号为1777的进程(请根据实际情况输入) http://www.cnblogs.c ...

  3. visual studio vode 汉化

    在vs code 的商店中搜索Chinese,找到如下模块,安装. 安装后,按下ctrl+shift+p,找到configure display language ,点击进入,修改 改成如图字母就可以 ...

  4. Ubuntu16.04 静态IP设置

    为VMware虚拟机内安装的Ubuntu 16.04设置静态IP地址NAT方式 1.安装环境 VMware 12 Ubuntu 16.04 x86_64 2.在VMware中,配置网络环境 VMwar ...

  5. 利用css实现带有省略号的段落

    带有省略号的段落就是你只能在一行显示一段文字,文字过长是肯定不能完全显示的,如果默认的话,超出的文字会自动换行,撑大盒子. 1.这时需要设置white-space: nowrap,禁止换行.这样的话, ...

  6. egret 取消自动连接github

  7. HTML5-盒子的使用

    一. border-color border-width border-style 属性用法遵循顺时针顺序. border-top- border-left- border-bottom- borde ...

  8. python 数据可视化 -- 清理异常值

    中位数绝对偏差(Median Absolute Deviation, MAD)用来描述单变量(包含一个变量)样本在定量数据中可变性的一种标准.常用来度量统计分布,因为它会落在一组稳健的统计数据中,因此 ...

  9. ABP 依赖注入

    1.ABP自动注入 //IapplicationService注入方式暴露接 //ITransientDependency 不会暴露接口 ITransientDependency和ISingleton ...

  10. python3 第二十九章 - 内置函数之tuple相关

    Python元组包含了以下内置函数 序号 方法及描述 实例 1 len(tuple)计算元组元素个数. >>> tuple1 = ('Google', 'Baidu', 'Taoba ...