《深入浅出nodejs》读书笔记(1)
概述
本来是想着学学node.js试试的,后来发现node.js才是真正的js啊,它里面用到了很多我们平时没用过的js特性,而且还非常优雅,比如它里面的异步编程思想,总之,《深入浅出node.js》绝对值得一看。
下面是我的读书笔记。
单线程
单线程node有如下弱点:
- 无法利用多核CPU。
- 错误会引起整个应用退出(因为异步编程任何一个错误会导致事件循环失败),应用的健壮性值得考验。
- 大量计算占用CPU导致无法继续调用异步I/O。
- 不擅长处理CPU密集型业务。
对于1和2,node采用了与Web Workers相同的思路来解决单线程中大计算量的问题:child_process。通过把计算分发到各个子进程,可以将大量计算分解掉。这也解决了问题3,大量计算占用CPU的问题。
对于问题4,node可以通过编写C/C++扩展的方式更高效地利用CPU,甚至可以通过子进程的方式,将一部分node进程当做常驻服务进程用于计算,然后利用进程间的消息来传递结果。所以,CPU密集不可怕,如何合理调度是诀窍。
生态系统
- W3C: BOM,DOM
- 浏览器: BOM,DOM,ECMAScript
- CommonJS: FS,TCP,Stream,Buffer等等。
- 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)的更多相关文章
- 【读书笔记】《Computer Organization and Design: The Hardware/Software Interface》(1)
笔记前言: <Computer Organization and Design: The Hardware/Software Interface>,中文译名,<计算机组成与设计:硬件 ...
- 算法设计手冊(第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 ...
- [读书笔记]设计原本[The Design of Design]
第1章 设计之命题 1.设计首先诞生于脑海里,再慢慢逐步成形(实现) 2.好的设计具有概念完整性:统一.经济.清晰.优雅.利落.漂亮... 第2章 工程师怎样进行设计思维——理性模型 1.有序模型的有 ...
- 《Unix编程艺术》读书笔记(1)
<Unix编程艺术>读书笔记(1) 这两天開始阅读该书,以下是自己的体会,以及原文的摘录,尽管有些东西还无法全然吃透. 写优雅的代码来提高软件系统的透明性:(P134) Elegance ...
- 【英语魔法俱乐部——读书笔记】 3 高级句型-简化从句&倒装句(Reduced Clauses、Inverted Sentences) 【完结】
[英语魔法俱乐部——读书笔记] 3 高级句型-简化从句&倒装句(Reduced Clauses.Inverted Sentences):(3.1)从属从句简化的通则.(3.2)形容词从句简化. ...
- 【英语魔法俱乐部——读书笔记】 2 中级句型-复句&合句(Complex Sentences、Compound Sentences)
[英语魔法俱乐部——读书笔记] 2 中级句型-复句&合句(Complex Sentences.Compound Sentences):(2.1)名词从句.(2.2)副词从句.(2.3)关系从句 ...
- Computer architecture Computer organization
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCEComputer architectureNINTH EDITION C ...
- 图解TCP/IP读书笔记(一)
图解TCP/IP读书笔记(一) 第一章 网络基础知识 本学期的信安概论课程中有大量的网络知识,其中TCP/IP占了相当大的比重,让我对上学期没有好好学习计算机网络这门课程深感后悔.在老师的推荐下开始阅 ...
- 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)
<Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...
- 《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)
<Linux/Unix系统编程手册>读书笔记 目录 第11章 这章主要讲了关于Linux和UNIX的系统资源的限制. 关于限制都存在一个最小值,这些最小值为<limits.h> ...
随机推荐
- SSH 免密码登陆到多台机器
场景: 需要从主机1.100免密码多了到1.115及1.116 实现: 登陆1.100 $ cd ~/.ssh/ $ ssh-keygen -t rsa 然后三个回车 会有两个文件产生,id_rsa ...
- Isight 命令行运行任务
说明书参考:https://abaqus-docs.mit.edu/2017/English/DSSIMULIA_Established.htm 不一定对版本.但是大部分还可以. 不对的可以在命令里敲 ...
- 从 Basic Paxos 到 Multi Paxos 到 Raft
在朴素Paxos算法中, 各个节点经过 Prepare 和 Accept 阶段, 会达成一个值, 这个值一旦达成, 就不能被修改, 如下例子: 图示1 上面的操作几乎没有任何实用价值, 于是演变成下面 ...
- c语言相关概念
2019-04-06 a文件 库是预编译的目标文件(object files)的集合,它们可被链接进程序.静态库以后缀为‘.a’的特殊的存档文件(archive file)存储. a文件转so文件:h ...
- HTML与盒模型
EC前端 - HTML教程 HTML与盒模型 HTML结构 <!doctype html> <html> <head> <meta charset=" ...
- WCF系列_WCF常用绑定选择
一.五种常用绑定常用绑定的传输协议以及编码格式 名称 传输协议 编码格式 互操作性 BasicHttpBinding HTTP/HTTPS Text,MTOM Yes NetTcpBinding TC ...
- Python之PIL库
Python PIL PIL (Python Image Library) 库是Python 语言的一个第三方库,PIL库支持图像存储.显示和处理,能够处理几乎所有格式的图片. 一.PIL库简介 1. ...
- 分离式lnmp部署
分离式lnmp简介 lnmp和lamp一样,是一种常用的web环境, 在实际环境中,lnmp中的三个服务常常为了更好的性能而分在三台主机上安装. 本篇内只介绍nginx和php-fpm+mysql分离 ...
- csu1804
/* csu 1804 因为define和const总出错,到现在也不明白为什么 不知道define 和 const 出来的 mod 有什么区别 */ #include<iostream> ...
- linux修改用户id,组id
一.修改用户uid usermod -u foo 二.修改用户gid groupmod -g 2005 foo usermod -g 2005 foo 三.检查 cat /etc/passwd su ...