自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

黄腾霄的博客

可以同时关注主站,http://xinyuehtx.github.io/

  • 博客(145)
  • 收藏
  • 关注

原创 关于taro2.x版本useEffect中改变observable对象导致的Effect执行2次问题

今天和大家聊一聊taro2.x版本useEffect中改变observable对象导致的Effect执行2次问题问题现象话不多说,先看代码。代码很简单,Taro+mobx在函数组件内使用,并且在useEffect中更新test的状态。注意此时useEffect传入了空数组import Taro, { useEffect } from '@tarojs/taro';import { View } from '@tarojs/components';import { observer } from

2020-07-15 16:27:43 3978

原创 微信小程序在ios中下拉出现“橡皮筋”效果

今天和大家聊一聊微信小程序在ios中下拉出现“橡皮筋”效果问题现象话不多说,先看代码(使用taro编写)。代码很简单,一个flex的容器+一个允许进行下拉刷新的ScrollView,就组成了一个最简democonst TicketRecordsPage = () => { const revenueData = new Array(10).fill(0).map((_, i) => i) return ( <View className={styles['root

2020-07-14 17:47:26 3434 1

原创 关于taro在微信小程序下函数组件多次执行问题

今天和大家聊一聊taro在微信小程序下函数组件多次执行问题关于taro和小程序首先taro是一个针对多端小程序的编译框架。对于微信小程序来说,taro的源码最终会编译成微信小程序可执行的代码。因此对于使用taro进行开发来说,既会受到小程序的约束,又能利用小程序的优势小程序初始数据对于小程序来说,可以通过data进行数据绑定,为页面模板提供初始数据。这种方式能够更有效的提升初始渲染的效率。但是对于react来说,组件的初始状态来自于组件的构造函数中的初始state或者函数组件的usest

2020-07-14 11:37:06 1510

原创 从0开始实现redux中间件机制

今天和大家聊一聊redux的中间件原理。注:本文内容大部分参考redux的官网文档Middleware - Redux。如果英文好的同学可以直接阅读官网文档,写的非常好。关于redux-middlewareredux中间件提供了一个切面的关注点。我们可以很方便的利用中间件进行AOP编程,比如日志功能,埋点上报等。这里主要是利用装饰器模式,在实际任务执行之前,动态添加before和after的逻辑。这样就能形成一个洋葱模型接下来我们就看下如何手动开写一个日志中间件手动处理日志首先我们手动

2020-06-17 18:52:29 238

原创 如何设计一个远程桌面程序

今天和大家聊一聊如何实现一个远程桌面程序。关于远程桌面对于远程桌面程序,相信大家一定有所了解。常见的产品有TeamViewer,向日葵,微软远程桌面,QQ远程桌面等等。远程桌面能够在定位用户问题,协助操作,远程办公上有非常便捷作用。这里我们就来自己实现一个远程桌面程序。需求分析对于一个远程桌面程序,我们要解决的问题主要有三点:获取桌面流——没有桌面流,怎么做远程桌面传输数据——包括桌面流以及键盘鼠标等信息传输控制信息——建立连接,断开连接等这里需要注意的点是第二点传输数据。远

2020-06-16 14:30:09 3875

原创 如何在JavaScript中调用C++动态链接库

今天和大家聊一聊如何在JavaScript中调用C++动态链接库什么是ffiffi 是Foreign Function Interface的简称,是一款nodejs的addon。可以让大家在nodejs中调用c风格的c++动态链接库ffi调用起来非常简单,可以看下官网的这个例子var ffi = require('ffi-napi');var libm = ffi.Library('libm', { 'ceil': [ 'double', [ 'double' ] ]});libm.

2020-06-14 11:14:08 7007 1

原创 关于taro使用React.Fragment语法的问题

今天和大家聊一聊taro使用React.Fragment出现的问题。什么是React.Fragment在react组件中,只能返回单一的元素,不能返回一个元素列表。//报错render() { return ( <ChildA /> <ChildB /> <ChildC /> );}//正常render() { return ( <div> <ChildA />

2020-06-11 18:12:19 1119

原创 理解NAT穿越

今天和大家聊一聊NAT穿越什么是NATNAT(Network Address Translation),即网络地址转换,是一种ip数据包的重写技术。为什么要要有NAT呢?这是因为现实中公网的ip地址过少,很多单位,学校都不能满足每个主机分配一个公网地址。因此会通过NAT技术将内网的主机地址映射为同一个公网地址的不同端口,进行外网访问。NAT的缺点NAT解决了内网环境下多主机上网的问题,但是也造成了难以从外网访问内网主机的问题。尤其是在一些p2p应用的场景下(比如现在越来越火的webrtc

2020-06-11 17:22:20 2487 2

原创 node版本管理工具NVM-windows介绍及原理

今天和大家聊一聊node在windows下的版本管理工具NVM-windows为什么需要node版本管理主要原因有两个:开发时保证项目以及依赖库(尤其是原生的addon)API兼容。调试特定node版本下的软件问题。推荐的node版本管理工具如果是在mac/linux下,可以使用nvm-sh/nvm如果是在windows下,可以使用我们今天要讲的coreybutler/nvm-windows使用方法卸载你电脑上的node以及npm在Releases · coreybut

2020-06-10 09:18:42 820

原创 关于实时协同编辑的架构思考

今天和大家聊一聊协同编辑的架构设计。什么是协同编辑协同编辑是指多人同时对同一份文档进行编辑。例如我们熟悉的wiki,百度百科,以及办公产品腾讯文档,乃至我们的代码管理工具git,都可以算作是协同编辑产品。实时协同编辑随着大家在家办公,异地办公的情况普及,实时协同编辑工具也变得更加引人注目。实施协同编辑会面临几个问题:实时性——输入的数据可以及时被相关协作者看到一致性——各端看到和编辑的文档需要保持一致容错性——允许存在一定的网络波动,和数据丢失但是这三个问题会形成一个不可能三角即

2020-06-09 19:45:02 1122

原创 理解node中的stream的背压机制

今天和大家聊一聊node中的stream的背压机制。为什么要有流在编写服务时,经常会需要涉及到文件或者数据压缩的问题。使用合适的压缩算法能够有效减少请求文件的大小,从而减少网络中的数据传输量,提升响应速度。假设我们采用最普通的方式处理一个文件的获取,压缩,发送这个过程,就会是如下所示的图形表示:我们看到整个执行流程是串行的,所有耗时都会累加,导致整个过程耗时很长。流的出现就是为了解决这个串行处理的问题。如下图所示,我们将整个文件分成一个个小块,利用生产者消费者模式,上一个阶段的操作有一小部

2020-06-08 19:45:46 346

原创 如何编译electron依赖的c++模块

今天在写electron的项目时,需要使用到robotjs。而robotjs是c++编写的库,所以需要在不同的平台进行重新编译。期间遇到了许多问题,mark一下。问题来源所有代码最终是要转换为操作系统相关代码,才能在指定的OS上运行。像java,python这类代码是需要对应平台的vm环境,转成平台相关代码才能够执行。而c++并没有这样的vm环境,因此对于node的c++模块,需要先编译成平台相关的代码,才能执行。方案这里我采用的方式是node-gyp进行编译整体方案如下所示,利用nod

2020-06-06 01:07:21 2419

原创 如何指定create-react-app默认启动的浏览器

今天和大家聊一聊create-react-app设置默认启动浏览器的方式。问题来源对于create-react-app默认会在npm start执行之后在默认浏览器打开页面。但是,有的时候,我们期望能够设置特定的浏览器启动。或者是在开发诸如electron之类的应用时,不期望启动浏览器。解决方案在npm脚本中,我们可以使用create-react-app提供的配置参数BROWSER指定启动的浏览器。比如如果你期望指定浏览器为chrome,就可以写"start": "BROWSER=chro

2020-06-05 16:05:03 4306 4

原创 理解webpack的hash,contenthash,chunkhash

今天和大家聊一聊webpack中不同hash值的作用。问题来源对于浏览器来说,一方面期望每次请求页面资源时,获得的都是最新的资源;一方面期望在资源没有发生变化时,能够复用缓存对象。这个时候,使用文件名+文件哈希值的方式,就可以实现只要通过文件名,就可以区分资源是否有更新。而webpack就内置了hash计算方法,对生成文件的可以在输出文件中添加hash字段。区分hash,contenthash,chunkhashwebpack内置的hash有三种:hash:每次构建会生成一个hash。和整

2020-06-01 19:06:20 612

原创 理解React如何实现批量状态更新

今天和大家聊一聊React如何实现批量状态更新。引子我们知道React的setState方法并不是同步执行的。在React的生命周期中发生的多次setState的变更会进行合并,最终减少推送给浏览器的DOM变更次数,从而提升前端性能。那么这部分到底是怎么实现的呢?我们来看下Transaction在React执行点击事件或者生命周期函数时,会使用一个Transaction对象将整个执行过程包裹成一个事务。Transaction对象结构如下图所示<pre> *

2020-05-31 16:13:54 1744

原创 Nodejs源码阅读——事件循环

最近看到Nodejs的事件循环,发现网上的一些文档和描述都不够清晰。所以今天来和大家一起从源码出发了解下Nodejs的事件循环机制。官网描述我们先看下nodejs的官网对事件循环的描述。 ┌───────────────────────────┐┌─>│ timers ││ └─────────────┬─────────────┘│ ┌─────────────┴─────────────┐│ │ pending callba

2020-05-27 17:18:07 263

原创 如何使WPF在窗口外部区域可拖动缩放

今天来和大家聊如何使WPF在窗口外部区域可拖动缩放。问题来源对于WPF窗口来说,默认的可拖动缩放区域较小。在某些应用场景下我们期望能够设置一个较大的可拖动的缩放区域。自定义WindowChrome有同学马上想到了,通过WindowChrome的ResizeBorderThickness属性进行设置比如下面的方式<Window x:Class="WpfApp2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2

2020-05-22 19:44:07 920 3

原创 理解React的渲染更新

今天来和大家聊React的渲染更新过程。React是JavaScript代码在聊渲染更新之前,我们不能忽视的一个概念是——React是JavaScript代码。我们都知道React传给浏览器的并不是一个HTML代码,而是一段js脚本。而在浏览器接收到js脚本之后,再执行并生成对应的html元素,插入到DOM中。这种做法提供了前端组件化的能力,能够让前端的同学不再“面向UI”进行操作。例如上面的例子,我们把一段原生的HTML元素封装成了一个Component组件。组件成了一个独立的模型概念,

2020-05-21 17:08:11 441

原创 如何处理flex布局的最后一行元素宽度问题

今天来和大家聊一个有意思的flex布局问题。注:源码可以参考我在codepen做的demoflex问题来源问题是这样的,我有一个list,期望做成一个flex的wrap布局。每个item项有一个最小宽度,随着窗口的拉伸,item宽度会增加,并且占满容器空间。当窗口宽度增加到一定程度,会触发wrap的布局,每一行会多排列一个item。代码如下<div class="app-list"> <div class="app-block"></div>

2020-05-18 19:53:23 2941

原创 React-Router源码简析

今天来和大家解析下React-Router的源码。React-Router是React生态中最重要的组件之一。他提供了动态的前端路由功能,能让我们在前端应用实现,高效的SPA应用。那么这个东西是怎么实现的呢?我们来一起看下它的源码Router.jsconstructor(props) { super(props); this.state = { location: props.history.location }; // This is a bi

2020-05-16 19:30:29 410

原创 理解GraphQL

之前在restful理解_数据库_黄腾霄的博客-CSDN博客和大家提及了RESTfulAPI的一个弊端,就是接口膨胀。也提到了一个解决方案——GraphQL今天就和大家讲一下什么是GraphQLRESTfulAPI的问题请求爆炸我们先假设有这样一个商城应用,后端对应着用户,订单,物流三个微服务,通过RESTfulAPI暴露服务。在客户端,我们需要完成查询指定用户的所有商品的物流信息。那么我们的请求行为应该是这样的。如上图所示,我们需要先通过用户ID获取从用户服务中获取订单信息,从其中抽取

2020-05-16 17:43:39 253

原创 如何在CefShape中禁用右键菜单

今天遇到了一个在cefsharp中禁用浏览器默认右键菜单的需求,mark一下。问题描述当我们使用默认的cefsharp的ChromiumWebBrowser时,会默认添加一个右键菜单项,如下。实际上,我们业务上往往不需要嵌入浏览器中包含这种右键菜单。或者我们期望自己实现业务需求的右键菜单。那应该怎么办呢?解决方法实际上我们ChromiumWebBrowser暴露了一个MenuHadler属性。这个是一个IContextMenuHandler接口对象。我们可以通过自己实现这个接口,进行注

2020-05-15 20:12:16 953

原创 不要在Directory删除后立刻调用Directory.Exist

今天遇到一个神奇的Directory问题,和大家介绍下。问题描述简单描述下问题,当你调用System.IO.Directory.Delete删除一个文件夹,然后立即用System.IO.Directory.Exists进行判断会概率性返回true。也就是说System.IO.Directory.Exists在检测一个刚刚被删除的文件夹时可能得到错误结果代码如下using System;using System.IO;namespace ConsoleApp2{ class P

2020-05-15 19:17:50 223

原创 WPF的RadioButton指定groupname在window关闭后无法check

今天遇到一个神奇的WPF的RadioButton的group问题,和大家介绍下。问题描述英文好的同学可以直接看吕毅 - walterlv同学在github提的issue。最小复现demo,见毅仔的仓库我将一组RadioButton关联到了同一个GroupName下,并且绑定了同一个ViewModel。 <Border> <RadioButton GroupName="A" IsChecked="{Binding Bar, Source={x

2020-05-14 17:25:45 544

原创 HATEOAS简介

之前restful理解_数据库_黄腾霄的博客-CSDN博客和大家介绍了对RESTful的理解。今天和大家介绍下RESTful中最重要的一个概念HATEOAS。什么是HATEOASHATEOAS是Hypermedia as the Engine of Application State的缩写。翻译过来就是超媒体即应用状态引擎。那这个是什么样的一个东西呢?我们先来看一个现实中的问题。问题来源我们在项目开发中经常需要涉及同后端对接API。对接的过程一般都是后端的同学给出一个文档,告诉我们有哪些A

2020-05-12 20:29:45 7729

原创 RESTfulAPI中能否使用query string

之前restful理解_数据库_黄腾霄的博客-CSDN博客和大家介绍了对RESTful的理解。然后就有小伙伴问了我灵魂问题,对于RESTfulAPI设计,是不是不能使用query string?关于这个问题,网上观点两派纷争不断,为此我特意去拜读了Roy Thomas Fielding的博士论文,以及结合自己的理解来和大家谈谈RESTfulAPI能否使用query string。问题来源对于RESTfulAPI,大家都有一个基本的认识,网上一切皆资源,用URI来定位唯一的资源。而对于领域模型的实体

2020-05-11 22:00:46 927

原创 使用cefsharp让前端调用.NET方法

今天和大家介绍一下使用cefsharp,在浏览器中调用.Net 方法什么是cef和cefsharpCef全称Chromium Embedded Framework 是谷歌的chromium浏览器的嵌入式框架,可以给予其他应用嵌入谷歌chromium浏览器的能力。CefSharp是Cef的.NET 封装版本,可以在.NET环境下运行Cef。有了CefSharp我们就能够在.NET应用中嵌入前端界面,大大扩展了前端页面在多端复用的能力。CefSharpn的的使用例子可以参考github给出的官方用例

2020-05-09 17:49:04 2989

原创 repository模式

今天和大家介绍一下一种特殊的设计模式——仓库模式(repository pattern)什么是仓库模式(repository pattern)Martin Flower对此的定义是领域模型层和数据映射层中间的间接层。它封装了一系列数据库对象以及对应的操作。实现了领域模型和数据访问层的解耦。Repository 模式作用试想一下,在你的程序中,有多处地方需要查询,修改数据。你肯定不希望在各个地方重复书写数据访问代码,所以你会将其放置在同一处地方(数据访问层)。这在大部分场景下都能够满足要求。

2020-05-08 20:55:37 1758

原创 规约模式(specification)

今天和大家介绍一下一种特殊的设计模式——规约模式(Specification pattern)什么是规约模式(Specification pattern)假设你正在减肥,不能吃肉,也不能吃卡路里大于500的食物。把这种情况用编程来表示就会是下面这样void Eat(Food food){ if(food.HasMeat||food.Calorie>500) { ...

2020-05-07 21:03:48 1407

原创 restful理解

Restful已经是目前我们耳熟能详的概念了,但是找了下网上的文章,大部分都是介绍restful API范式。很少介绍resetful架构的。今天同大家介绍下对restful的理解。此外,阮一峰的文章也很不错,感兴趣的同学也可以参考。理解RESTful架构 - 阮一峰的网络日志什么是RESTfulRepresentational state transfer - Wikipedia中的解释是...

2020-05-06 20:43:11 486

原创 2020-4-21-curl的简单使用

今天给大家介绍下网络分析工具curl。什么是Curlcurl是一款热门的网络传输命令行工具。除了http协议之外,curl还支持DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SBMS, SMTP, SM...

2020-04-21 21:09:19 170

原创 常见软件的GC算法解析

今天和大家一起解析下常见的GC算法设计。什么是GCGC是一种软件进行自动的内存回收的方式。如果软件运行过程中,发现某些对象没有了引用(或者称之为不可达)的状态时,就会启动GC过程。将这部分内存进行释放。以避免程序员因为忘记显示释放内存导致程序出现out of memory。GC的过程GC的过程主要分为标记、移动和压缩标记软件先分析堆中的所有内存对象,判断是否“存活”。如果一个对象...

2020-03-22 16:32:06 826

原创 64匹马8赛道选前8的算法解析

今天和大家讲一道很火的面试题——64匹马8赛道选前8的算法解析。题目有64匹马,一共有8个赛道,想要找出最快的8匹马,要比赛最少多少轮才可以?解析这道题初步一看会让人觉得摸不到头脑。我们试着先用图表示下。假设每一匹马是一个图的一个节点,用有向线段A->B表示马A比马B快最终我们可以找到一条从最快马到最慢马的单向路径。那么我们可以有这样的约束:如果有A->B,A-...

2020-03-22 14:14:43 2499 1

原创 一文看懂CAP定理

今天和大家介绍下CAP定理。什么是CAP定理在了解什么是CAP定理之前,我们分别看下C,A,P是什么?一致性(Consistency):你对一个系统执行写操作后,紧接着的一次读操作能够获取正确的值。可用性(Avaliablity):在任意时刻对系统的请求都能得到及时响应分区容错性(Partition Tolerance):你的分布式系统允许任意节点之间的任意数量消息丢失。为了方便...

2020-03-15 16:53:54 504

原创 PPT文档解析之母版

今天和大家介绍下PPT文档解析中的母版。什么是母版我们平时看到的PPT展示,实际上是有多层内容组成的。分别是页面(Slide),布局(SlideLayout)和母版(SlideMaster)我们使用PowerPoint或者WPS打开PPT文件,调到母版视图,就能看到左边列出的母版和布局(或者叫版式)。PPT文件中,可以创建多个母版,每一个母版创建多个布局。在制作PPT时,依赖于不同...

2020-03-10 20:15:04 1275 1

原创 MVC、MVP、MVVM模式演变简析

今天和大家简单介绍下GUI设计中MVC、MVP 以及 MVVM 架构模式的演变。由于MVC等相关模式的定义,实现都各有不同,加之作者认识水平有限,如有纰漏或不足,万望指正。从GUI开始MVC、MVP 以及 MVVM都是GUI设计中的架构模式。那我们就先从GUI开始,思考下这些模式的本质目的。什么是GUI?wiki的定义是用于操作计算机的图形界面。或者使用英文单词(interface)...

2020-03-08 17:11:58 1553 1

原创 C#代码生成之T4模板组成

我们在使用T4模板进行C#代码生成_C#_黄腾霄的博客-CSDN博客介绍了C#使用T4模板生成代码。今天给大家详细介绍下T4模板的组成T4模板的组成部分T4模板的组成部分如图所示。主要由文本部分,以及非文本部分的指令(Directives)和控制块(Control blocks)组成。下面是一个T4模板示例以及最终的生成效果。文本文本是直接在生成文件中输出的内容。所有的文本元...

2020-03-05 18:48:11 651

原创 T型图介绍

在看到编译器相关知识时,发现有一个T型图的概念,于是就记录一下什么是T型图T型图是用于描述编译器实现时的一种辅助工具。我们都知道描述一个语言编译,需要源代码,编译器,和目标代码,三个组成部分。这三者都有自己的生成语言描述,正好可以使用一个T型图标识。这里下面的t型图表示使用β语言书写的编译器,将α语言写的源代码编译成为γ语言。T型图作用有了T型图我们就可以来描述编译器构建。比...

2020-03-04 20:23:55 23685 2

原创 使用T4模板进行C#代码生成

有过前端开发经验的同学一定了解模板文件的重要用户。其实C#也有类似的模板功能(T4模板),不仅可以生成html文件,还可以生成代码。今天就给大家介绍一下。什么是T4模板T4模板全称是Text Template Transformation Toolkit,因为四个单词的开头字母都是T,所以称作T4模板。T4模板是一种支持C#或者VB代码开发的模板格式,已经在Visual Studio,Mo...

2020-03-03 20:04:51 1651

原创 什么是ring0-ring3

大家可能听说过某个代码需要运行在ring 0的说法。但是ring 0究竟是什么,今天就给大家介绍下。权限控制我们都知道计算机中运行着许多的软件,有些软件是和硬件打交道的,比如驱动软件,操作系统软件,有些软件只是运行在操作系统之上的,比如浏览器,文本编辑软件等。为什么要这样设计?这是为了控制运行软件的权限,让一些特定的软件才能执行某些“危险”的行为,比如读写特定的内存等。这里就引申出了我...

2020-03-01 16:50:30 6050

空空如也

空空如也

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

TA关注的人

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