社区
前端生态的调查问卷
从 2021 年开始,有了 State of JavaScript 和 State of CSS 的调查问卷,包含了各种原生的更新内容、相关的框架工具等。而 State of HTML 2023 是今年(已经在10月19号结束问卷调查)才开始,可以期待一波问卷结果,并且也是很好的了解新特性的途径,里面涉及到了 表单、交互性、web component 等等内容,一大堆的知识盲区。
另外,State of React 2023 也即将开始,等待一波。
好文章
使用原生的 JS 实现响应式
我们常用的 React、Vue 提供了开箱即用的响应式方式,来看看我们有哪些原生的方式现实?
- 发布订阅模式/观察者模式
- 自定义事件
- Proxy
- 反应式系统
- Observable
- Signals (SolidJS 的信号)
- 可观察的(Observable-ish)值
- UI 方面的响应式
- 。。。。等等
JavaScript 中 base64 编码字符串
在 JS 中,我们一般都是直接使用 btoa 字符串转 base64,用 atob base64 转字符串。但是你会发现这两个方法无法适用于 Unicode ,当我们试图使用中文、emoji 等字符串去转 base64,就会抛出异常
The string to be encoded contains characters outside of the Latin1 range.
这篇文章介绍了使用 TextEncoder Uint8Array 等 API 来将 Unicode 字符串转换为全部表示为单个字节的字符串,再使用 btoa 转 base64。
CRDTs 技术入门
你有思考过多人协作工作。比如钉钉文档、Figma 等等他们是怎么实现多人协作的数据同步的吗?他们都使用了一个 CRDTs 的技术,这一篇很好的概念入门文章,里面还包含了实时交互让你体验。这个技术简单易懂,却又非常强大,值得了解学习。
构建多人协作像素画图编辑器 这是他对应的实践文章。

桶文件(barrel files)的崩溃
首先了解一下什么是桶文件(barrel files),比如我们项目中有一个 components 目录,components/index.ts 的内容为下:
export * from './ComponnetA'
export * from './ComponnetB'
export * from './ComponnetC'
export * from './ComponnetD'
这个就是指的桶文件,然后在使用是我们会 import { a, b, c } from '@/components' 这种方式引用。
这样写的代码确实非常简洁,但是当桶文件存在里大量的模块,现实中,你的某个 ComponentA 还可能通过 import { xx } from '@/utils' import { xx } from '@/apis' 等应用其他桶文件,这会使得模块加载、build、lint、ts type 等工程相关的变慢。

你可能会问,不是可以 tree shaking 吗,没错,当那些文件没有副作用(Side Effect)时,打包后是可以减少资源,但是 build、lint 等构建过程仍旧会全量分析,拖慢热更新、编辑校验等速度。
正好,这里还有一篇 nextjs 的优化文章:我们如何在nextjs中优化包导入 ,他们通过技术手动优化了桶文件(跳过桶文件,直接从目标导入),有些 100000 个模块以上的用户使用了这个技术,提升了 90% 的开发更新速度。
Node 生态
不要阻塞事件循环和线程池
在 Nodejs 中,有两种类型的线程:一种是事件循环,还有一种是线程池。这篇文章介绍了哪些方式会阻塞他们,当我们编写一个高吞吐量、能抵御 DoS 攻击的 Web 服务器时,我们应该尽可能的避免。
Nodejs 21 版本正式发布
同时 nodejs V20 也即将(2023-10-24)升级为 LTS 版本。越来越多的开源项目将 node 最低支持版本改为了 16 (实际上在 2023-09-11 V16 已经停止维护了)。你还在使用 12 、14 吗?(吐槽:不得不用)