Skip to main content

· 15 min read
加菲猫

⭐️ Go语言反射编程指南

⭐️ Go 1.21 确认添加 cmp 包以及 min, max built-in 函数

📒 TypeScript 5.1 正式发布!

⭐️ 识别「ChatGPT造假」,效果超越OpenAI:北大、华为的AI生成检测器来了

⭐️ 给面试官一点小小的 gpt 震撼

⭐️ 非广告| DDD 到底是银弹还是垃圾

⭐️ 开通个人博客啦!附带全部 Hexo + Nginx + Git 教程

⭐️ Go error 处理最佳实践

⭐️ 为什么泛型使你的程序变慢

📒 使用require.context实现优雅的预加载!

⭐️ 聊聊 rust trait

⭐️ Go 编译器优化

⭐️ 从Go源码到可执行文件的编译过程详解

⭐️ 为什么取消了Go1.21,而采用了Go1.21.0的版本命名规则

⭐️ Ranking and Tuning: 解锁预训练模型库的新范式

⭐️ Golang中的25个常见错误:更好地进行go编程的综合指南

⭐️ 颠覆微服务架构?谷歌最新开源service weaver初体验

📒 连尤大都要借鉴的开源项目也会有一些迷惑行为

⭐️ Go1.21 速览:骚操作 panic(nil) 将成为历史!以后别这么干了

⭐️ Go channel FAQ

📒 form元素是React的未来

⭐️ 不要写 clean code, 要写 CRISP code

⭐️ channel 的 15 条规则和底层实现

⭐️ Go netpoll (下篇)- 数据接收发送和关闭

📒 【第2956期】如何编写一个友好支持 Tree-shaking 的库

⭐️ Go 高性能 - singleflight 防止缓存击穿

⭐️ 阅读破10万的学Go建议,不管初学还是进阶Go都值得一看!

⭐️ 深入浅出Go调度器中的GMP模型

⭐️ Go netpoll (上篇)- 数据结构和初始化

📒 ​未来全栈框架会卷的方向

⭐️ 抽丝剥茧,记一次 Go 程序性能优化之旅

📒 原生 popover 终于要来了!

📒 INP 即将代替 FID 成为新的核心 Web 指标

📒 相关文章推荐

《DeviceScript:专为微型设备设计的 TypeScript》。DeviceScript 是微软新推出的一种语言,旨在将 TypeScript 的编程体验应用到低资源的微控制器设备中。它被编译为一种自定义的虚拟机字节码,可以在这样的受限环境中运行(类似于 Go 的 TinyGo)。虽然主要面向 VS Code 用户,但也提供了 命令行选项。

《Deno v1.34:现在 deno compile 也支持 npm 包》。Deno 1.34版本主要增强了与npm和Node.js的兼容性,提高了开发者体验,并为未来的性能优化奠定了基础。此次更新最重要的功能包括:deno compile支持npm包、在deno.json和CLI标志中支持Glob以及TLS证书与IP地址。除此之外,还有许多其他改进和错误修复值得一提。其中,deno compile是本次更新中最受期待的功能之一,它使开发人员可以将项目编译成单个可执行文件,并且现在也支持使用npm包进行编译。同时,在配置文件方面也有所改进,例如新增排除所有子命令下某些文件或文件夹等功能。Deno 1.34还升级了V8至11.5版以及TypeScript至5.0.4版等内容。

《TC39 第 96 次会议的一些更新》。这篇文章介绍了2023年5月16日至18日举行的第96次TC39会议,讨论了几个JavaScript/ECMAScript的特性提案。这些包括Atomics.waitAsync、带有set符号和字符串属性的RegExp v标志、格式良好的Unicode字符串、装饰器元数据(扩展装饰器提案)、TypedArrays/DataView/Math.f16round上的Float16Array、Uint8Array:ArrayBuffer到/from Base64 的Base64编码解码,Promise.withResolvers(创建具有reject/resolve/promise函数作为方法的Promise),时区规范化(在Temporal基础上堆叠的提案)以及Intl.ZonedDateTimeFormat(用于Temporal.ZonedDateTime的Intl格式)。

《Web Components 简介》。这篇文章介绍了如何使用Web Component实现选项卡面板。首先,需要创建一个扩展HTMLElement的类,并将其注册为自定义元素。然后,在connectedCallback生命周期方法中,可以读取提供的子元素并生成UI以显示它们作为选项卡。还介绍了启用阴影DOM来提供范围化的CSS样式和激活标签状态等其他功能。最后,通过添加样式完成了选项卡组件的设计。

《比较三种非破坏性处理数组的方法》。有这篇文章介绍了三种处理数组的方法:for-of 循环、reduce() 和 flatMap()。作者通过实现一些功能来演示这三个特性,包括过滤输入数组以生成输出数组、将每个输入数组元素映射到一个输出数组元素、将每个输入数组元素扩展为零或多个输出数组元素等。对于每种方法,作者都提供了相应的代码示例,并讨论了它们的优缺点以及何时使用它们。总体而言,for-of循环是最通用的工具,而.reduce()适合计算汇总信息(例如所有元素之和),flatMap()则擅长于筛选-映射和将输入元素扩展为零或多个输出元素。

《我是如何将我的 Angular 应用转换为独立组件模式的》。这篇文章介绍了如何使用Angular的独立组件方法来避免使用ngModules。作者解释了独立组件的概念,它可以通过删除不必要的导入来大幅简化应用程序并减小包大小。在示例代码中,作者展示了如何在没有任何模块声明的情况下创建一个组件,并讨论了其优点和缺点。此外,作者还提供了一些工具和技巧,例如Bit开源工具链等,以帮助管理和共享这些独立组件。最后,作者演示了如何将现有项目从ngModule迁移到独立组件方法,并提供相应的代码示例进行说明。

《理解 React 并发》。这篇文章介绍了React v18.0中引入的一项新特性:并发模式。它的基本原则是重新设计渲染过程,使得在渲染下一个视图时,当前视图仍然保持响应性。为此,React团队提出了Concurrent Mode这个概念,并将其实现为可中断工作单元。具体来说,在组件渲染过程中使用requestIdleCallback()函数来实现并发模式。但由于向后兼容问题,Concurrent Mode计划未能实现。因此React团队转而推出了Concurrent Features这个方案,并引入了两个新钩子useTransition和useDeferredValue以支持并发渲染。其中useTransition返回一个布尔标志isPending和一个startTransition函数;而useDeferredValue则用于处理父组件传递给子组件的值更新等情况。需要注意的是,虽然这些钩子可以优化应用程序性能并提高用户体验,但它们也有自己的限制和缺点。如果想要深入理解如何使用React Concurrency,请参考官方文档及相关资源进行学习和掌握。

《你可能不需要 React Query》。这篇文章讨论了React Query在React Server Components出现后是否还有存在的必要性。作者认为,如果数据获取只发生在服务器端,那么使用React Query就没有必要了。但是,在过渡期间,可以将一些组件移动到仅在服务器上获取数据或使用Server Components预取缓存并将结果传递给客户端组件。此外,对于某些情况(例如无限滚动列表、离线应用程序等),结合React Query和Server Components可能会更好地解决问题。总之,作者认为不需要立即全部转移到Server Components,并且React Query仍然有其存在的价值和用途。

《Storybook Day 的 3D 动画是如何实现的》。这篇文章介绍了团队如何使用React Three Fiber(R3F)构建一个视觉上令人惊叹的三维动画,以Storybook的俄罗斯方块品牌为灵感创作出一个引人注目的三维插图。文章涵盖了创建场景时使用的几种技术,包括通过球体堆积避免对象重叠、使用挤压几何模型化俄罗斯方块、利用深度和阴影等效果增强视觉效果、通过减少材质数量和使用材质存储库进行性能优化等。该团队使用NextJS和@react-three/fiber构建活动网站。他们采用pack-sphere库来平均分配方块并防止任何潜在重叠问题。为解决“7.0”文本与方块之间的重叠问题,他们稍微沿z轴移动球体而不是检测球体与文本几何之间的碰撞。他们还利用Three.js中提供的ExtrudeGeometry对类似SVG路径或CSS形状这样的2D形状进行挤压,并将其沿着z轴拉伸成3D物体。为了增加一些特效,他们添加了阴影和景深效果,使其具有更多电影般感觉,并通过Material Store技术降低需要渲染材质数量从而提高性能。总之,这是一个非常好的指南,适合任何想学习如何在React Three Fiber(R3F)中构建视觉上令人惊叹的三维动画。

《如何开发一个自定义的 debounce Hook》。本文介绍了如何使用React创建自定义防抖钩子。在前端Web应用程序中,常见的功能之一是为输入添加防抖。 防抖可以让我们在输入值更改后延迟执行操作。 本文将演示如何使用React创建自定义防抖钩子。首先,我们需要了解什么是自定义Hooks以及它们的作用。 自定义Hook只是一个纯函数,它使用其他Hook来实现特定目标,并且不会产生任何副作用。接下来,文章介绍了如何通过useState和useEffect Hook创建一个名为useFetch的自定义Hook,该Hook可获取数据并返回数据和加载状态。然后文章进一步说明了如何通过useState、useEffect和useRef Hook创建名为useDebounce的自定义钩子,并演示了如何在组件中使用该钩子以实现对输入进行防抖处理。总之,本文提供了有关如何构建具有高度重复利用性能力的React Hooks(包括获取数据、防抖等)的详细指南。

《 JavaScript 安全: 最佳实践和提示》。在一个网络威胁日益复杂的时代,理解如何编写安全的 JavaScript 代码比以往任何时候都更加重要。在这篇文章中,Alex Ivanovs 解释了常见的 JavaScript 漏洞,从跨网站脚本(XSS)和跨站请求伪造(CSRF)到更复杂的问题,比如原型污染和不安全的依赖。

《Node.js 性能状况 2023》。今年是2023年,我们已经发布了 Node.js v20.0。本文对不同版本的 node.js 的性能进行了比较分析。它强调了这些改进和改进,并提供了对这些更改背后原因的深入了解,而没有与其他 JavaScript 运行时进行比较。基准测试结果包含一个可重复的示例和硬件细节。使用了 AWS 专用主机。

⭐️ Go语言爱好者周刊:第 188 期 —— Go 适合开发操作系统吗

· 20 min read
加菲猫

image

题图:王国之泪。

📒 支付系统就该这么设计,稳的一批!!

⭐️ 聊聊Go语言的控制语句

⭐️ 不背锅运维:Go语言切片内存优化技巧和实战案例

⭐️ Go:4个场景就可以让你知道Goroutine和通道是怎么用的

⭐️ 「Go开源包」asynq:一个基于redis的,简单、可靠、高效的分布式任务队列包

⭐️ goroutine 泄漏与检测

📒 字节都在用的代码自动生成

📒 Hook 革命!浅谈 React 新 Hook 的未来与思想

⭐️ Go Sync 包:并发的 6 个关键概念

📒 Bun发布全新Bundler:比Webpack快220倍

Bun发布全新Bundler:比Webpack快220倍

https://bun.sh/blog/bun-bundler

⭐️ 大大大模型部署方案抛砖引玉

📒 ChatGPT和Claude 对比测试(以Review MLIR Codegen代码为例)更新官方ChatGPT的结果

⭐️ Everything App: HuggingFace Transformers Agent

📒 【第2950期】vite-plugin-vue-devtools:写一个Vue DevTools,让开发体验飞一会

⭐️ Go timer Code Review

📒 H5加载性能优化

对于大部分用户而言,我们根本不需要把代码编译到 ES5,不仅体积大,而且运行速度慢。我们需要做的,就是把代码编译到 ES2015+,然后为少数使用老旧浏览器的用户保留一个 ES5 标准的备胎即可。

具体的解决方法就是 <script type="module"> 标签。

支持 <script type="module"> 的浏览器,必然支持下面的特性:

  • async/await
  • Promise
  • Class
  • 箭头函数、Map/Set、fetch 等等...

而不支持 <script type="module"> 的老旧浏览器,会因为无法识别这个标签,而不去加载 ES2015+ 的代码。另外老旧的浏览器同样无法识别 nomodule 熟悉,会自动忽略它,从而加载 ES5 标准的代码。

image

# React 16 加载性能优化指南

# 让老板虎躯一震的前端技术,KPI杀手

📒 tcmalloc 解内存分配问题

https://github.com/AUTOMATIC1111/stable-diffusion-webui/discussions/6722

# 深入Golang内存管理(一) TCMalloc篇

# Go内存管理之TCMalloc

# TCMalloc : Thread-Caching Malloc

# Go 内存管理(二): TCMalloc分配算法

⭐️ XML 处理,Go 标准库太简单了怎么办

📒 我用ChatGPT,给RabbitMQ加了个连接池

📒 React组件封装实践:如何拆解复杂的页面

📒 现代 Web 应用 Devtools 调试技巧

📒 在服务端写 React 组件是什么体验

⭐️ Go 空结构体:零内存的魔力

📒 这个线上BUG,让你彻底搞懂了MySQL的字符集,别问我咋知道的

⭐️ LLaMA 模型调研

当前 HuggingFace 已经实现了 LLaMA 模型 代码,可通过以下方式直接调用:

from transformers import LlamaForCausalLM
model = LlamaForCausalLM.from_pretrained(
base_model,
load_in_8bit=load_8bit,
torch_dtype=torch.float16,
device_map="auto",
)
if not load_8bit:
model.half() # seems to fix bugs for some users.
model.eval()

https://github.com/pengxiao-song/LaWGPT

https://github.com/pengxiao-song/LaWGPT/blob/f329433cad833a44c2cd14c5165a1655cf9d68ad/src/generate.py#L7

https://huggingface.co/docs/transformers/main/model_doc/llama

NLP(九):LLaMA, Alpaca, ColossalChat 系列模型研究

使用 Google Colab 训练 Stable Diffusion LoRA 模型教程

https://colab.research.google.com/#scrollTo=-Rh3-Vt9Nev9

⭐️ 「Go 框架」深入理解 gin 框中 Context 的 Request 和 Writer 对象

⭐️ Go1.22 可能会解决循环变量的坑,真好!!

📒 SpringBoot + 规则引擎 URule,太强了!

📒 2023 年你还在兼容旧版浏览器吗

📒 mysql的varchar字段最大长度真的是65535吗

在 mysql 建表 sql 里,我们经常会有定义字符串类型的需求。mysql 里有两个类型比较适合这个场景:charvarchar

声明它们都需要在字段边上加个数组,比如 char(100)varchar(100),这个 100 是指当前字段能放的最大字符数。

charvarchar 的区别在于,varchar 虽然声明了最大能放 100 个字符,但一开始不需要分配 100 个字符的空间,可以根据需要慢慢增加空间。而 char 一开始声明是多少,就固定预留多少空间。

所以,varchar比起char更省空间,一般没啥大事,大家都爱用varchar。

mysql的varchar字段最大长度真的是65535吗

⭐️ Go 细节篇-内存回收又踩坑了

📒 【第2948期】得物前端巡检平台的建设和应用:建设篇

⭐️ Go设计模式--中介者,最后的模式!

⭐️ channel 的 15 条规则和底层实现

操作规则

操作nil已关闭的 channel未关闭有缓冲区的 channel未关闭无缓冲区的 channel
关闭panicpanic成功关闭,然后可以读取缓冲区的值,读取完之后,继续读取到的是 channel 类型的默认值成功关闭,之后读取到的是 channel 类型的默认值
接收阻塞不阻塞,读取到的是 channel 类型的默认值不阻塞,正常读取值阻塞
发送阻塞panic不阻塞,正常写入值阻塞

编译规则

操作
接收只写 channel编译错误
发送只读 channel编译错误
关闭只读 channel编译错误

channel 的 15 条规则和底层实现

📒 三分钟,教你3种前端埋点方式!

📒 MDH 前端周刊第 100 期:React Query、演讲、Reactivity、Bun Bundler、Rome、infer

《你可能不需要 React Query》。这篇文章讨论了 React Server Components 是否会取代 React Query。作者认为,每个工具都应该帮助我们解决我们遇到的问题。传统上,React 在数据获取方面并不强调如何处理,这就是 React Query 和 swr 等库产生的原因。随着服务端渲染的出现,React Query 也扮演了重要的角色。但是,随着 React Server Components 的出现,如果您的数据获取仅发生在服务器上,那么您可能不需要 React Query。最后,作者提醒读者,不要盲目追随新技术,一切都有权衡。

https://tkdodo.eu/blog/you-might-not-need-react-query

《Nuxt 发布 3.5》。Nuxt 3.5.0 发布了,带来了许多令人兴奋的功能,特别是在类型支持方面。此外还有 Nitropack v2.4 和丰富的 JSON 负载等更新。Nuxt 3.5.0 还支持交互式服务器组件、环境配置、完全类型化页面和 “捆绑器” 模块解析等功能。

https://nuxt.com/blog/v3-5

《发布 TypeScript 5.1 RC》。TypeScript 5.1 已经作为候选版本发布,除了关键的错误修复外,预计在稳定版发布前不会有进一步的变化。新版本包括更容易的未定义返回函数的隐式返回,getters 和 setters 的不相关类型, JJSX 元素和 JJSX 标签类型之间的解耦类型检查,命名的 JJSX 属性,以及其他。TypeScript 5.1 还支持 JJSX 标签的链接光标,@param JSDoc 标签的片段补全,以及优化,如避免不必要的类型实例化和联合字面的负数检查。

https://devblogs.microsoft.com/typescript/announcing-typescript-5-1-rc/

《在科技会议上从参会者到演讲者的 9 个技巧 | GitHub博客》。GitHub Universe 是一年一度的全球开发者和客户活动,今年将于 11 月 8 日至 9 日在线上和线下举行。文章提供了一些撰写成功演讲提案的技巧,例如标题要吸引人、具体说明内容的收获、突出会议性质等。此外,还提供了演讲者个人介绍的公式和其他有用资源,如往年活动的回顾、联系前任演讲者、关注行业热点等。最后,文章呼吁有兴趣参加演讲的人提交他们的想法,并列出了被选中的好处。

https://github.blog/2023-05-18-9-tips-to-go-from-attendee-to-speaker-at-a-tech-conference/

《GitHub - DukeLuo/eslint-plugin-check-file》。本文介绍了一个名为 eslint-plugin-check-file 的 ESLint 插件,该插件可以帮助开发者强制规范化文件和文件夹的命名方式。插件支持多种规则,例如强制指定文件夹名称、文件名命名规范等。开发者只需要在 .eslintrc 配置文件中添加相应的规则即可使用。

https://github.com/DukeLuo/eslint-plugin-check-file

《揭开魔法的面纱:探索各种框架的反应性》。本文深入探讨了各种前端框架中的响应性(reactivity)机制,着重比较了粗粒度和细粒度响应性之间的差异。React 和 Angular 属于粗粒度系统,需要重新执行组件树来检测更改并更新 DOM;Svelte、Vue、Qwik 和 Solid 属于细粒度系统,可以更加高效地检测和更新 DOM。Qwik 是唯一一个不需要预热的框架,它通过 SSR/SSG 将状态与 DOM 相关联,并在客户端恢复这些信息,从而避免了下载大量应用代码的问题。作者认为,虽然粗粒度系统 “随便用” 会更方便,但是使用细粒度系统可能会更高效,因为后者已经进行了优化。

https://www.builder.io/blog/reactivity-across-frameworks

《介绍一下 Legend-State 1.0:更快地构建更快的应用程序》。文章介绍了一个名为 Legend-State 的 React 状态库,它具有极快的速度、易用性、自然的细粒度反应和内置持久性等四个主要优点。该库基于可观察对象实现,使用 Proxy 跟踪对象中的路径,从而在速度和内存使用方面超越其他 React 状态库。使用该库不需要繁琐的模板代码和上下文、动作、规约、分派器等,只需调用 get() 获取原始数据并使用 set() 更改数据即可。此外,该库还支持细粒度反应,使得组件能够在特定值更改时更新,从而减少重新渲染的次数。最后,该库还内置了持久化功能,可以保存和同步应用程序状态。未来,该库将添加更多的持久化插件和辅助可观察对象和钩子函数。

https://legendapp.com/open-source/legend-state-v1/

《管理 GitHub 通知》。这篇文章介绍了一种名为 “Notification-driven Developement” 的方法来管理 GitHub 上的项目。该作者通过使用 GitHub 的通知系统来管理他所维护的各种规模的项目,以保持项目的活跃度和稳定性。他提出了 “Inbox-Zero” 概念,即每天处理完所有收到的通知,以便快速响应社区成员并控制维护工作量。文章还分享了一些减少通知数量和组织通知的技巧,并介绍了一个用户脚本来自动化通知处理。最后,作者强调了享受工作和保持良好的工作与生活平衡的重要性。

https://antfu.me/posts/manage-github-notifcations-2023

《Bun Bundler》。Bun bundler 是一个快速的本地打包工具,现在已经进入了 beta 测试阶段。它可以通过 bun build CLI 命令或新的 Bun.build() JavaScript API 来使用。该工具可以用于构建前端应用程序,并提供了内置的 Bun.build () 函数和 bun build CLI 命令。文章指出,JavaScript 生态系统的复杂性不断增加,如何运行 TypeScript 文件、如何为生产环境构建 / 打包代码等问题使得开发变得越来越复杂。Bun bundler 的目标是将打包引入 JavaScript 运行时,从而使前端和全栈代码的发布更简单、更快速。该工具的优点包括:插件执行快速、生成预转换文件以提高运行性能、统一的插件 API、构建输出数组、支持 ESM 模块系统、支持 tree-shaking、支持源码映射、支持 JS 压缩器等。未来,Bun bundler 还将与 Bun 的 HTTP 服务器 API(Bun.serve)集成,从而实现用简单的声明式 API 代替

https://bun.sh/blog/bun-bundler

《将 Next.js App Router 用于生产的 5 条经验之谈》。Next.js 13 的新功能 App Router 引入了 Nested Layouts、Server Components 和 Streaming 等多项新特性,是第一个开源实现 React 18 原语的工具。从 Next.js 13.4 开始,App Router 已被认为是生产就绪状态。使用 App Router 可以更轻松地在路由之间共享 UI、更好地利用服务器组件、更快地展示页面部分内容以及准备未来。但是,在应用 App Router 时需要注意两个缓存、URL 搜索参数在布局服务器组件中的问题、文件结构的优点以及学习新技术和资源有限的挑战。建议先仔细阅读官方文档,如果遇到问题可以查看 GitHub 和 Twitter 上的讨论,并且分享经验和解决方案有助于建立更加实质性的知识库。总体而言,采用 App Router 可以提高用户和开发者的体验,但需要耐心和深入挖掘。

https://www.inngest.com/blog/5-lessons-learned-from-taking-next-js-app-router-to-production

《理解 useRef 和 useState 用于跟踪 React 中的组件渲染次数》。本文介绍了在 React 中使用 useRef 和 useState 来追踪组件渲染次数的实际例子。通过自定义一个名为 useComponentRenderCount 的 hook,使用 useRef 来存储渲染次数,并使用 useState 来管理组件内的不同状态值。通过将状态值分开控制,可以提高代码可读性并更轻松地管理每个值的状态更新。理解何时使用 useRef 以及如何与 useState 一起使用对于管理复杂的组件行为至关重要。在开发 React 应用程序时,需要平衡性能和功能,才能创建高质量的应用程序。

https://peterkellner.net//2023/05/05/Understanding-useRef-and-useState-for-Tracking-Component-Render-Count-in-React/

《反应全局状态为局部状态》。这篇文章介绍了一种基于 React 的全局状态管理方案,使用 useGlobalState 钩子来读取全局存储对象,并在其更新时强制所有已订阅的组件重新渲染。相比于 Redux 和 Context,这种方案更加简单且没有繁琐的代码。该方案不需要依赖库,支持测试和 TypeScript。文章详细介绍了如何实现这个钩子,包括 JavaScript 和 TypeScript 的实现以及测试用例。作者表示这种方案虽然简单,但也具有可扩展性,可以在其上构建中间件、错误处理和动作等功能。作者在几个项目中尝试了 createGlobalState,目前已成为他的默认选择。

https://webup.org/blog/react-global-state-as-local-state/

《Rome 发布 v12.1.0》。Rome v12.1.0 发布了,支持新的 Stage 3 装饰器、VCS 集成和新的 lint 规则。现在,Rome 可以解析和格式化大多数框架中的装饰器,并且支持 git VCS 集成。此外,还添加了许多新的 lint 规则,并提供了一个新的命令来更新配置文件。还有一个新的 CLI 帮助提示库,可以从源代码生成输出。

https://rome.tools/blog/2023/05/10/rome12_1/

《掌握 TypeScript 中的 infer - JavaScript in Plain English》。本文介绍了 TypeScript 中 infer 关键字的用法,它可以从现有的代码中提取和推断类型。使用 infer 关键字可以增加代码的类型安全性、效率和组织性。infer 关键字可以在泛型类型、函数参数和返回值、映射类型中使用,但只能在条件类型中使用。同时,文章还提供了一些实际的例子来展示 infer 关键字的使用方法。

https://javascript.plainenglish.io/mastering-infer-in-typescript-6cf3f93cca86

MDH 前端周刊第 100 期:React Query、演讲、Reactivity、Bun Bundler、Rome、infer

📒 Go语言爱好者周刊:第 187 期

gobot v2.0 发布 - 使用 Go 编程语言的 IOT 框架(机器人框架)。

https://github.com/hybridgroup/gobot

Mage v1.15 发布 - Mage 是使用 Go 的类似 make/rake 的构建工具。您编写普通的 go 函数,Mage 会自动将它们用作类似于 Makefile 的可运行目标。

https://github.com/magefile/mage

几种使用Go发送IP包的方法 - 本文尝试介绍几种收发IP packet的方式。

https://colobu.com/2023/05/13/send-IP-packets-in-Go/

lingoose - 一个 Go 框架,用于使用管道开发基于 LLM 的应用程序。

https://github.com/henomis/lingoose

Go语言爱好者周刊:第 187 期

· 8 min read
加菲猫

image

题图:王国之泪。

⭐️ Go与神经网络:张量运算

⭐️ 掌握 GoLang 中的指针:高效代码的提示和技巧

⭐️ 通过源码分析告诉你:当访问K8S API的代码运行在POD里的容器时,在集群内是如何进行身份验证的

⭐️ 「Go工具箱」redis官网推荐的go版本的分布式锁:redsync

📒 通俗直观介绍ChatGPT背后的大语言模型理论知识

⭐️ Golang网络IO模型源码分析-goroutinue+epoll

⭐️ 什么是无头浏览器?用Go模拟用户操作、实现网页浏览和截图

📒 Nuxt 3.5 正式发布,支持 Vue 3.3!

⭐️ 翻车了,被读者找出 BUG

⭐️ sync.Map Code Review

⭐️ 一文掌握 Go 并发模式 Context 上下文

⭐️ React 性能优化 | 包括原理、技巧、Demo、工具使用

📒 关于组件化链路设计的分享

📒 硬核,图解bufio包系列之读取原理

📒 6 个 TypeScript 的高级技巧,帮你写出更清晰的代码

📒 日常开发中,提升技术的13个建议

⭐️ 开发工具 All In One

⭐️ 从一次 PR 经历谈谈 Go 和 MySQL 的时区问题

⭐️ 玩转Netty,从“Hello World”开始!

📒 面试官:一千万的数据,你是怎么查询的

⭐️ context.Context Code Review

⭐️ 提升 Web 核心性能指标的 9 个建议

📒 Vue 转 React的开发者,常犯的10个错误

📒 你们喜欢用forEach吗?说说我为啥不喜欢用forEach

⭐️ Go语言中常见100问题-#35 Using defer inside a loop

⭐️ Go设计模式--解释器模式

📒 分布式唯一 ID 通用选型

📒 MDH 前端周刊第 99 期:jQuery 3.7、Vue 3.3、Deopt Explorer、粘性菜单、Remix、SSC

《使用 Deno 在 Rust 中运行 JavaScript》。本文介绍了作者创建的一个名为 “js-in-rs” 的基于 Rust 的 CLI 工具,用于使用 JavaScript 表达式过滤文件。与 grep 工具使用正则表达式不同,js-in-rs 使用 JavaScript 表达式进行过滤。文章详细介绍了 js-in-rs 的工作原理和代码实现,并探讨了在 Rust 应用程序中运行 JavaScript 代码的潜在应用,例如 Web 服务器、数据管道和数据库用户定义函数等。

https://austinpoor.com/blog/js-in-rs

《发布 Vue 3.3》。Vue 3.3 "Rurouni Kenshin" 已经发布,重点是改善开发者在使用 Vue 与 TypeScript 时的体验。该更新包括改进 SFC <script setup> 与 TypeScript 的使用,宏中的导入和复杂类型支持,通用组件,更符合人体工程学的 defineEmits ,带有 defineSlots 的类型槽,以及反应式道具 destructure 和 defineModel 等实验性功能。

https://blog.vuejs.org/posts/vue-3-3

《React 协调:它是如何工作的,为什么我们应该关心》。本文详细介绍了 React 的协调算法,以及它如何影响我们的日常代码。文章探讨了条件渲染、"key" 属性和为什么不应该在其他组件内声明组件等问题,并提供了解决方法。作者通过分析 React 的虚拟 DOM 和状态更新过程,解释了为什么在条件渲染中声明组件会重新挂载,以及为什么需要使用 "key" 属性来避免组件重复挂载或保证元素的唯一性。最后,作者提供了多个示例来说明这些概念。

https://www.developerway.com/posts/reconciliation-in-react

《介绍 Deopt Explorer - TypeScript》。本文介绍了如何使用内联缓存(inline caching)优化 JavaScript 代码的性能,并讲解了在 TypeScript 编译器中如何使用 Deopt Explorer 工具来分析性能问题和减少多态现象。文章详细介绍了内联缓存的概念、不同类型的缓存以及多态现象的产生原因。通过实例分析,作者展示了如何使用 Deopt Explorer 工具来分析 V8 引擎生成的 ICs 和对象类型,并通过优化 Symbol 类型的属性访问,将编译时间平均缩短了 8-10%。

https://devblogs.microsoft.com/typescript/introducing-deopt-explorer/

《我的 Remix 之路》。这篇文章讨论了作者使用 Remix 框架的经验和遇到的问题。作者认为 Remix 是一个很好的框架,但是也存在一些缺点。作者提出了四个主要问题:开发体验、路由过于神秘、仍然不够成熟以及控制不是默认的。作者指出,Remix 在某些方面缺乏对开发者的控制权,例如构建过程和静态资源处理。此外,Remix 的路由语法可能会使人感到困惑,并且更新时可能会出现问题。

https://redd.one/blog/my-struggle-with-remix

《不阻塞事件循环的实用指南》。本文介绍了 JavaScript 在单线程环境下的事件循环机制,以及如何避免同步任务阻塞事件循环。作者提出了三种解决方案:增加节点数量、将同步任务改为异步任务、将同步任务转移到另一个线程。其中,将同步任务转移到另一个线程需要使用 Worker,并且有数据传输限制。作者还介绍了将同步任务改为异步任务的具体实现方法,即通过将代码块分散到事件循环中来添加同步执行之间的间隙,从而让事件循环得以运行。

https://www.bbss.dev/posts/eventloop/

《React 服务器组件是什么?》。React Server Components 是在服务器上渲染的 React 组件,旨在减少网络瀑布效应。与传统的服务器端渲染 (SSR)、并行获取和架构更改相比,Server Components 具有更好的用户体验、更快的构建速度和更易于维护的特点。Server Components 可以通过在 JS 和 HTML 中填充一些初始数据来减少客户端请求次数,而且这种方式可以嵌套使用,只需要向顶层组件和其子组件发出一次请求即可。Server Components 还可以减小 JS 包的大小,只发送必要的数据给客户端,从而提高性能。

https://www.viget.com/articles/what-even-are-react-server-components/

MDH 前端周刊第 99 期:jQuery 3.7、Vue 3.3、Deopt Explorer、粘性菜单、Remix、SSC

📒 Go语言爱好者周刊:第 186 期 — 可视化 Go 程序调用

· 24 min read
加菲猫

image

题图:rainy day, a water wheel in the green river, green plants and flowers in the foreground, mountains and water in the distance。

📒 一文通透讲解webpack5 module federation

⭐️ 一文搞懂Go错误链

📒 Webpack5构建性能优化:构建耗时从150s到60s再到10s | 京东云技术团队

📒 三十分钟掌握Webpack性能优化

⭐️ 不背锅运维相关文章

上篇:带你手工体验从写代码、编译、打包镜像、部署到K8S的全过程

下篇:使用jenkins发布go项目到k8s,接上篇的手工体验改造为自动化发布

值得收藏:K8S的kubectl常用命令已经按场景分好类,请您查阅

避坑:Go并发编程时,如何避免发生竞态条件和数据竞争

Go接口:运维开发场景中,go的接口到底怎么用

📒 Vue3.3 正式发布!

⭐️ 容器中如何正确配置 GOMAXPROCS

⭐️ Go项目组织:在单一repo中管理多个Go module指南

📒 React全新实验性Hooks:useOptimistic、useFormStatus

⭐️ Go 笔试 - 交叉顺序输出奇偶数

⭐️ zookeeper到nacos的迁移实践

⭐️ 「必知必会」 Nacos 的面试题和详解

⭐️ 使用增强版 singleflight 合并事件推送,效果炸裂!

singleflight 把每次请求定义为 call,每个 call 对象包含了一个 waitGroup,一个 val,即请求的返回值,一个 err,即请求返回的错误。

type call struct {
wg sync.WaitGroup
val interface{}
err error
}

再定义全局的 Group,包含一个互斥锁 Mutex,一个 key 为 string,value 为 call 的 map。

type Group struct {
mu sync.Mutex
m map[string]*call
}

Group 对象有一个 Do 方法,其第一个参数是 string 类型的 key,这个 key 也就是上面说的 map 的 key,相同的 key 标志着他们是相同的请求,只有相同的请求会被抑制;第二个参数是一个函数 fn,这个函数是真正要执行的函数,例如调用 MySQL;返回值比较好理解,即最终调用的返回值和错误信息。

func (g *Group) Do(key string, fn func() (interface{}, error)) (interface{}, error) {
// 懒加载方式初始化 map
// 注意 map 不是并发安全的,这里用了 Mutex 保护 map 操作
g.mu.Lock()
if g.m == nil {
g.m = make(map[string]*call)
}

// 如果当前 key 存在,即相同请求正在调用中,就等它完成
// 完成后直接使用它的 value 和 error
if c, ok := g.m[key]; ok {
g.mu.Unlock()
c.wg.Wait()
return c.val, c.err
}

// 如果当前 key 不存在,即没有相同请求正在调用中
// 就创建一个 call 对象,并把它放进 map
c := new(call)
c.wg.Add(1)
g.m[key] = c
g.mu.Unlock()

// 接着执行 fn 函数
c.val, c.err = fn()
// 函数执行完唤醒 waitGroup
c.wg.Done()

// 删除 map 相应的 key
g.mu.Lock()
delete(g.m, key)
g.mu.Unlock()

// 返回 value 和 error
return c.val, c.err
}

使用增强版 singleflight 合并事件推送,效果炸裂!

⭐️ Go 反射应用与三大定律

📒 Go1.20.4 新版本发布,修复了一个神奇的内联 BUG!

⭐️ sync.Cond 设计与实现

📒 React 正式推出 Canary 版本!

⭐️ 解读 pkg.go.dev 的设计和实现

解读 pkg.go.dev 的设计和实现:设计篇

本地搭建一个 pkg.go.dev:遇到的问题和解决

Go 开源的 pkgsite,据说是应届生代码水平

⭐️ Go语言中常见100问题-#34 Ignoring how the break statement works

⭐️ 「Go框架」bind函数:gin框架中是如何将请求数据映射到结构体的

⭐️ 「Go框架」深入解析gin中使用validator包对请求体进行验证

📒 Go 语言内置 I/O 多路复用机制

📒 图解TCP 三次握手和四次挥手的高频面试题(2023最新版)

⭐️ pkgsite 新增本地模式下的跳转与搜索功能

⭐️ Go 高性能 - 无锁编程

📒 MDH 前端周刊第 98 期:Angular 16、Vercel Storage、类型测试、React Canaries

  • React Native macOS v0.71 发布
  • Pnpm v8.4.0 发布,支持包校验等
  • React 发布 canary 版本
  • VSCode v1.78 发布,体验改善等
  • Nextjs v13.4 发布,App Router 稳定等

《Next.js 发布 13.4》。Next.js 13.4 是一个重要的版本,标志着 App Router 的稳定性。这个版本增加了许多新特性,包括 React Server Components、嵌套路由和布局、简化数据获取、流式渲染和 Suspense、内置 SEO 支持等。其中最重要的是 App Router,它是 Next.js 的核心组件,可以让开发者更方便地定义页面布局和数据获取方式。此外,Turbopack 也是一个值得关注的新功能,它可以加速本地开发和生产构建过程。最后,Server Actions 是一个实验性的功能,可以在服务器端直接修改数据,不需要客户端 JavaScript。

https://nextjs.org/blog/next-13-4

《使用 Vercel Spaces 实现规模化的高质量软件 - Vercel》。Vercel 推出了 Vercel Spaces,它提供了强大的工具和惯例,可以与 monorepo 集成,使开发人员能够在保持质量的同时有效地扩展。Spaces 仪表板提供了对开发工作流程、代码健康状况和构建日志的洞察力,并包括通过 Conformance、Code Owners 和 Vercel Runs 提升效率和消除障碍的新功能。

https://vercel.com/blog/vercel-spaces

《Tauri 发布 1.3.0》。Tauri 团队发布了 1.3 版本,包括安全改进、新功能和重要的错误修复。该版本新增了 NSIS,可以使用 NSIS 创建 Windows 应用程序安装程序,还有其他一些改进和修复。

https://tauri.app/blog/2023/05/03/tauri-1-3/

《TailwindCSS vs. UnoCSS》。本文对比了 TailwindCSS 和 UnoCSS 两个工具,总结了它们的特点、语言、文档、自定义样式和编辑器支持等方面。TailwindCSS 拥有完整的 CSS 特性类名,可以通过任意值、变体和属性来进行全面的样式设计,而 UnoCSS 则支持所有 TailwindCSS 的功能,并提供了一些额外的功能,如变体组、CSS 网格流体列和更多动画效果。在语言方面,TailwindCSS 有一个相对规范的类名命名方式,UnoCSS 则更加灵活。在文档和自定义样式方面,两者都有不错的表现,但 UnoCSS 的交互式文档和颜色提示更加出色。在编辑器支持方面,TailwindCSS 支持较好,但存在一些缺陷,而 UnoCSS 的高亮显示和颜色提示则更为出色。作者认为,如果你看重灵活性和额外的功能,你可能会喜欢 UnoCSS,但如果你看重约束和更清晰的编写语言,则应该选择 TailwindCSS。

https://dev.to/mapleleaf/tailwindcss-vs-unocss-2a53

《10 种使用 ChatGPT 学习更好的方法 - 斯科特・H・扬》。这篇文章总结了读者们如何使用大型语言模型(LLMs)来学习和研究的建议,并探讨了使用这些工具的优缺点。作者提醒读者要注意,虽然 ChatGPT 可以进行人类般的对话,但它并不是真正的人类,有时会提供错误的答案。然而,ChatGPT 在许多任务上都很有用,例如作为个人导师、语言教练、生成摘要、与长文本对话、简化专业术语等。作者还提到了一些不应该使用 AI 工具的情况,例如期望它们正确地获取事实、引用和数学等方面。

https://www.scotthyoung.com/blog/2023/05/02/chatgpt-learning-tips/

《React Canaries:在 Meta 之外启用增量功能发布》。React 团队推出了一个新的官方支持的 Canary 版本,让开发者可以在稳定版本发布之前就采用新功能。这个 Canary 版本只包含 React 团队相信已经准备好被采用的特性,而不像实验性版本那样可能会有重大变化。React 将按照 semver 规范每个稳定版本进行更新,同时也会在博客上发布 Canary 版本中的重大变更和新特性。Canary 版本需要被固定版本号,以避免包含重大变更。除此之外,React 的稳定版本不会有任何改变。

https://react.dev/blog/2023/05/03/react-canaries

《为什么我喜欢使用 Map(和 WeakMaps)来处理 DOM 节点》。本文介绍了在处理大量 DOM 节点时,Maps(和 WeakMaps)是特别有用的工具的原因。与使用对象作为键 / 值存储相比,使用 Map 可以更简单、更强大、更高效地管理状态,并且不需要设置或读取唯一属性。此外,Map 还具有自动垃圾回收的功能,可以更有效地管理内存。总之,Map 对于处理大量 DOM 节点非常有用。

https://www.macarthur.me/posts/maps-for-dom-nodes

《React Native macOS 发布 0.71》。React Native macOS 发布了 0.71 版本,这是该平台首次与 iOS、Android 和 Windows 保持同步。为了实现这个目标,开发团队不得不跳过了一些中间版本,并开始着手 0.72 版本。此外,该版本还加入了对 Fabric 的实验性支持,但需要注意的是这只是一个概念验证,存在不稳定性。

https://devblogs.microsoft.com/react-native/2023-04-27-announcing-macos-71/

《如何在 React 中编写注释:好的、坏的和丑陋的》。这篇文章介绍了在 React 中添加注释的三种方法。第一种是使用 JSX 注释语法,但这种方式有些冗长;第二种是在 JSX 标签外使用 JavaScript 注释,可以更简洁地添加注释;第三种是在 JSX 标签内部使用 JavaScript 注释,可以针对特定元素添加注释。作者认为第三种方法最好,因为它简洁明了且针对性强。

https://dmitripavlutin.com/react-comments/

《React Router 发布 v6.11.0》。这篇文章介绍了 React Router 版本 6.11.0 的更新内容。其中,一些小的改动包括在 useFetcher 中启用 basename 支持,更新 @remix-run/router 依赖等。此外,fetchers 不再在搜索参数更改或路由到相同 URL 时重新验证,并且只会在操作提交或 router.revalidate 调用时重新验证。

https://github.com/remix-run/react-router/releases/tag/react-router%406.11.0

《Prompt 工程 vs 盲目 Prompting》。本文介绍了 Prompt Engineering,即利用提示来有效地从语言模型中提取信息的过程,通常用于实际应用。文章指出,许多人声称正在进行 Prompt Engineering,但实际上只是盲目 Prompting。因此,本文提供了一种基于实验方法的 Prompt Engineering 示例,以展示如何为应用程序构建可靠的功能。作者强调了选择问题、演示集、提示候选项和测试提示等步骤的重要性,并解释了如何选择最终的提示方案。

https://mitchellh.com/writing/prompt-engineering-vs-blind-prompting

《使用 Rust 在 10 分钟或更短的时间内构建和部署 URL 缩短器》。这篇文章讲述了一个软件开发人员在凌晨时分突然想到的一个想法:能否在不需要担心基础架构的情况下快速构建一个有用的应用程序。他使用了 Rust 编程语言,结合 serverless 平台 Shuttle 和 Postgres 数据库,最终成功地构建了一个简单的 URL 缩短服务。作者认为,虽然现实中的软件工程很复杂,涉及到不同团队和技能集的协作,但这种新型的无需关注基础架构的开发模式是可行的,并且可以带来更好的体验。

https://www.shuttle.rs/blog/2022/03/13/url-shortener

《Vercel 发布 Vercel Storage》。Vercel 宣布了一套无服务器存储解决方案,包括 Vercel KV,一个无服务器的 Redis 解决方案;Vercel Postgres,一个为前端建立的无服务器SQL数据库;以及 Vercel Blob,一个在边缘上传和服务文件的解决方案。这些解决方案旨在使数据库成为 Vercel 前端云的一流部分,并使开发人员能够管理他们的前端存储需求,而不必担心基础设施。

https://vercel.com/blog/vercel-storage

《Deno 发布 KV》。Deno KV 是一款全球复制、强一致性的键值数据库,可在 35 个地区实现低延迟读取。它可以无缝集成到开源 Deno 运行时中,无需任何配置即可在本地或作为托管服务运行。Deno KV 是一个简单但功能强大的一流原语,只暴露了少量方法来存储、检索、删除和枚举数据。

https://deno.com/blog/kv

《React 渲染的交互式指南》。本文主要介绍了 React 的渲染机制,即 React 只有在状态改变时才会重新渲染组件。当事件处理程序被调用时,如果其中包含 useState 的更新函数,并且新状态与快照中的状态不同,React 将触发重新渲染。此外,本文还介绍了 React 的批处理算法和 StrictMode 组件。

https://ui.dev/why-react-renders

《如何使用 Rust 和 Napi RS 在 NodeJs 中将 CSV 文件处理速度提高五倍》。本文介绍了如何使用 Rust 和 Napi RS 在 NodeJs 中处理 CSV 文件。作者使用了 readline 模块来处理 CSV 文件,并记录了处理时间和吞吐量。然后作者使用了 Rust 编写了相同的代码,并通过 pv 命令进行了基准测试,发现 Rust 版本比 Nodejs 版本快五倍。最后,作者介绍了如何使用 Napi rs 将 Rust 代码编译成动态库,并在 Nodejs 中调用。总之,结合 Rust 和 Nodejs 可以实现更好的性能和效率。

https://www.alxolr.com/articles/how-to-process-a-csv-file-five-times-faster-in-node-js-with-rust-and-napi-rs

《实现 experimental_useFormStatus by acdlite・Pull Request #26722・facebook/react》。这篇文章介绍了一个新的 React Hook,可以读取其祖先表单组件的状态,用于实现加载指示器等功能。目前该 Hook 只在实验版本中可用,随着其稳定性的提高,将会发布更多 API 和文档。该 Hook 内部使用 startTransition 和上下文对象实现,但实际实现细节可能会发生变化。由于表单元素不能嵌套,因此实现者不需要跟踪多个嵌套的 “转换提供者”。虽然它使用通用的 Fiber 配置方法进行实现,但它目前仍基于 React DOM 的要求进行一些假设。

https://github.com/facebook/react/pull/26722

《我作为新经理所犯的一些错误》。这篇文章讲述了作者成为管理者的经历,以及他在这个过程中犯下的错误和解决策略。作者指出,作为一名管理者,最初的困难之一是难以确定自己的工作是否有用。他提供了三种应对策略:与上级领导沟通,寻求反馈,多元化生活体验。此外,作者还分享了其他的经验教训,如管理的重要性、任务相关成熟度、拖延维护、直接询问等。最后,作者总结了成为新管理者的困难所在,并鼓励读者不要害怕犯错,因为这是成长的必经之路。

https://www.benkuhn.net/newmgr/

《TypeScript 装饰器:完整指南》。本文介绍了 TypeScript 的装饰器,装饰器本质上是函数,可以用于给类、方法、属性等应用可重用的行为。不同类型的装饰器包括类装饰器、方法装饰器、属性装饰器、访问器装饰器和参数装饰器。装饰器可以用于实现各种功能,如前 / 后钩子、监视属性更改和方法调用、转换参数、自动序列化和反序列化、依赖注入等。使用装饰器的优点包括跨越关注点、依赖注入、验证和代码组织。

https://deadsimplechat.com/blog/typescript-decorators-a-complete-guide/

《批判性思维是软件工程师最重要的技能吗?》。这篇文章谈到了两个现象:技术术语的使用和 “思想领袖” 在社交媒体上的崛起,以及这些现象对批判性思维的影响。作者认为,过度使用技术术语可能掩盖了人们对某一概念的真正理解,而 “思想领袖” 的观点也不应该被轻易地接受,需要进行深入的研究和验证。作者建议人们提高批判性思维能力,包括理解技术术语、验证信息、问 “为什么” 和 “如何”,并避免跟风。最后,作者强调批判性思维将在未来变得越来越重要,因为随着人工智能工具的普及,我们需要更多的人来质疑和思考。

https://blog.pragmaticengineer.com/critical-thinking/

《不要 "闪烁" 的 UI:使用 useLayoutEffect,绘画和浏览器故事》。本文介绍了在 React 中如何根据 DOM 测量更改元素的基础知识。文章首先通过一个响应式导航组件的例子,讲解了如何使用 useEffect 来计算容器大小和每个元素的尺寸,并且根据这些信息来调整元素的数量。然而,这种方法会导致初始渲染时出现闪烁问题。为了解决这个问题,文章介绍了 useLayoutEffect 的用法,并解释了浏览器渲染、绘制和事件循环等相关概念。最后,文章还讨论了在 Next.js 等服务器端渲染框架中使用 useLayoutEffect 的问题。

https://www.developerway.com/posts/no-more-flickering-ui

《关于 LLM 的八件事 | Swizec Teller》。这篇文章总结了最近人工智能(AI)的进展和引起人们兴奋的原因。其中提到了以下几点:1. 大型语言模型(LLMs)随着规模的增大而变得更好;2.LLMs 具有出人意料的新颖能力,包括 few-shot 和上下文学习;3.LLMs 表现出 “心理模型”;4. 无法可靠地控制 LLMs;5. 目前还没有人知道 LLMs 是如何工作的;6.LLMs 可以胜过人类;7.LLMs 存在偏见问题;8.LLMs 表现很好。作者还提供了一些资源来帮助读者更深入地了解这些问题。

https://swizec.com/blog/eight-things-to-know-about-llms/

《Mojo 可能是数十年来最大的编程语言进步。》。文章介绍了一种名为 Mojo 的新编程语言,它是 Python 的超集,并且可以通过使用 “fn” 和 “struct” 等新语法来实现高性能代码。该语言建立在强大的基础上,包括 LLVM 和 MLIR 等核心技术,使其快速发展和易于开发。作者认为 Mojo 将成为 AI 模型开发的替代 Python 的重要工具,并且预计它将比预期更快地发展和扩展。

https://www.fast.ai/posts/2023-05-03-mojo-launch.html

MDH 前端周刊第 98 期:Angular 16、Vercel Storage、类型测试、React Canaries

📒 Go语言爱好者周刊:第 185 期 —— 归来了

Grafana Pyroscope 解决 Go 内存泄露。

https://grafana.com/blog/2023/04/19/how-to-troubleshoot-memory-leaks-in-go-with-grafana-pyroscope/

go-openai 1.9.1 发布 - OpenAI 的 Golang SDK,包括 ChatGPT、GPT-3、GPT-4 等。

https://github.com/sashabaranov/go-openai

queue - 线程安全、泛型的多队列实现(堵塞队列、优先队列、环形队列)。

https://github.com/adrianbrad/queue

Go Time 第 273 期 - Go 中使用领域驱动设计。

https://changelog.com/gotime/273

强大的装饰器模式。

https://www.youtube.com/watch?v=GipAZwKFgoA

Go语言爱好者周刊:第 185 期 —— 归来了

· 11 min read
加菲猫

⭐️ GMP 调度器(附录)- QA

⭐️ 前端工程化相关文章

一起来看看一个体系完善的前端React组件库是如何搭建出来的!

干货 | 耗时缩短2/3,Taro编译打包优化实践

干货 | 30+条业务线,携程微信小程序如何协同开发

干货 | 秒开率70%+,携程金融SSR应用性能监测与优化

干货 | 携程微信小程序如何进行Size治理

干货 | 携程小程序生态之Taro跨端解决方案

携程跨端解决方案的新选择:Taro-CRN

⭐️ LangChain 中文入门教程

LangChain 是一个用于开发由语言模型驱动的应用程序的框架,主要拥有「将 LLM 模型与外部数据源进行连接」「允许与 LLM 模型进行交互」这2个能力,已经在GitHub获得35K Star,并且快速迭代中。例如可以实现一些功能:

  • 对超长文本进行总结
  • 构建本地知识库问答机器人
  • 使用GPT3.5模型构建油管频道问答机器人

假如我们想要用 openai api 对一个段文本进行总结,我们通常的做法就是直接发给 api 让他总结。但是如果文本超过了 api 最大的 token 限制就会报错。

这时,我们一般会进行对文章进行分段,比如通过 tiktoken 计算并分割,然后将各段发送给 api 进行总结,最后将各段的总结再进行一个全部的总结。

如果,你用是 LangChain,他很好的帮我们处理了这个过程,使得我们编写代码变的非常简单。

from langchain.document_loaders import UnstructuredFileLoader
from langchain.chains.summarize import load_summarize_chain
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain import OpenAI

# 导入文本
loader = UnstructuredFileLoader("/content/sample_data/data/lg_test.txt")
# 将文本转成 Document 对象
document = loader.load()
print(f'documents:{len(document)}')

# 初始化文本分割器
text_splitter = RecursiveCharacterTextSplitter(
chunk_size = 500,
chunk_overlap = 0
)

# 切分文本
split_documents = text_splitter.split_documents(document)
print(f'documents:{len(split_documents)}')

# 加载 llm 模型
llm = OpenAI(model_name="text-davinci-003", max_tokens=1500)

# 创建总结链
chain = load_summarize_chain(llm, chain_type="refine", verbose=True)

# 执行总结链,(为了快速演示,只总结前5段)
chain.run(split_documents[:5])

参考:

https://github.com/liaokongVFX/LangChain-Chinese-Getting-Started-Guide

⭐️ 万字长文:LLM - 大语言模型发展简史

📒 Mojo 发布引出 Go 语言重大变革提案:用 .ʕ◔ϖ◔ʔ 替代 .go​

⭐️ Go:值与指针

⭐️ map 设计与实现(下篇)- 扩容和 QA

⭐️ Java与Go到底差别在哪,谁要被时代抛弃

📒 如何利用 IOC 改善工程设计:以 Eclipse Theia 为例

📒 TailwindCSS vs. UnoCSS

https://dev.to/mapleleaf/tailwindcss-vs-unocss-2a53

📒 React :新增实验性 API :useOptimisticState

https://github.com/facebook/react/pull/26740

⭐️ Go1.21 速览:过了一年半,slices、maps 泛型库终于要加入标准库

以下是社区提供的一个泛型快速 Demo,可以跟着思考运行一下,看看自己泛型的基本使用掌握的如何。

代码如下:

package main

import "fmt"

func MapKeys[K comparable, V any](m map[K]V) []K {
r := make([]K, 0, len(m))
for k := range m {
r = append(r, k)
}
return r
}

type List[T any] struct {
head, tail *element[T]
}

type element[T any] struct {
next *element[T]
val T
}

func (lst *List[T]) Push(v T) {
if lst.tail == nil {
lst.head = &element[T]{val: v}
lst.tail = lst.head
} else {
lst.tail.next = &element[T]{val: v}
lst.tail = lst.tail.next
}
}

func (lst *List[T]) GetAll() []T {
var elems []T
for e := lst.head; e != nil; e = e.next {
elems = append(elems, e.val)
}
return elems
}

func main() {
var m = map[int]string{1: "2", 2: "4", 4: "8"}

fmt.Println("keys:", MapKeys(m))

_ = MapKeys[int, string](m)

lst := List[int]{}
lst.Push(10)
lst.Push(13)
lst.Push(23)
fmt.Println("list:", lst.GetAll())
}

注意 map 遍历顺序是不可预测的

Go1.21 速览:过了一年半,slices、maps 泛型库终于要加入标准库

⭐️ map 设计与实现(上篇)- 数据结构

📒 Next.js 项目参考

https://github.com/okisdev/ChatChat

📒 通过实现一个简易版 react-redux ,我更理解了!

⭐️ Go设计模式--命令模式

📒 TypeScript 前端工程最佳实践

📒 2023年谈谈前端代码加密与混淆

为啥最近突然需要关注这个:

  • Chrome 110 开始默认对源文件 pretty prints,降低用户调试难度(可以直接打断点);
  • 混淆压缩后的代码,即使 pretty prints 也需要对 Webpack 代码打包、Babel 转译、Terser 压缩非常熟悉,才能转换出源代码,对于普通开发者来说破解难度仍然很大。但是现在可以借助 AI 手段,AI 介入解释代码,加速代码反编译进程,源文件放入 chatgpt 进行释义,降低了破解难度。

前端代码安全与混淆

https://developer.chrome.com/blog/new-in-devtools-110/

📒 相关文章汇总

强大的基于 Web 的 3D 框架 v6.0 版本发布 — Babylon.js 仍然是世界领先的基于 WebGL 的图形引擎之一,具有可视化场景构建器和最佳的基于物理的渲染。v6.0 版本包括具有大量文档和 演示 的 新物理插件、流体渲染、对 反射 处理的重大改进、屏幕阅读器支持 等等。这是 JavaScript 生态系统中一个重大发布,我们无法详细描述,但是在 官网 上有更多内容。

https://doc.babylonjs.com/features/featuresDeepDive/physics/rigidBodies

事实证明,连任天堂也在使用 JavaScript。一位开发者发现,2015 年的 Wii U 和 3DS 上的 Mario vs. Donkey Kong: Tipping Stars 是用 HTML 和 JavaScript 作为底层编写的,他还设法构建了一个 shim,让它可以在正常的浏览器中运行。

https://twitter.com/JasperRLZ/status/1648046875675856897

Chrome 113 的 DevTools 将允许你覆盖网络响应头,包括 CORS 头。它还提供 Nuxt、Vite 和 Rollup 调试改进。

https://developer.chrome.com/blog/new-in-devtools-113/

从 webpack + babel 切换到 rspack,我们的构建时间减少了 85%。

https://twitter.com/shawnrmcknight/status/1651275500118065175

探索 Web Workers 在网页多线程中的潜力 — 这篇文章探讨了 Web Workers 在浏览器中多线程的重要性,包括使用它们的局限性和考虑因素,以及缓解与它们相关的潜在问题的策略。

https://www.smashingmagazine.com/2023/04/potential-web-workers-multithreading-web/

使用 Fuse.js 进行快速便捷的模糊搜索 — Fuse.js 是一个零依赖的模糊搜索库,您可以使用它在浏览器中提供搜索功能,而无需专门的面向搜索的后端。

https://spin.atomicobject.com/2023/04/27/fuse-js-fuzzy-search/

在 React 中如何编写注释:好的、坏的和丑陋的风格 — {/* 像这样编写注释 */} 是在 JSX 中编写注释的常见方法,但还有另外两种方法你也应该知道。

https://dmitripavlutin.com/react-comments/

React Router 6 的九小时探究 — 来自 Scrimba 的 Bob Ziroll 为我们呈现了一个基于 React Router 的应用程序的开发全过程,完整观看需要较长时间,但它是免费的。

https://www.youtube.com/watch?v=nDGA3km5He4

Create React App 的现代替代方案 — create-react-app 曾经是构建单页 React 应用程序的首选工具,但是这篇文章介绍了现在常用的各种替代方案。(我们支持 Vite!)

https://codingpastor.dev/goodbye-create-react-app-a-new-approach

使用 React Server Components 在博客上显示访问计数器 — 使用 React Server Components 在博客上显示访问计数器 — 听说过 React Server Components,但还没有机会尝试?这篇简明教程使用一个常见且易于理解的用例来试用 RSC。此外,它还让我们想起了 90 年代,这永远是一个好的氛围。

https://scastiel.dev/view-counter-react-server-components

使用 Zustand 简化 React 状态管理 — Zustand 是一个简单且不冗长的 Redux 替代品,Niklas Ziermann 在 YouTube 上进行了全面介绍(75 分钟)。

https://www.youtube.com/watch?v=fZPgBnL2x-Q

使用 Tauri 和 React 构建笔记应用程序 — Tauri 是一个基于 Rust 的框架,用于构建桌面应用程序。

https://betterprogramming.pub/building-cross-platform-desktop-applications-with-tauri-part-ii-8d6ad1927093?gi=2e3c50c25e6c

使用 Rust 和 NAPI-RS 在 Node 中快速处理 CSV 文件 — NAPI-RS 是一个用于在 Rust 中构建预编译的 Node.js 插件的框架。本文探讨了如何将其用于实际用途,即能够以高性能处理 CSV 数据。

https://www.alxolr.com/articles/how-to-process-a-csv-file-five-times-faster-in-node-js-with-rust-and-napi-rs

使用 Node 和 Connect 构建现代 gRPC 微服务 — 这篇有趣的教程深入探讨了 Dopt 工程师如何使用 Node 和 Connect 构建 gRPC 驱动的内部微服务。这是一篇基于真实的、生产级别的经验的教程。

https://blog.dopt.com/building-a-modern-grpc-powered-microservice

剖析 npm 恶意软件:五个软件包及其邪恶的安装脚本 — npm 相关的安全问题仍然是一个大话题,而一个常见的安全漏洞是在安装包时运行的安装脚本。

https://blog.sandworm.dev/dissecting-npm-malware-five-packages-and-their-evil-install-scripts

· 12 min read
加菲猫

📒 写给开发同学AI强化学习入门指南

📒 TypeScript 5.1 beta 发布:函数返回值类型优化、Getter/Setter 类型优化、JSX 增强

📒 TypeScript 5.0 beta 发布:新版 ES 装饰器、泛型参数的常量修饰、枚举增强等

📒 TypeScript 4.9 beta 发布:鸽置的 ES 装饰器、satisfies 操作符、类型收窄增强、单文件级别配置等

📒 ES2020 可选链语法一个注意点

ES2020 中的可选链语法可以安全访问对象中的属性:

obj?.prop       // optional static property access
obj?.[expr] // optional dynamic property access
func?.(...args) // optional function or method call

实际开发中的示例如下:

import * as React from "react";

const { useCallback } = React;

type IProps = {
value?: string;
onChange?: (value: string) => void;
}

const Comp: React.FC<IProps> = ({ value, onChange }) => {
const handleChange = useCallback((val: string) => {
// 调用 `onChange` 需要可选链语法
onChange?.(val);
}, []);

const resolvedValue = value || "";

return (
<LayoutWrapper
value={resolvedValue}
onChange={handleChange}
/>
)
}

最近看到同事写的代码用到可选链,结果报错了:

// ❎ Invalid left-hand side in assignment expression.
document.querySelector(".content-main")?.style.display = "block";

但是以上代码,如果不用可选链则可以正常赋值:

// ✅ Correct
document.querySelector(".content-main").style.display = "block";

我们可以看下 Babel 编译的结果:

// 源码
document.querySelector(".content-main")?.style.display;

// 编译结果
var _document$querySelect;
(_document$querySelect = document.querySelector(".content-main")) === null ||
_document$querySelect === void 0
? void 0
: _document$querySelect.style.display;

document.querySelector(".content-main") 返回的值不为 null 的时候,此时原始表达式可以正常访问,也可以进行赋值。但问题就在于 document.querySelector(".content-main") 返回值为 null 的时候,可选链语法会将整个表达式的值转为 undefined,此时如果再赋值就相当于给 undefined 赋值,这个行为显然是不符合预期的。因此,需要注意,可选链语法只能访问对象属性,不能进行赋值。

顺便再提两个可选链语法的细节:1)为啥用一个 _document$querySelect 临时变量缓存 ?. 前面的执行结果,答案是为了避免对象属性重复访问、方法重新调用等,可以提升性能,2)为啥用 void 0 代替 undefined,个人猜测是为了更好的语义性,因为 undefined = "aaa"; 这个赋值虽然无效,但是在非严格模式下不会报错,因为 undefined 实际上是 window 对象上的只读属性,而 void 0 = "aaa"; 这句即使非严格模式也会报错。

参考:

https://babeljs.io/docs/babel-plugin-proposal-optional-chaining

https://github.com/tc39/proposal-optional-chaining

📒 【第2929期】React Refs: 从访问 DOM 到命令式 API

⭐️ GMP 调度器(下篇)- 线程

⭐️ 并发编程-信号量的使用方法和其实现原理

⭐️ 并发编程--用SingleFlight合并重复请求

⭐️ Go的atomic.Value为什么不加锁也能保证数据线程安全

⭐️ Golang 五种原子性操作的用法详解

⭐️ Webpack4的压缩阶段的性能优化和踩坑

⭐️ GMP 调度器(中篇)- 算法

⭐️ 快速上手 Go CGO,掌握在 Go 里写 C!

📒 在 Git 中撤消更改的 6 种方法!

⭐️ Go 1.21新特性前瞻

📒 一个低代码拖拽的表单编辑器,开源咯!!!

⭐️ GMP 调度器(上篇)- 数据结构

⭐️ Go pprof 相关

Go 服务自动收集线上问题现场

go pprof实战

生产环境Go程序内存泄露,用pprof如何快速定位

⭐️ 为什么 recover 必须在 defer 中调用

📒 React 相关汇总

Awesome React:近 500 个 React 项目和资源 — 这是一个与 React 生态系统相关,经常更新且深入的文章和资源集合。

https://github.com/enaqx/awesome-react

Storybook v7.0 发布 — 几周前发布了 v7.0 版本,但官方博文直到上周才发布。无论如何,对于这个受欢迎的组件开发工具来说,这是一个重要的版本更新,现在包括一流的 Vite 支持、对 Next.js 和 SvelteKit 的零配置支持、焕然一新的 UI 等更多功能。

https://storybook.js.org/blog/storybook-7-0/

必须知道的 React 可移植性模式 — 采用这些模式有助于避免“元框架锁定”,如果你选择的工具发生了你不喜欢的演变,你就不会被束缚。

https://www.youtube.com/watch?v=yi8UCnXPu8U

使用 React Hook Form 实现高级多步表单

https://claritydev.net/blog/advanced-multistep-forms-with-react

next-route-visualizer: 将 Next.js v13+ 应用路由结构树形可视化 — 一款用于可视化 Next.js 应用目录路由的软件包,该软件包的功能可以参考这个 演示。

https://github.com/DiiiaZoTe/next-route-visualizer

Simple Light v2.0: 一款用 Tailwind CSS 和 React 实现的落地页模版 — 旨在为开发人员提供创建面向 SaaS 产品、在线服务等落地页所需的所有基本组件。

https://github.com/cruip/tailwind-landing-page-template

📒 一文教你搞定所有前端鉴权与后端鉴权方案,让你不再迷惘

📒 protoc 插件-protoc-gen-grpc-gateway-gosdk

⭐️ 为什么 defer 的执行顺序和注册顺序不同

📒 MDH 前端周刊第 97 期:Vite 4.3、Node 20、pretty-ts-errors、React Query 5

《发布 v5.80.0・webpack/webpack》。Webpack v5.80.0 的新增功能包括支持在 import.meta 中使用解构赋值、支持带有 AwaitExpression 的解构赋值的树摇、引入 errorsSpace 和 warningsSpace 以获得更可读的跟踪信息等。Bug 修复主要涉及 CSS 相关问题、语法错误、模块 ID 分配等。

https://github.com/webpack/webpack/releases/tag/v5.80.0

《Deno vs. Node:没有人准备好迎接这个变化 | .cult by Honeypot》。本文介绍了 Node.js 和 Deno 两个 JavaScript 运行环境的比较。Node.js 是一个流行的服务器端、开源、跨平台的 JavaScript 运行环境,自 2009 年以来一直占据着 Web 开发世界的主导地位。相比之下,Deno 在设计上有所改进,提供了更安全的框架和现代特性,由 Node.js 的创始人 Ryan Dahl 推出。然而,尽管 Deno 解决了 Node.js 的一些设计缺陷,但采用 Deno 的速度非常缓慢,大多数开发人员仍然满意于 Node.js。本文将探讨这种现象背后的原因,并对 Node.js 和 Deno 进行比较,从第三方包管理、API、安全性和 TypeScript 支持等方面进行分析。

https://cult.honeypot.io/reads/deno-vs-node-main-differences/

《发布 Vite 4.3。》。Vite 4.3 发布,主要改进了开发服务器的性能。该版本优化了解析逻辑,改进了热路径,并实现了智能缓存,以查找 package.json、TS 配置文件和已解决的 URL。此外,该团队正在开发一个官方基准测试工具,以获取每个 Pull Request 的性能指标,并通过 vite-plugin-inspect 提供更多的性能相关功能来帮助用户识别应用程序的瓶颈。明年他们将发布 Vite 5,这将是今年唯一的 Vite 主要版本,同时也会放弃对 Node.js 14 和 16 的支持。

https://vitejs.dev/blog/announcing-vite4-3.html

《我们如何让 Vite 4.3 更快》。这篇文章介绍了 Vite 4.3 是如何通过优化解析策略、使用异步函数、并行处理和 JavaScript 优化等方式来提高性能的。

https://sun0day.github.io/blog/vite/why-vite4_3-is-faster.html

《用 Next.js 13 和 React Server Components 建立博客》。本文介绍了如何使用 Next.js 13 和 React Server Components 构建博客,并提供了实际示例。文章包括设置项目、文件结构、动态路由、获取和呈现 Markdown、SEO、部署等内容。作者还介绍了如何使用 next-mdx-remote 和 Bright 进行语法高亮。本文旨在帮助读者快速搭建自己的博客,并鼓励读者进行自己的实验和探索。

https://maxleiter.com/blog/build-a-blog-with-nextjs-13

《发布 TypeScript 5.1 Beta - TypeScript。》。TypeScript 5.1 测试版已经发布,其特点是未定义返回函数的隐式返回更容易,以及 getters 和 setters 的非相关类型。该版本还包括 JJSX 元素和 JJSX 标签类型之间的解耦类型检查、命名的 JJSX 属性以及同时自动编辑多个位置的能力。TypeScript 现在在 TypeScript 和 JavaScript 文件中键入 @param 标签时提供片段补全。

https://devblogs.microsoft.com/typescript/announcing-typescript-5-1-beta/

《GitHub - yoavbls/pretty-ts-errors:在 VSCode 中使 TypeScript 错误更漂亮和易读》。这是一个名为“Pretty TypeScript Errors”的Visual Studio Code扩展,旨在让TypeScript错误变得更加美观和易于阅读。当类型的复杂性增加时,TypeScript错误会变得越来越混乱。这个扩展能帮助您更好地理解错误信息。主要功能包括:为错误信息中的类型提供语法高亮,支持深色和浅色主题;在错误信息中的类型旁边提供一个按钮,可以跳转到相关类型声明;提供一个按钮,可以将您导航到typescript.tv,那里有详细的解释,有时还有视频;提供一个按钮,可以将您导航到ts-error-translator,那里可以用简单的英语阅读错误。

https://github.com/yoavbls/pretty-ts-errors

《ECMAScript 2023 有什么新特性 | pawelgrzybek.com》。JavaScript 的新功能列表已经确定,最终版本的 ECMAScript 规范预计将于 6 月底发布。这些新功能包括在 Array 和 TypedArray 原型上添加 findLast() 和 findLastIndex() 方法、标准化 Hashbang 语法、允许使用符号作为 WeakMap 键以及在 Array.prototype 上添加返回新副本的方法等。这些功能都已达到第 4 阶段,并预计将包含在即将发布的 ECMAScript 版本中。

https://pawelgrzybek.com/whats-new-in-ecmascript-2023/

MDH 前端周刊第 97 期:Vite 4.3、Node 20、pretty-ts-errors、React Query 5

· 11 min read
加菲猫

image

题图:rainy day, a water wheel in the green river, green plants and flowers in the foreground, mountains and water in the distance。

📒 【第2924期】如何在 Gitlab 中使用 ChatGPT 进行 CodeReview

📒 「Go框架」深入理解gin框中Context的Request和Writer对象

📒 聊聊React中的隐藏彩蛋功能

⭐️ Go内存分配与逃逸分析

一文详解Go内存分配与逃逸分析

Go 为什么性能高? 一文带你了解“逃逸分析”

先聊聊「内存分配」,再聊聊Go的「逃逸分析」

「刷起来」Go必看的进阶面试题详解

Go内存分配和逃逸分析-实践总结篇

通过实例理解Go逃逸分析

『每周译Go』Go如何做逃逸分析

📒 给想玩AI的新手|Stable Diffusion 保姆级入门手册

⭐️ Go 方法接收器:选择值接收器还是指针接收器

⭐️ Go 内存模型

Go 内存模型

Happens before 原则在 Go 内存模型中的应用举例

『每周译Go』更新Go内存模型

参考:

https://go.dev/ref/mem

https://research.swtch.com/gomm

⭐️ sync.RWMutex 设计与实现

⭐️ Go 单元测测时尽量用 fake object

📒 定制自己的文档问答机器人

⭐️ Go语言中常见100问题-#33 Making wrong assumptions during map iterations

📒 我把我的简历丢给chatGPT,他问了我这些问题

⭐️ sync.Mutex 设计与实现

📒 React的并发悖论

📒 How I improve my skills in Typescript #2 : Mapped Type

📒 TypeScript 4.9 satisfies

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-9.html#the-satisfies-operator

# TypeScript 4.9: satisfies operator

# Typescript’s new ‘satisfies’ operator

⭐️ Go语言中常见100问题-#72 Forgetting about sync.Cond

⭐️ Golang package sync 剖析(二): sync.WaitGroup

⭐️ Golang package sync 剖析(三):sync.Cond

⭐️ Golang package sync 剖析(四):sync.Map

⭐️ Golang语言标准库 sync 包的 Cond 怎么使用

⭐️ Go标准库sync.Cond详解 | Gopher Daily (2021.04.13) ʕ◔ϖ◔

⭐️ sync.WaitGroup 设计与实现

📒 实践指南-前端性能提升 270%

⭐️ Bytes 发布 React, Visualized 教程

⭐️ Mastering React: Techniques to Take Your UI to the Next Level

⭐️ Go 语言中没有枚举类型,但是我们可以这样做

📒 React Query 完全指南,时下最热辣的请求库!

📒 React 中文周刊 #136 - “forwardRef()”: 如何将 ref 传给子组件

📒 gin框架中如何让日志文字带颜色输出

⭐️ sync/atomic 设计与实现

⭐️ 理解unsafe-assume-no-moving-gc包

📒 做量化交易发愁写代码?一招教你白嫖GPT智能编程神器(重制版)

📒 Uber实践:运维大型分布式系统的一些心得

📒 Go 语言怎么通过通信共享内存

⭐️ Go设计模式--备忘录模式,带暂存的业务功能可以参考它来实现

📒 一文带你快速入门TLS/SSL

⭐️ Go 汇编语言快速入门

📒 MDH 前端周刊第 96 期:lazyrepo、CodeWhisperer、taxonomy、WP Playground、MVP

《GitHub - ds300/lazyrepo: 用于 npm/pnpm/yarn monorepos 的缓存任务运行器。》。lazyrepo 是一个针对 npm/pnpm/yarn monorepos 的零配置缓存任务运行器。它适合于 turborepo 所开创的领域:使 package.json “scripts” 扩展,而无需采用像 nx、bazel、rush 或 buck 这样的大型工业级构建系统。lazyrepo 非常快速,尽管它是用 TypeScript 编写而不是一些年轻、英俊、聪明、有趣的系统语言,但它比 turborepo 要快得多。

https://github.com/ds300/lazyrepo

《ChatGPT 的工作原理:深入探究 | Dan Hollick 🇿🇦》。本文介绍了大型语言模型 ChatGPT 的工作原理。这些模型通过计算输入和输出之间的概率来预测下一个单词或符号。为了实现这一点,它们使用神经网络来处理输入并生成输出的概率。在简单的情况下,神经网络由输入层、隐藏层和输出层组成,其中每个神经元都与相邻层中的神经元相连,并具有一个权重。当输入值通过神经元时,它会乘以该神经元的权重,并将结果传递给下一层中的所有神经元。然后,神经元将这些值相加,并将结果压缩到 - 1 到 1 之间,并将其传递给下一层中的每个神经元。最后一个隐藏层的神经元也是如此,但是将值压缩到 0 到 1 之间,并将其传递到输出层。

https://typefully.com/DanHollick/yA3ppZC

《在页面退出时显示未保存的表单数据警告。》。本文介绍了如何实现一个 FormPrompt 组件,以提高 Web 应用程序的用户体验。该组件可以在用户尝试离开具有未保存更改的页面时发出警告。作者讨论了使用纯 JavaScript 的 beforeunload 事件处理此类情况,以及使用 React Router v5 中的 Prompt 组件和 React Router v6 中的 useBeforeUnload 和 unstable_useBlocker 钩子的 React 特定解决方案。

https://claritydev.net/blog/display-warning-for-unsaved-form-data-on-page-exit

《Amazon CodeWhisperer,个人免费使用,现已普遍提供 | Amazon Web Services》。Amazon CodeWhisperer 是一款实时 AI 编码助手,现已正式推出。它可以帮助开发人员快速、安全地编写代码,而无需离开他们的 IDE 进行研究。CodeWhisperer 可以在多个 IDE 中使用,包括 Visual Studio Code、IntelliJ IDEA 等,并支持 Python、Java、JavaScript、TypeScript 和 C# 等多种语言。此外,它还具有筛选可能被认为是有偏见或不公平的代码建议的功能,以及扫描生成和开发人员编写的代码以查找难以检测的漏洞并提供修复建议的安全扫描功能。CodeWhisperer 的个人版免费使用,可通过电子邮件注册。专业版则提供了更多的管理功能和安全扫描限制。

https://aws.amazon.com/blogs/aws/amazon-codewhisperer-free-for-individual-use-is-now-generally-available/

《用 LLM 替换我的最好的朋友,训练了 50 万个群聊消息》。作者用一个大型语言模型训练了他和他的好友们在大学时期使用的聊天记录,并通过 Modal 和 Hex 完成了这个项目。作者将原始聊天数据转换成了可供微调的格式,然后使用 LLaMa 进行微调。最终,作者将模型部署到了 Modal 上,并建立了一个类似于 iMessage 的前端界面,使得所有人都可以与 “机器人男孩” 聊天。作者强烈鼓励大家尝试这种无聊但复杂的 AI 项目,因为它是一个入门级别的 AI 项目,可以让你更深入地了解 LLMs 以及如何针对特定场景进行微调。

https://www.izzy.co/blogs/robo-boys.html

《RFC:next/third-parties・vercel/next.js・讨论 #48256》。Next.js 计划推出 next/third-parties 包,以简化开发人员在应用程序中加载流行第三方库的体验。该包将提供预配置的包装器组件,以确保流行的第三方资源能够高效加载,并随着最佳实践的演变而持续高效。为了避免增加 Next.js 的安装 / 包大小,这个包可以单独存在于核心 next 库之外,但仍然在同一个 monorepo 中。此外,Next.js 还将考虑支持其他流行的第三方库,例如 Sentry、DataDog 和 Facebook Pixel。

https://github.com/vercel/next.js/discussions/48256

《有两种类型的软件工程师》。这篇文章探讨了两种软件工程师的思维方式。第一种类型认为问题很容易解决,只需要要求人们做 X 即可。而第二种类型则认为问题很难解决,因为它需要人们去做 X。第一种类型认为只要不是技术问题就很容易解决,因为 “我们可以要求人们做 X”。而第二种类型则认为这很难,因为它不是技术问题。作者称第一种类型的工程师相信大写字母 E 的工程学,认为存在着冷酷、坚实的真理;有数学和物理;是应用科学。而第二种类型的工程师则更注重人,他们知道在所有的工程工作(和问题)中,人是核心所在。他们接受了事情变得混乱的事实,并迎接了一个更大的挑战,尽管这会带来混乱,但仍然要做出有价值和有影响力的工作。

https://registerspill.thorstenball.com/p/two-types-of-software-engineers

《最有价值程序员》。本文讨论了成为最有价值的程序员(MVP)的概念。与 “最小可行产品” 类似,MVP 并不是一个具体的概念,而是一个追求的目标。这篇文章提供了一些建议,帮助程序员成为更有价值的人,包括不要过度关注代码风格、正确性、DRY 和性能,而是关注业务需求、解决问题以及与同事沟通。此外,作者还提到了保持身心健康的重要性,因为只有这样才能保持高效率和创造力。

https://arendjr.nl/2023/04/mvp-the-most-valuable-programmer

MDH 前端周刊第 96 期:lazyrepo、CodeWhisperer、taxonomy、WP Playground、MVP

· 9 min read
加菲猫

image

题图:an asian city, in the style of japanese traditional art influence。

⭐️ Go 1.20.3 又是一堆安全问题,我们还是抽空更新一下吧

⭐️ 技术文章配图指南

📒 2023 年如何搭建新的 React 项目

1、create-next-app

$ pnpm create next-app@latest nextjs-app

2、create-t3-app

了解了下 T3 App 架构。T3 App 是一套全栈的技术栈,一个脚手架,包含客户端的 Next.js、Tailwind,服务端的 Prisma、Next Auth,API 侧的 tRPC。主打类型安全,所以 T3 的 T 即 Typed(类型安全)。3 个 T 分别是 React 前端、数据库客户端和 API 调用端的类型安全。

image

T3 App 的 3 个理念值得学习。1)解决问题,不添加「所有」东西,只加能解决问题的技术,2)负责任的做技术革新,在风险小的地方使用风险大的技术,3)类型安全不是可用可无,因为可以提高生产力和减少错误发生。

全栈技术栈除了 T3 App,还有其他选择,见下图。图中有个变化是 Bison 也将切换 GraphQL 到 tRPC,他们还写了文章介绍他们《为啥舍弃 GraphQL 而选择 tRPC》(Why we ditched GraphQL for tRPC),主要原因是,1)可以少写一半的样板代码,2)避免不必要的代码生成,tRPC 基于类型推导,3)Client 包尺寸,GraphQL 是 tRPC 的 3.5 倍,4)tRPC 可结合 React Query 使用,Apollo 搞不太好的缓存啥的都属于基础功能。

image

tRPC 发布 10,似乎正在成为越来越多人的选择,不仅是 T3 App 技术栈的选择,同时 Bison 团队也写了文章介绍他们《为啥舍弃 GraphQL 而选择 tRPC》

Tailwind 其实不是类型安全的,需要借助编辑器辅助。比如 VSCode 要装 Tailwind CSS IntelliSense,WebStorm 则是内置支持。

NextAuth 内置的是 Discord 登录,因为配置最简单,只要在 .env 里提供 token 即可,也可稍做配置切换到 github、twitter、google 等登录方式。

部署时可以把数据库部署到 Railway 或 PlanetScale,然后把其余部分部署到 Vercel、Railway、Render 或 Fly。Vercel 虽然部署起来简单,但缺点也很明显,问题是在 Lambda 函数里跑 Prisma 会有明显的冷启动时间,性能不太好。

本地实操跑了个 Blog 的 CURD + 部署流程,部署到 Railway 的 postgresql 数据库和 Vercel 的前端,一切顺利。

文档中的「其他推荐」也值得一看,包括数据流、组件库、动画、部署和基础设施、统计等维度的推荐。

$ pnpm create t3-app@latest

参考:

Create T3 App

GitHub - t3-oss/create-t3-app: The best way to sta...

https://dev.to/ajcwebdev/a-first-look-at-create-t3...

Prisma | Next-generation ORM for Node.js & TypeScr...

Railway

Why we ditched GraphQL for tRPC

📒 webpack核心模块tapable源码解析

📒 速度提高几百倍,记一次数据结构在实际工作中的运用

📒 如何终止某个端口运行的进程

发现 VS Code 有个 bug,终端结束 Next.js 服务(在 3000 端口运行)之后再启动,此时发现 3000 端口被占用了,自动改成 3001 端口,说明原先 Next.js 进程还在继续跑。

可以用 lsof -i 命令查看某个端口正在运行的进程 ID:

$ lsof -i :3000

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 61440 garfield 21u IPv6 0x44c3c99e2d153375 0t0 TCP *:hbci (LISTEN)

找到 PID 之后,用 kill 命令终止进程:

$ kill 61440

📒 我问了鹅厂程序员:你们工作中怎么用ChatGPT?如何高效Prompt

⭐️ singleflight 设计与实现

📒 🤩 如何解决 SVG 图片中字体失效的问题

⭐️ Go sync.Once:简约而不简单的并发利器

📒 React 中文周刊 #135 - Dan Abramov 探索 React 服务端组件

⭐️ Go 环境变量 - GODEBUG 详解

📒 2023再谈前端状态管理

📒 Vite 4.3 性能大幅提升!

📒 前端食堂技术周刊第 78 期:WebGPU、Astro 2.2、Node.js 事件循环可视化指南、实用 Web API 规范

📒 useState与useReducer性能居然有区别

⭐️ Go语言中常见100问题-#32 Ignoring the impact of using pointer ...

📒 mysql的varchar字段最大长度真的是65535吗?

📒 几个你不知道却非常实用的JavaScript APIs

⭐️ Go设计模式--访客模式

⭐️ Go 语言 15 个内置函数详解

⭐️ GoLand 2023.1 正式发布,看有哪些新功能

📒 MDH 前端周刊第 95 期:-10x 工程师、Next.js、WebGPU、Chakra UI、写作

  • Vercel Edge Config 已普遍可用。
  • Nextjs v13.3 发布,新路由约定等。
  • Vite v4.3 比 Turbopack 启动快。

《如何成为一名 -10x 工程师》。本文指出,虽然 “10 倍工程师” 可能是神话,但确实存在 “-10 倍工程师”。为了成为一名 “-10 倍工程师”,可以采用以下策略:使 10 个工程师的输出无效;尽可能在开发过程中更改需求以避免责任;创建 400 小时的忙碌工作;让团队执行类似于工作的任务;创建毫无意义的仪式等。此外,还可以浪费 400 小时的编译 / 构建时间,编写毫无意义的测试,将 10 个工程师困在技术讨论中等等。

https://taylor.town/-10x

《程序员被打断:中断和上下文切换的真正成本》。编程中的中断和上下文切换是直接影响程序员日常生产力的两个最昂贵因素。虽然没有永久避免它们的方法,但有一些有趣的策略可以最小化它们的影响。根据各种科学研究,经过中断后需要至少 10-15 分钟才能重新进入 “区域”(Parnin:10,vanSolingen:98)。基于任务的复杂性和你的精神能量,肯定需要更多的时间。当你有很多未完成的代码时,中断发生时,返回到流状态可能会更具挑战性。

https://contextkeeper.io/blog/the-real-cost-of-an-interruption-and-context-switching/

《Next.js 13.3》。Next.js 13.3 发布,新增了社区请求的流行功能,包括:基于文件的元数据 API、动态 Open Graph 图像、应用程序路由器的静态导出、并行路由和拦截等。其中,基于文件的元数据 API 可以方便地自定义页面以改善 SEO 和 Web 共享;动态 Open Graph 图像可以使用 JSX、HTML 和 CSS 生成 OG 图像;应用程序路由器的静态导出支持完全静态导出,可避免在客户端加载不必要的 JavaScript 代码,减小捆绑大小并实现更快的页面加载;并行路由和拦截可以同时在同一视图中呈现一个或多个页面,如复杂的仪表板或模态框。

https://nextjs.org/blog/next-13-3

《从 Webpack 迁移到 Remix》。Remix 宣布推出基于 Webpack 的编译器和开发服务器,以帮助使用 Webpack 的应用程序逐步迁移到 Remix。这个版本可以让用户从第一天开始使用所有的 Webpack 加载器和插件,并逐渐将每个路由迁移到 Remix。Remix 还提供了一个迁移指南,以帮助 Webpack 用户更容易地进行迁移。

https://remix.run/blog/migrate-from-webpack

MDH 前端周刊第 95 期:-10x 工程师、Next.js、WebGPU、Chakra UI、写作

· 9 min read
加菲猫

image

题图:Cute and adorable cartoon Korean girl, along side pet。

⭐️ Go RWMutex:高并发读多写少场景下的性能优化利器

⭐️ Go Mutex:保护并发访问共享资源的利器

⭐️ 学会 Go select 语句,轻松实现高效并发

⭐️ Go 编译器优化

⭐️ 从.go文本文件到可执行文件

📒 深入浅出 Kubernetes Pod 实现原理

⭐️ fasthttp 为什么比标准库快 10 倍

📒 为什么 Python、Go 和 Rust 都不支持三元运算符

为什么 Python、Go 和 Rust 都不支持三元运算符

https://go.dev/doc/faq#Does_Go_have_a_ternary_form

⭐️ 深入探索Go语言的unsafe包,揭秘它的黑科技和应用场景!

⭐️ 从零到一实现 Rust 的 channel 并发处理模型

⭐️ Go 性能加速器:你需要知道的 5 个诀窍和技巧

⭐️ 「刷起来」Go必看的进阶面试题详解

📒 Node 中文周刊 #83 - 新的 npm 包有一半是垃圾包吗

⭐️ 字节跳动开源 Shmipc:基于共享内存的高性能 IPC

⭐️ iptables 的五表五链

📒 前端食堂技术周刊第 77 期:三月登陆浏览器的新功能、Nuxt DevTools、pnpm v8.0.0、重新思考 React 最佳实践、CLI 脚手架工具生态

📒 有趣!深挖推特开源算法;ChatGPT封号对策汇总;ControlNet最全教程;搭建ChatGPT应用;构建开源项目阅读工作流 | ShowMeAI日报

📒 GPT 会上网了!!ChatGPT 插件的原理揭秘

⭐️ Go语言中常见100问题-#31 Ignoring how arguments are evaluated in ...

📒 「每周译Go」在 Go 里面如何使用 Flag 包

⭐️ 一文告诉你哪些map element类型支持就地更新

📒 前端同学都是如何玩转 ChatGPT 的

⭐️ Go 高性能代码的 30 个 Tips

⭐️ ChatGPT 如何辅助我的开发日常

⭐️ CPU 缓存体系对 Go 程序的影响

⭐️ Go 语言标准库 bufio 详解

📒 MDH 前端周刊第 94 期:Socket AI、CSS 遮罩、Qwik RC、Source Map、1000X 工程师

《介绍 Socket AI - ChatGPT 驱动的威胁分析 - Socket》。Socket 宣布推出基于人工智能的源代码分析解决方案,利用 ChatGPT 检查每个 npm 和 PyPI 包。当检测到包中存在潜在问题时,Socket 会将其标记并请求 ChatGPT 对其进行总结。Socket 的 AI 警告应视为建议而非绝对分析,因为 LLMs 的限制意味着跨文件分析等任务仍需持续改进。此外,Socket 还在不断增强静态分析功能,未来预计将进一步整合 LLMs,实现更复杂的 AI 引导分析。

https://socket.dev/blog/introducing-socket-ai-chatgpt-powered-threat-analysis

《使用 Zod 和 JSDoc 进行 JavaScript 类型定义》。本文介绍了如何在纯 JavaScript 文件中使用 JSDoc 注释和 Zod 类型库来推断类型。通过这种方法,可以在编写代码时获得类型提示和检查,并在运行时使用类型。这种方法不需要编译、转换或配置任何东西,因此非常适合小型项目。

https://blog.jim-nielsen.com/2023/types-in-jsdoc-with-zod/

《Twitter 的推荐算法》。Twitter 公布了其推荐算法的工作原理,该算法将每天发布的大约 5 亿条推文缩减到最终出现在用户设备上的少数优质推文。Twitter 的推荐系统由许多相互连接的服务和作业组成,包括从不同的推荐来源提取最佳推文、使用机器学习模型对每个推文进行排名、过滤掉用户已屏蔽的推文等。这篇博客将介绍算法如何为用户的时间轴选择推文。

https://blog.twitter.com/engineering/en_us/topics/open-source/2023/twitter-recommendation-algorithm

《如何拥有充裕的时间》。本文介绍了一种管理时间的技巧,即将相关任务放入一个桶中,让这个桶积累直到满,然后一次性处理。这与试图在数不清的打断管道中捕捉每个任务形成对比,如果你让它们滴答滴答地流逝,它们会将你的一天淹没。作者强调,时间并不是稀缺资源,注意力才是,找到你的桶,培养耐心让它们填满,然后逐个清空。这是 10X 生产力的窍门。

https://world.hey.com/dhh/how-to-have-buckets-of-time-38693993

《发布 react-router@6.10.0・remix-run/react-router》。React Router 6.10.0 发布,增加了一些数据路由标志,包括 future.v7_normalizeFormMethod,可以将 useNavigation() 和 useFetcher() 的 formMethod 字段规范化为大写 HTTP 方法,以与 fetch()(以及某些 Remix)行为对齐。此外,还修复了一些错误,并更新了 @remix-run/web-fetch@4.3.3

https://github.com/remix-run/react-router/releases/tag/react-router%406.10.0

《1000X 工程师》。本文介绍如何通过一系列命令行包装函数来使用 OpenAI API 提高程序员的生产力。作者首先介绍了如何获取 OpenAI API 密钥,然后演示了如何使用 API 来回答各种问题、生成数据集、创建图像等。作者认为,未来的开发者生产力将会是一个重要的竞争优势,而采用借助人工智能的工作流程可能会更加高效。虽然这并不意味着程序员将被替代,但它提供了一种解决模糊领域中更大问题的有趣新方法。

https://kadekillary.work/posts/1000x-eng/

《发布 GitHub Actions 扩展适用于 VS Code | GitHub 博客》。GitHub 发布了官方的 GitHub Actions VS Code 扩展程序的公共测试版。该扩展程序支持编写和编辑工作流程,并帮助用户管理工作流程运行,无需离开 IDE。使用该扩展程序,用户可以在不离开编辑器的情况下管理工作流程,轻松监控存储库中的工作流程运行,取消和重新运行它们,或者为手动触发的工作流程触发新的运行。此外,用户还可以列出所有受支持级别(组织、存储库和环境)的可用密钥和变量。扩展程序提供了语法高亮、集成文档、验证和代码完成等功能,以提高编辑工作流程的体验。

https://github.blog/2023-03-28-announcing-the-github-actions-extension-for-vs-code/

MDH 前端周刊第 94 期:Socket AI、CSS 遮罩、Qwik RC、Source Map、1000X 工程师

📒 Go语言爱好者周刊:第 183 期 —— Go1 正式发布 11 周年

TiDB 7.0 发布: Go 实现的分布式数据库。

https://docs.pingcap.com/tidb/v7.0/release-7.0.0

ferret 0.18发布: 一个声明式的 Web 爬虫系统,既可以单独使用,也可以嵌入其他 Go 项目使用。

https://github.com/MontFerret/ferret

hertz 0.6.1 发布: 一个 Golang 微服务 HTTP 框架。

https://github.com/cloudwego/hertz

ElasticSearch Go 8.7 发布: ElasticSearch Go 8.7 官方客户端发布。

https://github.com/elastic/go-elasticsearch

为什么 Go 不支持 []T 转换为 []interface

https://mp.weixin.qq.com/s/lG-sswO8i6w_6sMztvyOjw

如何用 Go 进行正确的性能剖析

https://blog.pickme.lk/how-to-get-profiling-right-with-go-813ff89d4757

nats.go: NATS 的 Golang 客户端,云原生消息系统。

https://github.com/nats-io/nats.go

zeropool: Go 的零分配类型安全池,sync.Pool 的替代品。

https://github.com/colega/zeropool

Go语言爱好者周刊:第 183 期 —— Go1 正式发布 11 周年

· 13 min read
加菲猫

image

题图:Landscape illustration, Hayao Miyazaki, in the sea of flowers, clouds, fantastic sky, warm colors, simple composition。

📒 地表最强动画基础库:framer-motion

framer-motion v10.6 特性:animate api 可以控制随时停止、取消、完成。

https://www.framer.com/motion/animate-function/#controls

📒 PromQL 相关内容

Introduction to PromQL, the Prometheus query language

https://promlabs.com/promql-cheat-sheet/

为 Apache SkyWalking 构建 Grafana Dashboard —— 原生 PromQL 支持

📒 学会 Go select 语句,轻松实现高效并发

⭐️ 使用go test框架驱动的自动化测试

📒 面试遇到 性能优化 必答的 9 个点,加分

几点补充:

1、SPA 项目,一个路由对应一个页面,如果不做处理,项目打包后,会把所有页面打包成一个文件

实际 Webpack 打包的时候,会综合考虑 chunk 大小、缓存复用率、减少模块冗余、并行请求数等因素,不一定把 Initial Chunk 打包为单文件,也可以是多个文件,但是这些文件一定是 同步加载 的。

可以参考 optimization.splitChunks 内置分包规则:

https://webpack.js.org/plugins/split-chunks-plugin/#defaults

2、将路由全部改成懒加载,重新打包后,首页资源拆分为 app.js 和 home.js,以及对应的 css 文件,通过路由懒加载,该项目的首页资源压缩约 52%

Code-Splitting 不一定能明显优化首屏加载性能。例如 Initial Chunk 和 Async Chunk 都有一些体积较大的公共依赖,例如 reactreact-domreact-router-dom 等,这种情况下,即使针对每个页面组件做了懒加载,公共依赖仍会被视为同步 chunk(因为首屏加载需要依赖这些公共包),实际异步加载的只有体积很小的业务代码。

当然 Code-Splitting 在特定场景下还是非常有用的,例如有上百个路由的后台管理系统,虽然每个页面的业务代码体积很小,但是首屏一次性加载几百个页面,压力还是有点大(首屏时间随业务规模线性增长)。如果做了路由懒加载,则可以按需加载当前页面的业务代码,保证首屏时间都是 O(1) 复杂度。

3、项目打包后,发现 home.js 和 about.js 均包括了该弹框组件的代码

与第一点类似,Webpack 打包的时候,不仅考虑模块冗余问题,还会考虑减少并行请求数。例如两个以上 Async Chunk 存在公共依赖,若公共依赖体积较小,则 Webpack 可能不会单独抽提 chunk,而是给每个 Async Chunk 都打包一份公共依赖,好处是可以减少网络请求数量。

面试遇到 性能优化 必答的 9 个点,加分!

📒 Go Mutex:保护并发访问共享资源的利器

⭐️ 【补充代码】Go BIO/NIO探讨(3): 基于系统调用实现tcp echo server

📒 「高频必考」Docker&K8S面试题和答案

⭐️ gin框架中Context的Get、Query、Param函数都是从哪里获取数据的

⭐️ 深入解析非阻塞Golang IO框架nbio

⭐️ Go 调试工具 - delve 快速入门

⭐️ Golang反射学习:手写一个RPC

📒 相关链接

推荐部署平台 Railway,可以部署 Docker 容器

https://railway.app/dashboard

谁会拒绝一个免费的部署服务呢

TiDB 是一个开源、云原生、分布式、与 MySQL 兼容的数据库,用于弹性规模和实时分析

https://github.com/pingcap/tidb

⭐️ Go如何自动解压缩包?| 文末送书

⭐️ 高并发系统设计(1): 如何实现抖音关注/粉丝列表

⭐️ Go协程池(2): 如何实现协程池

⭐️ Go协程池(1): 线程vs协程

⭐️ 简洁而不简单的 sync.Once

📒 axios的替代方案的思考和实践

axios 存在哪些问题:

  • 与React、Vue等框架割裂
  • 在性能方面毫无作为(例如没有缓存、无法避免重复请求等等)
  • 臃肿的体积
  • TS 类型定义混乱(在拦截器中对响应数据进行解构,但是接口请求响应的数据还是 AxiosResponse 类型,需要手动用 as 断言)

axios的替代方案的思考和实践

📒 chatgpt逐字逐行回答的效果是如何实现的

一句话总结:通过 Content-Type: text/event-stream 做流式响应。

chatgpt逐字逐行回答的效果是如何实现的

📒 可视化搭建 - keepAlive 模式

⭐️ Go 语言实现创建型设计模式 - 工厂模式

⭐️ 为什么 Go 不支持 []T 转换为 []interface

⭐️ Go设计模式-迭代器到底是不是一个多此一举的模式

📒 MDH 前端周刊第 93 期:npm、sharp images、React Labs、fzf、手写 Signals

《从 ts-node 迁移到 Bun》。本文介绍了如何将一个使用 ts-node 编写的控制台应用程序迁移到 Bun,以及在迁移过程中遇到的一些问题和解决方案。作者发现 Bun 比 ts-node 快 50%,并且迁移过程相对容易。他认为这让他对 Bun 充满信心,并期待未来更多地使用它。

https://johnnyreilly.com/migrating-from-ts-node-to-bun

《加速 JavaScript 生态系统 - npm 脚本》。本文介绍了如何优化 JavaScript 中常用的 “npm scripts”,以减少其约 400 毫秒的开销。作者通过分析 npm CLI 的代码结构,发现大部分时间都花费在加载组成 npm CLI 的模块上。作者通过惰性加载、减小模块图等方式,将运行 npm scripts 的时间从 400 毫秒降至 22 毫秒。作者指出,JavaScript 工具中普遍存在的问题是没有简便的方法来缩短模块图,因此可以考虑在发布时将代码打包,以减少加载时间。

个人理解再总结一下:

1)如何检测 npm scripts。which npm 命令可以拿到 npm 解释器路径,因此可以通过 node --cpu-prof $(which npm) run myscript 运行脚本、生成 profile;

2)惰性加载。通过 profile 可以发现,npm cli 运行大部分时间其实都在加载模块。我们知道,Node 具有 JIT 特性,因此 require 实际上是非常昂贵的(回顾一下 require 加载机制)。建议按需 require,将 require 推迟到要用的时候再去加载,例如放在条件判断里面,可以显著提升 cli 启动性能(例如 Babel 插件、Webpack loader 支持配置字符串而不是传递实例,实际上也是延迟加载);

3)减小模块图。解释器在遇到 top level import or require 语句时,就会加载、解析模块(还是回顾一下 require 加载机制),引起大量文件 IO。与 Web 工程不同,Node 工程可以将所有代码打包到一个单文件中(target: "node"、禁用 Webpack 默认分包规则 optimization.splitChunks.cacheGroups.default: false),这样避免了模块加载开销,可以显著提升 cli 应用启动性能。需要注意的是,如果一次性投喂代码太多,还是会影响性能,解法是和上面提到的惰性加载结合用(也就是 Node 不需要 bundle-splitting 分包,但可以用 code-splitting 做异步懒加载)。

https://marvinh.dev/blog/speeding-up-javascript-ecosystem-part-4/

《如何获得一个酷炫的 NPM 包名?》。本文介绍了如何通过 NPM 的争议政策来申请将占位包的所有权转移给自己。对于长期没有更新或仅仅是占位的包,NPM 工作人员会在 4 周后自动将包的 owner 设置为申请者的用户名。申请者需要发送邮件至包的所有者并抄送 support@npmjs.com,并说明申请转移的原因、包名以及自己的 npm username。

https://unix.bio/posts/how-to-get-npm-package-name

《您可能不需要的 Hooks》。本文介绍了 React Hooks 中一些不太常用的 Hook。

https://reacttraining.com/blog/hooks-you-probably-dont-need

《React Labs:我们正在进行的工作》。React Labs 发布了最新的研究进展,包括 React Server Components、Asset Loading、Document Metadata、React Optimizing Compiler、Offscreen Rendering 和 Transition Tracing 等。其中,React Server Components 是由 React 团队设计的一种新的应用架构,提供了一种新的组件类型 —— Server Components,它们可以在构建期间运行,也可以在服务器上运行,让您无需构建 API 即可访问数据层。另外,React Labs 还在开发 Suspense、Transition Tracing 等功能,以提高 React 的性能和用户体验。

https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023

《GitHub Copilot X:AI 动力的开发者体验 | GitHub 博客》。GitHub Copilot X 是 GitHub 的新一代 AI 辅助开发工具,它将 AI 引入整个开发生命周期中。除了自动完成注释和代码外,Copilot X 还支持聊天和语音交互,并在 pull requests、命令行和文档中提供 AI 支持。Copilot X 基于 OpenAI 的 GPT-4 模型,可以为开发人员生成单元测试、修复错误等。此外,Copilot X 还支持针对文档的 ChatGPT 接口,让开发人员能够快速获取关于 React、Azure Docs 和 MDN 等文档的答案。

https://github.blog/2023-03-22-github-copilot-x-the-ai-powered-developer-experience/

《如何在 2023 年开始一个 React 项目》。本文介绍了几种新 React 项目的起始套件,包括 React with Vite、React with Next、React with Astro 等。作者对每种套件的优缺点、开发者所需技能水平以及针对 React 开发者提供的特性进行了分析,并给出了不同需求的三种解决方案。最后,文章总结了一些关于 React 起始项目的思考和建议。

https://www.robinwieruch.de/react-starter/

《使用 useImperativeHandle 进行细调 refs》。本文介绍了在 React 中使用 refs 和 useImperativeHandle 的方法。Refs 是一种用于在组件之间传递数据的机制,可以让你访问 DOM 节点并使用原生 JavaScript DOM API 对其进行操作。useImperativeHandle 允许你自定义要公开的 ref 处理程序,以便只公开子组件的特定方法。然而,需要注意的是,在 React 中,最好不要使用 refs 来实现可以通过 props 实现的命令式行为,因为这违反了 React 的核心原则。

https://prateeksurana.me/blog/fine-tuning-refs-with-useimperativehandle/

Umi 例行每周四发一版,我觉得有趣的功能包括,1)基于 Rust 实现类 es-module-lexer 解析器用于 prepare 阶段采集 import 数据,2)配置校验陆续从 joi 迁移到 zod,3)新增 umi? 命令,这是框架结合 openai 的第一个尝试,4)MFSU 支持 WASM。

📒 Golang 相关文章

The one-and-only, must-have, eternal Go project layout

https://appliedgo.com/blog/go-project-layout

OpenAI 的 Golang SDK,包括 ChatGPT、GPT-3、GPT-4 等。

https://github.com/sashabaranov/go-openai

一个检测结构体是否可以占用更少内存的工具。

https://github.com/dkorunic/betteralign

基于 Docker 的热重载开发。

https://github.com/dkfbasel/hot-reload

📒 Go语言爱好者周刊:第 182 期 —— GPT Go SDK