减少 Webpack 编译构建时长、深入理解 go sync.Cond | 酱酱的下午茶第162期

2,720 阅读7分钟

Hello,又到了每天一次的下午茶时间。酱酱们的下午茶新增优质作者介绍和码上掘金板块,专注于发掘站内优质创作者和优质内容,欢迎大家多提宝贵意见!

  • 【本期掘金酱的下午茶】亮点:
  • React处理大数据量场景实践
  • 为什么大家都说 SELECT * 效率低?
  • Swift之struct二进制大小分析
  • Redis两层数据结构简介
  • ……

筛选规则:文章发布时间在本期「掘金酱的下午茶」发布时间的 1-3 天内,且符合社区推荐标准,也会同步发布在掘金相关技术社群。

今日主理人|下午茶

本期每日掘金由  丘山子  负责制作,需要投稿下午茶请私信我的助理 小岳

PS:主理人目前正在招募中,有感兴趣的掘友们可以联系Captain

每日干货|下午茶

主理人们会对近期(1-3 天)社区深度技术好文进行挖掘和筛选,优质的技术文章有机会出现在下方列表,排名不分先后。

『前端』

本文将要介绍一下 react 对于大量数据场景的处理。一般分为两种方案:

  • 虚拟列表(主要应用在长列表渲染)
  • 时间分片(主要应用在点位渲染)

接下来将围绕以上两点进行讲解和实践

本文将先介绍 Webpack 编译构建流程,了解编译构建主要耗时在哪些地方;然后介绍如何收集 Webpack 编译性能数据,以及使用工具分析编译性能瓶颈;最后介绍几个有效减少编译构建时长的手段。

我假以小兔子的角色创建了今天这份代码——气泡式互动对话小说《兔兔说》,每个人都能续写自己的故事,走出自己的浪浪山。

时光荏苒,这绝不平淡的 2022 年已经走上历史的黄页,新的一年也逐渐看不到故人回首的光影。感谢你对前端技术领域持续关注,我们一直在这里等你。

『后端』

无论在工作还是面试中,关于SQL中不要用“SELECT *”,都是大家听烂了的问题,虽说听烂了,但普遍理解还是在很浅的层面,并没有多少人去追根究底,探究其原理。

在 go 的标准库中,提供了 sync.Cond 这个并发原语,让我们可以实现多个 goroutine 等待某一条件满足之后再继续执行。 它需要配合 sync.Mutex 一起使用,因为 Cond 的 Wait 方法需要在 Mutex 的保护下才能正常工作。 对于条件变量,可能大多数人只是知道它的存在,但是用到它的估计寥寥无几,因为很多并发场景的处理都能使用 chan 来实现, 而且 chan 的使用也更加简单。 但是在某些场景下,Cond 可能是最好的选择,本文就来探讨一下 Cond 的使用场景,基本用法,以及它的实现原理。

Redis 的性能高的原因之一是它每种数据结构都是经过专门设计的,并都有一种或多种数据结构来支持,依赖这些灵活的数据结构,来提升读取和写入的性能。如果要了解 Redis 的数据结构,可以从两个不同的层面来讨论它:

  • 第一个层面,是从使用者的角度,这一层面也是 Redis 暴露给外部的调用接口,比如:String, List, Hash, Set, Sorted Set
  • 第二个层面,是从内部实现的角度,属于更底层的实现,比如:dict, SDS, linkedlist, ziplist, quicklist, skiplist, intset

本文的重点在于讨论第二个层面:

  • Redis 数据结构的内部实现
  • 这两个层面的数据结构之间的关系:Redis 如何通过组合第二个层面的各种基础数据结构来实现第一个层面的更高层的数据结构

将某个通用解决方案包装成成熟的工具包,是每一个技术建设工作者必须思考且必须解决的问题。本文从业内流行的既有工具包入手,解析实现思路,沉淀一般方法。为技术建设的初学者提供一些实践思路的参考。尤其是文中提倡的“去中心化”的协作模式,和“关键链路+开发接口”的开发模式,具有一定的实际落地意义。当然本文在行文中,不可避免存在一定主观偏见性,读者可酌情阅读。

我个人在学习DDD的过程中,早期翻找各种资料的时候,看到了很多名词:战略设计、战术设计、聚合根、实体、值对象、界限上下文...这些繁多的名词定义配合上几乎少的可怜的实战例子,让我在翻阅了大量资料之后依然感觉无从下手。在盲人摸象式的探索和一些实践经历后,我发现还是从开发人员最熟悉的代码层面做突破切入,才能迅速让初次接触的人员能够快速理解并上手DDD,所以这篇文章我决定直接从一些DDD的代码层面战术设计入手,一步一步窥探DDD带给我们的启发。

『移动端』

无论是 Android 开发者还是 Java 工程师应该都有使用过 JNI 开发,但对于 JVM 如何加载 so、Android 系统如何加载 so,可能鲜有时间了解。

本文通过代码、流程解释,带大家快速了解其加载原理,扫清困惑。

随着Swift的日渐成熟和给开发过程带来的便利性及安全性,京喜App中的原生业务模块和基础模块使用Swift开发占比逐渐增高。本次讨论的是struct对比Class的一些优劣势,重点分析对包体积带来的影响及规避措施。

其实IO操作相较于服务端,客户端做的并不多,基本的场景就是读写文件的时候会使用到InputStream或者OutputStream,然而客户端能做的就是发起一个读写的指令,真正的操作是内核层通过ioctl指令执行读写操作,因为每次的IO操作都涉及到了线程的操作,因此会有性能上的损耗,那么从本篇文章开始,我们将进入IO的世界,了解IO到NIO机制的演进,从底层关注序列化的原理。

趣味码上掘金分享|下午茶

作者简介
清Acwing大乱斗

📖 投稿专区|下午茶

大家可以在评论区推荐认为不错的文章,并附上链接和推荐理由,有机会登上下一期。文章创建日期必须在近 1-3 天内;可以推荐自己的文章、也可以推荐他人的文章。