《深入浅出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> ...
随机推荐
- JS判断一个数组中有无重复元素(数字)
前段时间遇到了这个问题 也百度了很多 不过还是用自己的方法解决了 一个超级简单的方法 简单到令人发指 由于直接写文本太丑了 所以还是截图吧 嘻嘻嘻 假如有一个这样的数组 (这是假如 可能每个人的数据 ...
- devexpress总结 accordionControl 加载panelcontrol 的快捷方式
先说保存: UserControl control; private void barButtonItem1_ItemClick(object sender, DevExpress.XtraBars. ...
- CAPTCHA--验证码
验证码开发有两种方法: 1.自己用代码画一个 2.调用ValidateCode.jar工具包 第一种方式: 创建一个动态web工程 编写一个Servlet,在该Servlet内进行如下操作 验证码开发 ...
- github上用golang写的项目
1.moby/moby docker的新马甲 2.kubernetes/kubernetes 分布式容器管理 3.grafana/grafana 一个可视化面板,有漂亮的仪表盘,多种数据来源,适合做系 ...
- WCF系列_WCF常用绑定选择
一.五种常用绑定常用绑定的传输协议以及编码格式 名称 传输协议 编码格式 互操作性 BasicHttpBinding HTTP/HTTPS Text,MTOM Yes NetTcpBinding TC ...
- nginx简介与配置
nginx简介 nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行. nginx由俄罗斯的程序 ...
- Sorl 4.10 入门合集
Sorl4.10 + Tomcat 7.0 win7环境下的安装 1.首先是到apache官网下载sorl 4.10 ,解压 2.进入路径\solr-4.10.4\example\webapps,拷 ...
- flink引出的kafka不同版本的兼容性
参考: 官网协议介绍:http://kafka.apache.org/protocol.html#The_Messages_Fetch kafka协议兼容性 http://www.cnblogs.c ...
- sf-1 算法
算法基础 算法 算法(Algorithm):一个计算过程,解决问题的方法 DNiklaus Wirth:“程序=数据结构+算法” 时间复杂度 时间复杂度:用来评估算法运行效率的一个式子 时间复杂度-小 ...
- gensim自然语言处理
参考代码 ChineseClean_demo1.py: # -*- coding:utf-8 -*- import xlrd import xlwt ''' python3.4 ''' # file ...