《深入浅出Nodejs》—— 读后总结

这一个月过去了三分之二,加上之前看过这本书三分之一,这才算是看完。 虽然看完一遍,但是这本书内容很深,以后肯定是还要继续翻阅的.....

什么是Nodejs

  Nodejs有几个特性:异步IO,事件驱动,单线程,跨平台

  异步IO可以保证在CPU计算的同时,异步的加载IO,加快了应用的访问。不像传统的服务器是使用什么阻塞IO啊、轮训IO等等,它相当于在发送处理请求时,直接传一个回调函数,当异步的IO结束后,会自动的执行回调。

  事件驱动,则是把粒度降低到事件级别。传统的服务器是一个请求分配一个线程进行处理,这样就会增加多线程通信的复杂性。而事件驱动,则简化了事件模型。

  单线程其实主要是因为Nodejs是基于V8浏览器引擎,因此具有单线程的特点,而且内存很小。这样就引出了Node的劣势——无法利用多核CPU、如果应用出现问题整个系统也会崩溃、CPU繁忙将会影响IO。(因此Node中也提供了child_process模块创建子进程,以此来利用多核;引入了一些集群特性,增加健壮性)。

  最后就是跨平台,Nodejs其实并非全部用javascript编写,只是表面的业务语言以及开放的模块才使用js。底层的大部分的模块还是使用C++构建,因此通过切换系统级别的组件,可以直接切换平台。

异步编程

  使用Nodejs编写全栈应用,肯定会遇到异步编程的场景。由于有回调的特性,因此可能会出现回调嵌入回调的场景,如果嵌套很深,很影响代码的维护和阅读。

  因此异步编程就出现了一些常见的模式:

发布/订阅

这种模式在Nodejs中很常见,像普通的http的on、error或者angular的$watch以及$emit、$broadcast等都是采用这种机制。

Promise/Deferred

最出名的的应该是Kris kawl's Q,后来很多的前端框架都推出了自己的promise模型,比如jquery,dojo,以及angular。这种方式书写出的代码很像传统的单线程顺序执行的代码,阅读起来很方便。

next尾触

这种模式比较有意思,是把一些列的操作放入一个队列。然后按顺序调用,当一个调用结束后,会执行next()方法,继续执行下一个调用。典型的场景就是Node里面的中间件。

内存机制

  Nodejs的内存机制很像JVM,因为开发设计Node内存虚拟机的人,正式开发Hotspot的人——结果就是,Nodejs的回收机制跟JVM极其相似。

  Nodejs的垃圾回收机制可以简单的描述为:

新生代:

  生命周期短的对象,使用复制回收——即把内存分成两块,一块闲置,另一块工作;垃圾回收时,把工作中的存活对象复制到闲置空间中,再交换闲置和工作状态。典型的空间换时间。

老生代:

  生命周期长的对象,使用标记清除、标记整理——即标记那些不再使用的对象,回收的时候回收掉这些标记中的对象;由于这种标记方法会出现内存碎片,因此搭配标记整理,可以整理内存。

代码规范

最后总结一下书中提及的代码规范:

1 缩进,由于tab在不同的编辑器中长度可能不同,因此推荐使用两个空格

2 变量声明,尽量每个对象都带上var,不然会变成全局变量污染全局

3 空格,在操作符或者括号两边加上空格

4 尽量优先使用单引号

5 大括号不推荐换行

6 逗号不要在行首出现

7 尽量每一句结尾都带上分号

8 变量命名:小驼峰,如userName;

  方法命名:小驼峰,getName();

  类命名:大驼峰,NameFilter;

  常量命名:大写字母,USER_COUNT;

  文件命名:下划线分割,user_test.js;

  模块命名:简短单词,express、fs

9 比较操作使用 ===

10 使用{} [] 创建对象和数组

11 尽量避免使用with、eval

12 区分使用对象和数组

学习笔记

Nodejs·内存控制

Nodejs·理解Buffer

Nodejs·网络服务

Nodejs·构建web应用

Nodejs·进程

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员宝库

Java 异常处理的 9 个最佳实践

在 Java 中,异常处理是个很麻烦的事情。初学者觉得它很难理解,甚至是经验丰富的开发者也要花费很长时间决定异常是要处理掉和抛出。 所以很多开发团队约定一些原则...

3509
来自专栏JetpropelledSnake

Linux学习笔记之Redis中5种数据结构的使用场景介绍

原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码。目前目标是吃透 redis 的数据结构。我们都知...

1231
来自专栏CSDN技术头条

知名互联网公司 Java 开发岗面试知识点解析

互联网公司的校园招聘,从形式上说,面试一般分为 2-3 轮技术面试 +1 轮 HR 面试。

1502
来自专栏java一日一条

java提高篇之异常(上)

在这个世界不可能存在完美的东西,不管完美的思维有多么缜密,细心,我们都不可能考虑所有的因素,这就是所谓的智者千虑必有一失。同样的道理,计算机的世界也是不完美的,...

1072
来自专栏java一日一条

Java异常有多慢?

实际上,真正要讨论的问题并不是,“相对‘那些不会发生错误的代码’来说,‘那些以异常形式上报的错误’会有多慢?”,因为你可能也认同“已接受的回答”。相反,真正的问...

3512
来自专栏程序员的知识天地

Python牛B操作:一行代码减少一半内存占用

在项目制作中,我们必须要存储和处理一个相当大的动态列表。测试人员在测试过程中,抱怨内存不足。下面介绍一个简单的方法,通过添加一行代码来解决这个问题。

1522
来自专栏有趣的django

1.python简介

简介 1、python语言介绍 python的创始人:Guido Van Rossum 2、python是一门什么样的语言 编程语言主要从以下几个角度进行分类:...

4055
来自专栏北京马哥教育

编写快速安全Bash脚本的建议

作者:oschina 来源:https://www.oschina.net/translate/bash-scripting-quirks-safety-tip...

2958
来自专栏Golang语言社区

再谈谈获取 goroutine id 的方法

去年年初的时候曾经写过一篇关于如何获取goroutine id的方法: 如何得到goroutine 的 id?, 当时调研了一些一些获取goid的方法。基本的方...

4067
来自专栏安恒网络空间安全讲武堂

Thinkphp5实现安全数据库操作以及部分运行流程分析

文章的灵感来自于此文ThinkPHP3.2.3框架实现安全数据库操作分→https://xz.aliyun.com/t/79

6413

扫码关注云+社区

领取腾讯云代金券