自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 收藏
  • 关注

原创 深入浅出Node.js读书笔记:Buffer的拼接(6.3)

Buffer在使用中,通常是以一段一段的传输,以下为输入流中读取内容的代码: var fs = require('fs'); var rs = fs.createReadStream('test.md'); var data = ''; rs.on("data", function (chunk){ data += chunk; }); rs.on("end", function () { console.log(data); });上述代码是读取流的示范代码,对初

2020-08-30 22:29:28 720

原创 深入浅出Node.js读书笔记:Buffer的转换(6.2)

Buffer对象可以与字符串之间相互转换。目前支持的字符串编码类型如下:1.ASCII2.UTF-83.UTF-16LE/UCS-24.Base645.Binary6.Hex6.2.1 字符串转Buffer字符串转Buffer通过构造函数完成,如new Buffer(str,[encoding]),Encoding不传时,默认用UTF-8编码。另外Buffer里可以同时支持多个编码类型进行转换,所以在使用时需要额外注意。6.2.2 Buffer转字符串实现Buffer向字符串的转换可以通

2020-08-27 21:11:37 574

原创 深入浅出Node.js读书笔记:Buffer结构(6.1)

Buffer跟Array很像,它主要用来操作字节。下面从模块结构和对象结构的层面上来认识。6.1.1 模块结构Buffer是一个典型的Javascript和c++结合的模块,它将性能相关部分用c++实现,将非性能部分用Javascript实现。之前文章提到,Buffe所占用的内存并不是由V8分配,属于堆外内存。由于V8垃圾回收性能的影响,将常用的操作对象用更高效的内存分配回收策略来管理是个不错的思路。6.1.2 Buffer对象Buffer对象类似于数组,它的元素为16进制的两位数,即0到255的

2020-08-09 16:34:56 203

原创 深入浅出Node.js读书笔记:内存泄漏排查(5.5)

现在已经有许多工具用于定位Node应用的内存泄漏,下面是一些常见的工具。1.v8-profile,可以用于对V8堆内存抓取快照和对CPU进行分析,目前项目很久没有人维护。2.node-heapdump。它允许对V8堆内存抓取快照,用于事后分析。3.node-mtrace。 它使用GCC的mtrace工具来分析堆的使用。4.dtrace。5.node-memwatch。这里只介绍通过node-heapdump和node-memwatch两种。5.5.1 node-heapdump想了解node

2020-08-07 23:37:56 362

原创 深入浅出Node.js读书笔记:内存泄漏(5.4)

在V8的垃圾回收机制下,一般的代码很少会有内存泄漏的问题。但内存泄漏一般无意间出现,而且一旦出现,很难排查。通常出现内存泄漏的原因有如下几点:1.缓存。2.队列消费不及时。5.4.1 慎将内存当作缓存缓存可以有效节省资源。它的访问效率要比I/O效率高,一旦命中缓存,就可以节省一次I/O时间。但在Node中,对象一旦缓存,就意味着该对象更长的生命周期,并且垃圾回收器会对这些对象进行无用的扫描。另一个问题,一般的缓存对象会有一定的生命周期和缓存大小的限制。当对象容量超出缓存大小时,会基于一些策略淘

2020-08-07 23:03:31 148

原创 深入浅出Node.js读书笔记:内存指标(5.3)

一般来说,应用中存在一些全局的对象是很正常,正常使用,变量都会自动释放回收,但一些我们认为会回收,但是并没有回收的对象,未被回收的对象会导致内存占用无限增长。一旦达到V8的内存限,将会得到内存溢出错误,进而导致进程退出。5.3.1 查看内存使用情况1)查看进程内存占用调用process.memoryUsage()可以看到Node进程内存占用情况。示例代码如下:$ node > process.memoryUsage() { rss: 13852672, heapTotal: 6

2020-07-17 20:07:29 280

原创 深入浅出Node.js读书笔记:高效使用内存(5.2)

本节谈论如何让垃圾回收机制更高效地工作。5.2.1 作用域在Javascript中能形成作用域的有函数调用,全局作用域。举个例子: var foo = function () { var local = {}; }; foo函数在执行过程中,local会被分配在新生代空间,在函数执行完,它会在下次垃圾回收时立即释放。1)标识符的查找标识符就是变量名,Javascript在查找标识符时,它会先查找当前作用域里的变量,如果查找不到就向上级作用域查找,直到查到为止。2)作用域链

2020-07-17 11:51:51 117

原创 深入浅出Node.js读书笔记:V8的垃圾回收机制与内存限制(5.1)

Javascript和Java一样,都是通过垃圾回收机制自动对内存进行管理,不像c/c++程序员那样在代码编写时还要考虑内存的分配与释放问题。Node极大地拓宽了Javascript的应用场景,主流场景从客户端延伸到服务器端之后,对于性能敏感的服务端程序,内存管理的好坏,垃圾回收的状况是否优良,都会对服务构成影响。在Node中,这一切都与Javascript执行引擎V8息息相关。5.1.1 Node与V8Node是一个构建在Chrome的Javascript运行时上的平台。Node的创始人选择V8作为

2020-07-12 20:11:09 276

原创 深入浅出Node.js读书笔记:异步并发控制(4.4)

之前介绍的各种异步编程方法主要解决异步性能问题,提升编程体验。在Node中,我们可以利用异步发起并行调用,代码如下: for (var i = 0, i < 100; i++) { async(); } 但是如果并发量过大,下层服务器将会吃不消。对文件系统进行大量并发调用,操作系统的文件描述符数量将被瞬间用光。可以看出异步I/O与同步I/O的显著差异:同步I/O因为每个I/O都是彼此阻塞的,在循环体中,总是一个接着一个调用,不会出现耗用文件描述符太多的情况,同时性能也比较低。

2020-07-11 12:56:47 399 1

原创 深入浅出Node.js读书笔记:异步编程解决方案(4.3)

之前的文章提到,异步编程带来的各种问题。本节将通过提供三种解决方案来解决这些问题。解决方案有如下3种。1.事件发布/订阅模式。2.Promise/Deferred模式。3.流程控制库。4.3.1 事件发布/订阅模式事件监听器模式是一种广泛用于异步编程的模式,是回调函数的事件化,又称发布/订阅模式。Node自身提供的events模块是发布/订阅模式的一个简单实现。它具有addListener/on(),once(),removeListener(),removeAllListeners()和em

2020-07-11 12:08:22 215

原创 深入浅出Node.js读书笔记:异步编程的优势与难点(4.2)

由于编程人员阅读思维习惯,同步I/O盛行了很多年,但同步问题会引起性能问题,于是我们开始使用多线程来解决性能问题。但多线程存在CPU浪费的情况,比如线程之间切换,线程与线程之间锁,同步问题等等,会使CPU存在浪费情况。下面来看看异步编程的优势与难点。4.2.1 异步编程的优势Node带来最大特性莫过于基于事件驱动的非阻塞I/O模型。非阻塞I/O可以使CPU与I/O并不互相依赖等待,让资源得到更好的利用。由于事件循环模型需要对应海量请求,所有请求会作用于单线程上,需要防止任何一个计算耗费过多的CPU

2020-06-21 22:00:49 278

原创 深入浅出Node.js读书笔记:Node.js的函数式编程(4.1)

在Javascript中,函数是一等公民,使用上非常自由,无论调用它,或者作为参数,或者作为返回值均可。4.1.1 高阶函数高阶函数可以把函数当作参数,或是将函数作为返回值的函数,如下代码:function foo(x){ return function(){ return x; };}高阶函数比普通函数更灵活,如下代码:function foo(x,bar){ return bar(x);}对于相同的foo()函数,传入的bar参数不同,则可以得到不同的结果。另外举一个例子

2020-06-15 20:08:25 236

原创 深入浅出Node.js读书笔记:非I/O的异步API(3.4)

尽管在介绍Node的时候,多数情况下都会提到异步I/O,但Node中还存在一些与I/O无关的API,比如setTimeout, setInterval, setImmediate, process.nextTick等。3.4.1 定时器setTimeout与setInterval的实现原理类似,只是不需要I/O线程池的参与。调用setTimeout或setInterval的时候,会将一个定时器插入到观察者内部的一个红黑树中。每次Tick执行过程中,会从红黑树中取出定时器对象,检查是否超时,如果超时,就

2020-06-15 14:16:07 119

原创 深入浅出Node.js读书笔记:Node.js的异步I/O(3.3)

本节介绍Node是如何实现异步I/O的,除了讨论I/O模型外,还将讨论Node的执行模型。完成整个异步I/O环节的有事件循环,观察者和请求对象等。3.3.1 事件循环先来看下Node自身的执行模型—事件循环。在Node启动时,它会创建一个类似于while的循环,执行一次的过程称为Tick,每个Tick执行过程就是查看是否有事件要处理,如果有,就取出然后执行,执行后,如果有关联函数,就执行它们。3.3.2 观察者在每个Tick过程中,如何判断有新的事件需要处理呢?这里引入观察者概念。每个事件循环都有

2020-06-15 13:28:51 135

原创 深入浅出Node.js读书笔记:Node.js的异步I/O实现现状(3.2)

3.2.1 异步I/O与非阻塞I/O在听到Node介绍时,经常能听到异步,非阻塞,回调,事件等词,其中异步和非阻塞并不是一回事。操作系统内核对于I/O只有两种方式:阻塞与非阻塞阻塞I/O一个特点是调用之后一定要等到系统内核层面完成所有操作后,调用才结束。阻塞造成CPU等待,浪费等待时间,CPU的处理能力得不到充分利用。为了提高性能,内核提供了非阻塞I/O。非阻塞I/O调用完会立即返回。但非阻塞也存在一些问题。由于完整的I/O并没有完成,立即返回的并不是业务层期望的数据,而仅仅是当前调用的状态。为了获

2020-06-14 15:28:29 135

原创 深入浅出Node.js读书笔记:Node.js为什么要异步I/O(3.1)

关于异步I/O为何在Node里如此重要,这与Node面向网络设计不无关系。在当前网络环境下,并发已是编程中的标配。具体可以从如下两那个方面说起。3.1.1 用户体验早期浏览器中Javascript是单线程执行,并且与UI渲染共用一个线程,这意味着Javascript执行时,UI渲染和响应都处于停滞状态。在B/S模型中,网络限速也会给网页的实时体验造成很大麻烦。如果网页需要获取一个网络资源,通过同步的方式获取,那么Javascript就需要等待资源从服务器端获取后才能继续执行,这期间UI将停顿,不响应交

2020-06-14 14:49:28 191

原创 深入浅出Node.js读书笔记:Node.js的前后端共用模块(2.7)

Javascript在Node出现之后,比别的编程语言多了一项优势,就是一些模块可以在前后端共用,这是因为很多API在各个宿主环境下都提供。2.7.1 模块的侧重点前后端Javascript分别搁置在Http的两端,它们扮演的角色并不同。客户端而言,它是从同一个服务器端分发到多个客户端执行。而服务器端相同的代码需要多次执行,前者的瓶颈是带宽,后者的瓶颈则在于CPU和内存资源等。鉴于网络原因, CommonJS为后端制定的规范并不适合前端的应用场景。经过一段时间后,AMD(Asynchronous Mo

2020-06-08 20:06:29 303

原创 深入浅出Node.js读书笔记:Node.js的包和NPM(2.6)

Node模块与模块之间无法直接引用,但可以通过引进包和NPM,从而实现模块引用另一个模块的机制。Javascript不像其他语言,如Java,c++一样,有包和命名空间的概念。但这里要感谢CommonJs包规范,该规范在一定程度上解决了变量依赖,依赖关系等代码组织性问题。CommonJs规范十分简单,它由包结构和包描述文件两个部分组成,前者用于组织包中的各种文件,后者则用于描述包的相关信息。2.6.1 包结构包实际是一个存档文件,以.zip或tar.gz格式的文件,解压后是个目录,该目录包含如下文

2020-06-08 12:22:44 197

原创 深入浅出Node.js读书笔记:Node.js的模块调用栈(2.5)

结束文件模块,核心模块,内建模块,c/c++扩展模块等,有必要明确各个模块之间的调用关系。c/c++内建模块属于最底层的模块,它属于核心模块,主要提供API给Javascript核心模块和第三方Javascript文件模块调用。Javascript核心模块主要扮演两类职责:1.c/c++内建模块的封装层和桥接层,供文件模块调用。2.纯粹的功能模块,不需要底层打交道。文件模块通常由第三方编写,包括普通Javascript模块和c/c++扩展模块,主要调用方向为普通Javascript模块调用扩展模块

2020-06-08 12:13:14 237

原创 深入浅出Node.js读书笔记:Node.js的c/c++扩展模块(2.4)

对于前端开发工程师来说,c/c++有些生疏或晦涩,但如果能够掌握,当模块出现性能瓶颈时,将对你有极大帮助。Javascript的一个典型弱点是位运算。它的实现是参考Java的位运算实现,Java的位运算是通过Int类型进行比较,而Javascript只有double类型的数据,它需要先把double类型转换成int类型才能进行位运算比较。所以在Javascript层面进行位运算效率不高。在应用中,会频繁出现位运算操作,例如编码,转码等逻辑,如果通过javascript实现,会耗费大量cpu。如果通过编写

2020-06-01 19:35:14 268

原创 深入浅出Node.js读书笔记:Node.js的核心模块(2.3)

之前提到,Node.js的核心模块会在编译Node的时候以二进制的方式被编译进来。核心模块分为c/c++和Javascript两部分。c/c++存在Node的src目录下,Javascript存在lib目录下。2.3.1 Javascript核心模块编译过程Node采用了V8附带的js2c.py工具 ,将内置的Javascript代码(src/node.js和lib/*.js)转换成c++数组,生成node_natives.h文件,在这个过程中Javascript代码以字符串的形式存储在Node命名空间

2020-05-30 12:01:29 290

原创 深入浅出Node.js读书笔记:Node.js的模块实现(2.2)

2.2 Node模块的实现Node并不是完全按照规范实现,而是进行了一定的取舍,并同时增加了少许自身需要的特性。Node引入模块时,需要经历如下几个步骤:1.路径分析。2.文件定位。3.编译执行。Node中提供的模块分为两类,一类是node自身提供称为核心模块;另一类是用户自定义称为文件模块。Node的核心模块,在编译源码时,就已经编译进二进制可执行文件。在Node启动时,核心模块会加载到内存,这部分模块引入时,文件定位和编译执行这两步会省略,并在路径分析中优先判断,所以它的加载速度很快。文

2020-05-27 20:57:06 384

原创 深入浅出Node.js读书笔记:Node.js的CommonJS规范(2.1)

2.1 CommonJS规范的出发点在Javascript的发展历程中,它主要应用在浏览器前端。早期官方(ECMAscript)规范的时间比较早,规范覆盖的范围比较窄,只是规范了一些基本的语法。随着web的发展,各个组织包括w3c在内,推动HTML5规范发展,同时各大厂商对规范的大力支持。浏览器出现了更多的标准API,这些都发生在前端,后端Javascript的规范却远远落后。对于Javascript自身而言,存在以下缺陷:*.没有模块系统。*.标准库较少。*.没有标准的接口。*.缺乏包管理系统

2020-05-27 13:45:31 165

原创 深入浅出Node.js读书笔记:Node.js简介(1)

1.1 使用Node.js能解决什么样的问题先看下现在服务器语言存在什么样的问题,比如Java,Php或ASP.Net等服务端语言,会为每一个客户端连接创建一个线程,而每一个线程需要耗费大约2M的内存。也就是说,理论上,具有8G内存的服务器可以同时连接的最大用户数是4000左右。而要让web应用程序服务更多的用户数,就要增加服务器的数量,而web应用程序的硬件成本也就随之而来。在技术层面也会存在一些问题,比如说,由于同一个用户的不同客户端请求会被不同的服务器处理,因此在不同的服务器之间要共享所有的资源

2020-05-26 13:03:34 191

原创 ReactNative源码分析之ReactRootView

当前分析的ReactNative版本为0.61.5:首先来看ReactRootView的定义:/** * Default root view for catalyst apps. Provides the ability to listen for size changes so that a UI * manager can re-layout its elements. It dele...

2020-04-30 17:04:55 676

原创 ReactNative源码分析之CatalystInstance

当前分析的ReactNative版本为0.61.5:首先我们来看CatalystInstance的定义,它其实是个接口,实现类为CatalystInstanceImpl。该接口提供了Java层与JS层交互的通道。那么该接口有哪些功能呢?1.提供JSBundle的url;2.JS层和Java层通信接口(invokeCallback和callFunction);3.管理所有的JavaScri...

2020-04-28 15:46:49 852

原创 ReactNative源码分析之ViewManager

当前分析的ReactNative版本为0.61.5:一、ViewManager定义首先我们来看ViewManager的定义:/** * Class responsible for knowing how to create and update catalyst Views of a given type. It is also * responsible for creating an...

2020-04-27 21:01:15 786

原创 ReactNative源码分析之Promise分析

当前分析的ReactNative版本为0.61.5:ReactNative源码分析之NativeModule调用堆栈分析.这篇文章分析的最后,涉及到Callback分析。NativeModule提供的方法,如果想把方法返回的结果传回给JS层,那么实现有两种方式,一种是通过Callback,一种是Promise,Callback已经在该文章中分析,现在分析Promise的实现。先看下buil...

2020-04-25 16:34:52 215

原创 ReactNative源码分析之NativeModule调用堆栈分析

当前分析的ReactNative版本为0.61.5:一、NativeModule基本使用我们知道,要想访问原生提供的功能,需要通过继承NativeModule,并提供相关的方法,只有这样JS层才能直接访问。举个例子,StatusBarModule类:/** {@link NativeModule} that allows changing the appearance of the sta...

2020-04-25 16:12:00 644

原创 ReactNative源码分析之NativeViewHierarchyManager

当前分析的ReactNative版本为0.61.5:看这边文章前最好先了解UIManagerModule、UIImplementation、UIViewOperationQueue类;1.ReactNative源码分析之UIManagerModule.2.ReactNative源码分析之UIViewOperationQueue.3.ReactNative源码分析之UIImplementat...

2020-04-16 17:55:13 732 1

原创 ReactNative源码分析之UIViewOperationQueue

当前分析的ReactNative版本为0.61.5:看这边文章之前最好先了解UIManagerModule和UIImplementation:1.ReactNative源码分析之UIManagerModule.2.ReactNative源码分析之UIImplementation.从UIViewOperationQueue名称可知,首先该类是一个操作UIView为主,同时具有缓存功能的这样一...

2020-04-16 12:14:28 456

原创 ReactNative源码分析之UIImplementation

今天使用的ReactNative版本为0.61.5:之前我们讲过UIManagerModule,可参考:ReactNative源码分析之UIManagerModule.我们提到,UIManagerModule本身是个NativeModule,它通过各种ReactMethod注解方法,提供JS直接调用,大多数方法直接由UIImplementation代理。我们看下UIImplementati...

2020-04-10 17:31:59 359

原创 ReactNative源码分析之UIManagerModule

当前分析的ReactNative版本为0.61.5:今天的主角是UIManagerModule,我们看它的定义,本质上是个NativeModule,可以通过ReactContext访问。先来看看它的私有变量mViewManagerRegistry,该类负责管理ViewManagerName和ViewManager关系,可以通过ViewManagerName查找对应的ViewManager。代...

2020-04-09 18:05:06 1313

原创 ReactNative源码分析之ReactActivity启动流程

讲解ReactActivity之前,需要理清如下三个类之间的关系:1.ReactActivity;2.ReactActivityDelegate;3.ReactDelegate;通过源码我们看到,ReactAcitivy -> ReactActivityDelegate -> ReactDelegate,三者之间是包含与被包含关系;ReactActivity相关的行为都由Re...

2020-04-07 12:21:49 1048

原创 ReactNative源码分析之ReactContext创建流程

当前分析的ReactNative版本为:0.61.5:ReactNative中最核心的当属ReactContext,想访问ReactNative框架相关类,第一个需要的就是ReactContext。原生层定义NativeModule, 我们往往直接继承ReactContextBaseJavaModule,而该类构造函数传入的参数就是ReactApplicationContext,再来看看它的定...

2020-04-06 23:06:05 1115

原创 ReactNative源码分析之JavaScriptModule

当前分析的ReactNative版本为0.61.5:ReactNative中为了能访问原生功能模块,它提供了NativeModule接口,看下该接口的定义,实现比较简单,直接继承它的两个类分别是BaseJavaModule和CxxModuleWrapperBase。从名字能推断,一个是直接通过原生层实现提供Native功能。另一个是通过c++实现。目前ReactNative仅仅提供了原生层的...

2020-04-05 23:16:39 1025

原创 关于团队管理的思考

带团队有一段时间,今天静下心,记录些关于团队管理的一些思考,从如下几个纬度来讲讲;一、团队任务和战斗力 首先,任何团队都属于某个业务线,各个业务线每年都有各自的年度目标,针对业务线的年度目标,各个团队要进行ork拆分,划分到每个月,根据每月的任务,团队管理者,要思考如何完成。 此时就需要考虑各个团队的整体实力,是否要进行招聘,如何培养团队,业务代码架构是否满足年度任务...

2020-04-04 23:01:02 574

原创 ReactNative源码分析之UI事件分发

ReactNative用的版本: 0.61.5原生层事件的触发入口主要有两个类:1. ReactRootView2. 自定义的ViewManager对应的viewGroup 今天我们主要梳理ReactRootView事件传递一、ReactRootViewJavaScript中加载的View最终会依附在ReactRootView上,而该类正是Activity创建后,加载的Cont...

2020-04-04 13:51:55 1085

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除