简单优雅的JavaScript代码片段(三):合并请求,成批发出

2023-06-05
阅读 6 分钟
1.4k
简单优雅的JavaScript代码片段文章系列:简单优雅的JavaScript代码片段(一):异步控制简单优雅的JavaScript代码片段(二):流控和重试简单优雅的JavaScript代码片段(三):合并请求,成批发出场景说明后端提供的接口具备批量查询能力(比如,同时查询10个资源的详情信息),但是调用者每次只需要请求一个资源的详情...

手写一个Parser - 代码简单而功能强大的Pratt Parsing

2022-02-24
阅读 8 分钟
4.2k
在编译的流程中,一个很重要的步骤是语法分析(又称解析,Parsing)。解析器(Parser)负责将Token流转化为抽象语法树(AST)。这篇文章介绍一种Parser的实现算法:Pratt Parsing,又称Top Down Operator Precedence Parsing,并用TypeScript来实现它。

【代码鉴赏】简单优雅的JavaScript代码片段(二):流控和重试

2021-11-06
阅读 6 分钟
3.5k
后端为了保证系统稳定运行,往往会对调用频率进行限制(比如每人每秒不得超过10次)。为了避免造成资源浪费或者遭受系统惩罚,前端也需要主动限制自己调用API的频率。

数据系统杂谈:React,数据一致性,计算与通信的本质

2021-03-11
阅读 5 分钟
2.6k
揭晓答案:在id变化以后的第一次渲染,useAsync仍会返回上一个id对应的data。这一次渲染产生了两个不一致的数据:新的id和旧的data。

React hooks之痛:低效的变化传播

2020-08-22
阅读 1 分钟
2.4k
不能。React hooks有一个致命的缺陷:数据变化每传播一步就需要等待1轮渲染。如果通过hook来定义计算关系,那么变化的传播会非常低效。

从前端的视角理解数据和缓存

2020-07-13
阅读 4 分钟
3.2k
数据系统是如此的普遍,以至于开发者实际上每天都在设计数据系统,却常常没有意识到它们的普适性,将多个本质相同的问题当作了孤立的问题来理解。应用状态管理、配置管理、用户数据管理问题,本质上都属于数据系统的问题。

【React的作弊模式】理解useReducer的优势和高级用法

2020-06-28
阅读 5 分钟
11.3k
或许你已经知道,“当多个state需要一起更新时,就应该考虑使用useReducer”;或许你也已经听说过,“使用useReducer能够提高应用的性能”。但是篇文章希望帮助你理解:为什么useReducer能提高代码的可读性和性能,以及如何在reducer中读取props的值。

【代码鉴赏】简单优雅的JavaScript代码片段(一):异步控制

2020-06-28
阅读 2 分钟
4.7k
Promise.race不满足需求,因为如果有一个Promise率先reject,结果Promise也会立即reject;Promise.all也不满足需求,因为它会等待所有Promise,并且要求所有Promise都成功resolve。

两种数据消费方式:pull与push,阴与阳

2020-06-15
阅读 3 分钟
7.3k
pull和push,是在软件中消费数据的两种方式,它们描述了数据生产者(或持有者)与数据消费者之间是如何通讯的。过去我们肯定了解过它们,不过可能会在编程中会忽略它们之间的区别与联系,本篇文章希望帮助大家理解这两者的区别于联系,从而在编程中有意识地分辨与选择它们。

JavaScript的WeakMap:向【不属于你的对象】添加【私有数据】

2020-06-14
阅读 2 分钟
2.4k
例子1:dom对象,是由浏览器创建的,并且它会被你无法掌控的代码使用(比如大部分页面的dom由React框架管理,又或者当前页面同时运行了别人编写的JavaScript),那么你就不是这个对象的拥有者,应该避免往上面添加属性。

【React性能优化总结】React组件什么时候重新渲染?如何做性能优化?

2020-04-18
阅读 2 分钟
5.8k
过渡期完成以后,函数式组件成为正统的React的开发模型,"component"就用来指代function component,而classes会使用“legacy class components”的方式来指代。未来不会出现“必须使用class组件才能实现”的React行为。

【JavaScript函数式编程】自己实现惰性数据流、数据流操作符

2020-03-25
阅读 13 分钟
5.1k
在JavaScript的世界中,ES6的iterable和generator的背后的思想其实就是惰性数据流。对比现在人们对这个思想的诠释(迭代器模式)和40年前的诠释,感觉非常奇妙,加深了我对iterable和generator的理解。

React hooks,组合与抽象,状态管理

2020-03-18
阅读 6 分钟
4.1k
用户可以定义一个状态仓储来容纳被共享的状态。状态仓储可以是一个全局对象,或者是一系列依附于组件树的对象。一般都会形成一个树状的数据结构,同构于应用的功能树。

在React项目中优雅地使用Typescript

2019-09-29
阅读 5 分钟
23.5k
「优雅」的含义: 减少编写冗余的类型定义、类型标注,充分利用ts的自动类型推断,以及外部提供的类型声明。 类型安全:提供足够的类型信息来避免运行时错误,让错误暴露在开发期。这些类型信息同时能够提供代码补全、跳转到定义等功能。 组件定义 函数组件 {代码...} FC是FunctionComponent的缩写。 IProps无需声明chil...

Algebraic Effects,以及它在React中的应用

2019-08-18
阅读 6 分钟
6.9k
Algebraic Effects是一个在编程语言研究领域新兴的机制,虽然目前还没有工业语言实现它,但是在React社区会经常听到关于它的讨论。React最近新特性(Suspense和hooks)的背后实际上是Algebraic Effects的概念。因此,我花了一些时间来了解Algebraic Effects,希望体悟到React团队是如何理解这些新特性的。

React Fiber架构如何从JS引擎手中“夺回”调度权

2019-08-18
阅读 4 分钟
5k
time slicing将渲染工作切分,保证JavaScript的执行不会造成卡顿:如果当前帧的时间片已经用完,React就将控制权交还给浏览器,剩下的工作等到下一帧再做

浏览器的标签页会话机制,以及前进/后退缓存

2018-11-05
阅读 3 分钟
3.4k
客户端与服务端之间的会话是指:为了完成某个目标,客户端与服务端进行的一系列通讯(请求/响应对)。在这种会话中,服务端需要通过某种机制来识别出当前的请求属于哪一个会话(比如cookie)。

【js细节剖析】通过"="操作符为对象添加新属性时,结果会受到原型链上的同名属性影响

2018-10-31
阅读 5 分钟
4.4k
在使用JavaScript的过程中,通过"="操作符为对象添加新属性是很常见的操作:obj.newProp = 'value';。但是,这个操作的结果实际上会受到原型链上的同名属性影响。接下来我们分类讨论。

【响应式布局】initial containing block、viewport以及相关尺寸

2018-09-18
阅读 11 分钟
4.5k
前言 本篇文章修改、整理自我以前写的一篇文章。 在阅读这篇文章之前,你需要了解设备像素、逻辑像素(设备独立像素)和CSS像素的区别,见我的前一篇文章理解设备像素、设备独立像素和css像素。 在经典文章A tale of two viewports中,作者定义了两种视口: layout viewport 包含了页面中的所有内容,浏览器已经计算好了...

防抖和节流的实现

2018-09-06
阅读 5 分钟
2.5k
如果距离上次debounced调用已经过去了waitTime的时间,则说明该轮连续调用已经结束(进入稳定状态)。这个时间点也被称为trailing edge。

JavaScript类型转换原理

2018-09-04
阅读 6 分钟
3.3k
本文修改自本人以前写的文章。 从类型说起 js只有7种类型: 原始类型(primitives types) boolean number 包括Infinity和NaN,你可以通过typeof Infinity;来验证 string null undefined Symbol (ECMAScript 6 新定义,暂时用不上,这篇文章不讨论) Object 类型 js内置了很多对象供你使用,MDN文档列举了所有ES标准定义...

【组件复用性】原型的可扩展性与可增强性

2018-08-17
阅读 1 分钟
3.7k
工具组件,本质上来说,是将那些经常重复的代码封装起来,提供一个组件原型,以便复用。高可复用性的一个决定性因素,就是组件不能“写死”,留有配置余地,最终组件的行为应该接受使用者的配置。

【Vue技巧】利用Proxy自动添加响应式属性

2018-08-16
阅读 7 分钟
4.2k
初始化Vue实例时,Vue将递归遍历data对象,通过Object.defineProperty将其中已有的属性转化为响应式的属性(getter/setter)。响应式属性的变化才能够被Vue观察到。这就是为什么,Vue文档建议我们在初始化Vue实例之前,提前初始化data中所有可能用到的属性。如果想要在Vue实例创建以后添加响应式属性,需要使用Vue.set(o...

最优质的学习资源 收录整理

2018-08-06
阅读 1 分钟
5.7k
作为开发者,我们主要通过网络和书籍来学习。在学习的过程中,我发现有一些优质的学习资料是经常用到、经常被人推荐的。这些优质的学习资料繁多而零散,而且还在不断地被挖掘。因此我决定用GitHub来收集和整理最优质的计算机学习资源!本收集目前主要关注前端开发、计算机基础、机器学习的内容。收录的依据主要是:在领...

【算法剖析】Virtual DOM

2018-07-30
阅读 5 分钟
3k
Virtual dom相当于框架API与运行环境之间的中间层,将框架渲染与DOM API进行解耦,增加了跨平台能力。(可以将virtual dom映射为DOM的步骤,改为映射到其他的执行环境,比如安卓、IOS)

详解REST架构风格

2018-05-08
阅读 11 分钟
8.3k
作为Web开发者,你可能或多或少了解一些REST的知识,甚至已经非常习惯于它,以至于在正式地学习REST的时候,你可能心里会想:“本来就是这样做的啊,不然还能怎么做呢?”确实是这样,REST已经成为Web世界的一种内在架构原则。这主要是因为REST的产生确实与HTTP有着密不可分的联系。REST的提出者Roy Fielding在Web界是一位...

【响应式布局】理解设备像素、设备独立像素和css像素

2017-10-27
阅读 6 分钟
6k
设备像素指的是显示器上的真实像素,每个像素的大小是屏幕固有的属性,屏幕出厂以后就不会改变了。设备分辨率描述的就是这个显示器的宽和高分别是多少个设备像素。设备像素和设备分辨率交给操作系统来管理,浏览器不知道、也不需要知道设备分辨率的大小,浏览器只需要知道逻辑分辨率就可以了。