Skip to main content

· 4 min read
加菲猫

📒 互联网公司都怎么实现分页的,拿 MySQL 使劲Limit

📒 拒绝 Go 代码臃肿,其实在这几块可以用下观察者模式

📒 记一次线上超时问题的发现、排查、定位以及解决过程

📒 这不会又是一个Go的BUG吧

📒 这三个 Go 水平自测题,手写不出来还是先老实上班吧

📒 不想Go 错误处理太臃肿,可以参考这个代码设计

📒 关于Go程序错误处理的一些建议

📒 你见过哪些目瞪口呆的 Java 代码优化技巧

📒 聊聊 13 种锁的实现方式

📒 代码越写越乱?那是因为你没用责任链!

⭐️ 社招后端21连问(三年工作经验一面)

📒 Spring Boot 实现接口幂等性的 4 种方案

📒 前端运维部署那些事

📒 rollup 最佳实践!可调试、编译的小型开源项目思路

tsc 可以只生成类型声明文件:

$ tsc  --emitDeclarationOnly --declaration --project ts.config.json --outDir dist/esm

rollup 最佳实践!可调试、编译的小型开源项目思路

📒 脚本任务执行器 —— npm-run-all 源码解析

📒 2022年值得推荐的React库!

📒 超大体量项目,微前端落地方案,看完后悔来找我

📒 如何解决前端常见的竞态问题

📒 Go语言中常见100问题-#88-1 Not using testing utility packages

📒 字节二面,差点没答好

📒 如何提高 TypeScript 的代码质量

📒 谁说 Mysql 单表最大 2000 W ?我硬要塞它 1 个亿!

📒 初探 Vue3 编译之美

📒 Go 1.19 is released

$ go install golang.org/dl/go1.19@latest

go 命令使用:https://pkg.go.dev/cmd/go

📒 GitHub Trending - TypeScript

https://github.com/trending/typescript

📒 【表达式计算】双栈 : 表达式计算问题的通用解法

📒 构建自己的 Web 框架

这篇文章解释了如何构建基于 React 的简易 Web 框架,并使用 Vercel 的 Build Output API 进行部署。

Build Output API 是一个基于文件系统的规范,用于生成 Vercel 部署的目录结构。框架作者可以将此目录结构实现为他们构建命令的输出,以便框架可以利用所有 Vercel 的平台功能(Serverless Functions,Edge Functions,路由,缓存等),Astro已经成功与 Vercel 集成。

https://vercel.com/blog/build-your-own-web-framework

📒 从零实现 React v18 的核心功能

📒 Roll your own JavaScript runtime

📒 用 TS 的类型系统实现一个 TS 类型系统

📒 像小说一样品读 Linux 0.11 核心代码

📒 前端食堂技术周刊第 46 期:Chrome 三方 cookie 计划、npm 引入更多安全增强功能、Awesome Bun

⭐️ 看一下 React 15.x 源码

https://github.com/Lucifier129/react-lite

📒 Go语言中常见100问题-#87 Not dealing with the time API efficiently

📒 用了TCP协议,就一定不会丢包吗

📒 【第2688期】关于低代码平台建设的思考与实践暨BPM表单设计器前端技术解析

· 5 min read
加菲猫

📒 全网最优雅的 React 源码调试方式

📒 如何实现一个跨框架的组件库文档

📒 入职Apifox研发组半年,我所提升的软技能|文末抽书

⭐️ 几个提升Go语言开发效率的小技巧

📒 最近对前端构建工具的一些理解

📒 Go语言中常见100问题-#86 Sleeping in unit tests

📒 超实用的Chrome DevTools调试技巧

📒 开源项目推荐

用 Go 写的 GUI gRPC 客户端。作者在调试 gPRC 接口时,发现没有类似 postman 趁手的 gPRC 客户端,所以就自己动手写了一个然后开源了。

https://github.com/crossoverJie/ptg

Go DDD 示例项目。该项目通过一个预约系统的示例,展示了如何在 Go 项目中实现领域驱动设计(DDD)和读写分离架构(CQRS)。

https://github.com/ThreeDotsLabs/wild-workouts-go-ddd-example

一款静态应用程序安全测试(SAST)工具。它可以检测项目中是否包含密码、API Key、token 等信息,还能够轻松整合到 Git Hook 和 GitHub Action,实现提交代码时自动检测,通过告警和阻止 push 等方式,有效地防止敏感信息泄漏。

https://github.com/zricethezav/gitleaks

在线可视化正则编辑器。该项目可将输入的正则表达式,自动生成对应的可视化图形,支持通过编辑图形节点修改正则表达式,以及对正则表达式进行测试等功能。

https://github.com/Bowen7/regex-vis

📒 前端构建效率优化之路

📒 Esbuild Bundler HMR

📒 面试突击69:TCP 可靠吗?为什么

📒 招银网络一面:AOP 了解吗?有什么用?切面执行顺序如何控制

⭐️ Nest 的实现原理?理解了 reflect metadata 就懂了

📒 耽误你十分钟!🎃你可能用得上这些webpack5新特性

📒 入职即巅峰?🧨基建优化项目体积减少20%!

📒 简单好用的前端拖拽排序库

📒 你能给前端工程化下个定义么

📒 你需要知道的ES6—ES13开发技巧!

📒 【第2682期】前端场景下请求的Race Conditions

📒 介绍几个相对冷门的 React Hook

https://css-tricks.com/react-hooks-the-deep-cuts/

📒 Remix 和 Next.js 的区别

本文对这两个基于 React 的框架进行了逐个特性的比较,它们有很多相似之处,但也有一些关键的区别。

https://www.smashingmagazine.com/2022/07/look-remix-differences-next/

📒 阅读源码之 React 篇

本文并不是要详尽地描述 React 是如何工作的,而是主要关注了 React 的设计和 React 开发人员多年来采用的实践。

https://alexkondov.com/readint-source-code-react/

📒 编程语言是如何实现泛型的

📒 Vue 编译三部曲

Vue 编译三部曲:如何将 template 编译成 AST

Vue 编译三部曲:模型树优化

Vue 编译三部曲:最后一曲,render code 生成

📒 字节一面:TCP 和 UDP 可以使用同一个端口吗

📒 如何在繁重的工作中管理好自己的时间和精力

📒 「万字总结」🍒动画 + 大白话讲清楚React渲染原理

📒 Go语言中常见100问题-#85 Not using table-driven tests

📒 小程序不让用 JS 解释器?那我再肛一次鹅厂

· 8 min read
加菲猫

📒 NestJS v9 发布

https://trilon.io/blog/nestjs-9-is-now-available

📒 如何遍历 map

首先,map 本身是可迭代对象,可以通过 for...of 遍历。

第二,可以将 map 转为数组进行遍历,实际还是利用了迭代器接口,但是可以利用数组方法链式调用。

map 默认迭代器接口是 entries,可以自定义例如 [...map.values()]

📒 开发小技巧

Antd 的 Modal 既可以通过组件方式,也可以通过 modal method 方式使用,后者比组件更方便,不需要自己维护状态,但是会有一个问题,如果需要通过弹框内部的按钮,控制弹框更新、关闭,我们没办法直接给弹框内部的元素传递 modal.update,因为此时 Modal.success() 还没有执行结束,modalundefined,如何解决呢?

实际上可以通过不可变引用解决这个问题,我们先定义一个对象 ctx,在里面定义一个 update 方法,但什么也不做。然后给弹框内部按钮传入 (e) => ctx.update(e),这样是可以正常调用,不会报错。然后在 Modal.success() 执行完成之后,这个时候就可以访问 modal 对象了,我们用 modal.update 去替换之前的空函数,这样当事件触发之后,调用的 modal.update() 就可以控制弹框更新了。

const renderQuizModal = ({
quizId,
unitId,
handleOk,
}) => {
const ctx = {
update: (e: CheckboxChangeEvent) => {},
};

const modal = Modal.success({
title: quizName,
width: 600,
okButtonProps: {
disabled: true,
},
content: (
<Checkbox onChange={(e: CheckboxChangeEvent) => ctx.update(e)}>
勾选此项
</Checkbox>
),
onOk: () => {
handleOk?.();
},
})

ctx.update = (e: CheckboxChangeEvent) =>
modal.update({
okButtonProps: {
disabled: !e.target.checked,
},
});
}

如何强制重新挂载组件?如果修改 props 或者 setState 只是触发组件 rerender,实际上是组件更新的过程,有时候需要强制组件重新挂载,可以修改组件的 key

为何有时候没有给域名配置 host 还是可以访问?这是因为在容器中部署,可以通过 Docker 的 Networking 实现容器通信。

⭐️ 「React进阶」React中没有keepalive?没事!手把手教你从零到一设计并实现一个!

⭐️ 现在前端面试都问什么「字节、蚂蚁、美团、滴滴面试小记」

📒 2022 年值得推荐的 Vue 库

📒 【第2676期】一个 Safari 的小 Bug,探索出了 fetch 和 xhr的新玩法

📒 Vite 也可以模块联邦

📒 开发一个 CLI 模板库可以点亮哪些技能点

📒 Golang 实现一个 JS 打包器

Golang 解析 JS AST:

Webpack 打包原理:

📒 天天造轮子第七天 - 中间件实现 - Compose 的 N 种姿势

📒 使用Vite和TypeScript带你从零打造一个属于自己的Vue3组件库

📒 如何使用 React Hooks 重构类组件

📒 Why DRY is the most over-rated programming principle

https://gordonc.bearblog.dev/dry-most-over-rated-programming-principle/

📒 What makes a great software engineer

https://swizec.com/blog/what-makes-a-great-software-engineer/

📒 构建面向未来的前端架构

本文是关于前端架构的组件部分。如果有写过组件,可能都有遇到随着业务迭代而快速增加复杂度,最终写出臃肿不堪难以维护的组件。为啥别人写的代码简洁易懂?缺的是经验吗?不是,缺的是方法论。我觉得此方法同样适用非组件场景。

心智模型的重要性。心智模型会影响我们的决定,进而影响代码的整体结构。如果一直做错误的大大小小的决定,那代码很快就会变成屎山。每个人的心智模型不可能完全一样,所以注定会做出不同的决定。对于团队而言,用框架和工具约束,让大家不做或少做决定是个很好的策略,比如用 prettier 统一编码风格。

文中有个例子。你写了一个组件,过了一周,产品迭代,而之前写的组件不能很好满足新需求。这时你有两个选择,A)思考之前的抽象是否正确,如果不正确,分解了重新做,B)增加一个额外 props,组件里加一些恶心的条件判断。你会如何选择?你会在乎之前投入的沉没成本还是面向未来考虑更多?其实没有对错,注意 By Scene。

自上而下 vs. 自下而上。「你可以自上而下或自下而上地构建。也就是说,你可以从构建层次结构中较高的组件开始。在比较简单的例子中,通常自上而下更容易,而在较大的项目中,自下而上更容易,并在构建过程中编写测试。」

自上而下是直观的、能快速出货的,大家通常也会这么干。当涉及到分解用户界面时,在功能区域周围画上方框,然后成为你的组件。这种功能分解的过程是自上而下的,通常会直接导致创建具有特定抽象性的专门组件。需求会改变。而在几个迭代过程中,这些组件很容易迅速变成单体巨石组件。

单体巨石组件有不少问题,包括 1)不容易复用子组件 2)包变大,比如 SSR 场景可能只希望渲染第一时间被用户看到的组件从而提速 3)rerender 问题导致运行时性能不好,也会让代码复杂,出现很多不必要的 memo 调用 4)不好的抽象导致项目复杂,迭代困难。「敏捷软件开发最重要的经验之一是迭代的价值;这在软件开发的各个层面都是正确的,包括架构。」

自下而上不那么直观,最初可能比较慢。因为这种方式会产生很多小组件,而实际中不是每个小组件在最初都需要可复用。所以前期需要花更多时间和努力,让复杂性被封装在每个小组件里。好处是长远看会更快,因为适应性更强。同时避免了单体巨石组件和前面介绍的他会带来的大量问题。

https://frontendmastery.com/posts/building-future-facing-frontend-architectures/

· 4 min read
加菲猫

📒 Vite 3.0 正式版发布

Vite 3.0 发布: 核心更新盘点与分析

Vite 3.0 正式发布,下一代前端构建工具!

https://vitejs.dev/blog/announcing-vite3.html#dev-improvements

📒 nestjs + prisma 开发全栈项目

https://www.prisma.io/docs/getting-started

https://www.prisma.io/nestjs

📒 成为优秀的TS体操高手 之 TS 类型体操前置知识储备

📒 如何在React中应用SOLID原则

📒 2022 年 CSS-in-JS 技术的又一匹黑马!

📒 还在用命令行看日志?快用Kibana吧,可视化日志分析YYDS!

📒 【面试造火箭,入职拧螺丝】万字详解如何从0开始手写一个Promise

⭐️ Webpack5 核心原理与应用实践

📒 Webpack 特有的优化策略

由于 Webpack 出现的时候,还没有 ESM 规范,所以 Webpack 底层根据 CJS 规范实现 __webpack_require__ 加载模块,这就导致 Webpack 打包会出现大量模板代码,增加打包后体积。相比之下,Rollup 基于 ESM 规范打包,产物代码就很干净。

1. Scope Hoisting

作用域提升,个人觉得这个应该是参考了 Rollup,但是 Webpack 的模块合并还是非常有限,必须是只引用了一次的模块才能合并,否则会造成模块冗余问题。

默认 optimization.concatenateModules 在生产环境下会启用:

module.exports = {
//...
optimization: {
concatenateModules: true,
},
};

https://webpack.docschina.org/plugins/module-concatenation-plugin/

2. 确定性模块 ID

生产环境下,Webpack 的模块 ID 默认按模块解析顺序自增,即使源码没有修改,但是有时模块 ID 会发生变化,导致哈希改变,文件缓存失效。通过配置 moduleIds: 'deterministic' 有利于持久化缓存:

module.exports = {
//...
optimization: {
moduleIds: 'deterministic',
},
};

https://webpack.docschina.org/configuration/optimization/#optimizationmoduleids

3. Runtime Chunk

运行时代码单独分包,一般 SPA 应用问题不大,多页应用打包,运行时代码单独分包可以配置持久化缓存。配置 runtimeChunk: 'multiple' 会为每一个 Initial Chunk 添加一个 Runtime Chunk,配置 runtimeChunk: 'single' 则会创建一个所有 Initial Chunk 共享的 Runtime Chunk:

module.exports = {
//...
optimization: {
runtimeChunk: {
name: 'runtime',
},
},
};

https://webpack.docschina.org/configuration/optimization/#optimizationruntimechunk

📒 MySQL Redo Log 深入探索

⭐️ 详解 Vite 依赖预构建流程

⭐️ VueUse scripts,他们都模仿过的脚本

⭐️ 【第2669期】前端开发中的流程自动化与提效实践

📒 隔离并修复 Node 应用程序中的内存泄漏

📒 硬件加速中的“层”和层叠上下文中的“层”,是一个东西吗

📒 《Go学习路线图》带你少走弯路,Let's Go !

📒 前端原型链污染漏洞竟可以拿下服务器shell

📒 我在 Shopee 工作这两年

📒 五个 React-Query 和 SWR 的小技巧

⭐️ ⭐️ 「React 进阶」 React 全部 Hooks 使用大全 (包含 React v18 版本 )

📒 React 状态管理的新浪潮

⭐️ ⭐️ 函数式编程术语

· 3 min read
加菲猫

📒 为什么 React 的 Diff 算法不采用 Vue 的双端对比算法

📒 Module Federation最佳实践

📒 react18新特性及实践总结

📒 模块加载机制

commonjs 加载一个 module

webpack_require -> vm.runInContext

📒 Nodejs Module Wrapper

Before a module's code is executed, Node.js will wrap it with a function wrapper that looks like the following:

(function(exports, require, module, __filename, __dirname) {
// Module code actually lives in here
});

https://nodejs.org/api/modules.html#the-module-wrapper

📒 微前端/qiankun

📒 如何进阶TypeScript功底?一文带你理解TS中各种高级语法

📒 【第2662期】低代码平台架构深度剖析

📒 那些关于DOM的常见Hook封装(二)

📒 antd mobile 作者教你写 React 受控组件和非受控组件

📒 我对 React 实现原理的理解

📒 WebAssembly生态及关键技术综述

📒 HTTP3 RFC标准正式发布,QUIC会成为传输技术的新一代颠覆者吗

📒 如何将传统 Web 框架部署到 Serverless

📒 新来个技术总监,把 RabbitMQ 讲的那叫一个透彻,佩服!

📒 关于前端主题切换的思考和现代前端样式的解决方案落地

⭐️ Data Flow in Remix

React 第一次和大家见面时,最引人注目的特点之一是他的「单向数据流」。这在官方文档 Thinking in React 里仍有介绍。用一句话概况即:UI 是状态的函数,或者叫 ui=fn(state)

而后有不少遵从这种思想的数据流方案,比如 Redux、MobX 等,以 View -> Action -> State 这种循环的单向数据流方式进行。他们的缺点是这个数据流只在客户端运转,而一个应用通常还需要持久化数据和同步数据,这意味着还要有另一条数据流来和服务端做交互。

那有没有贯穿服务端和客户端的单向数据流?Remix!哈哈。Remix 将这一理念延伸到持久化数据的 API 层,通过 Loader 和 Action 把数据流串了起来,形成 Loader > Component > Action 的单向数据流。所以在 Remix 中,开发者也无需使用 Redux 等其他数据流方案。

Data Flow in Remix

MDH 前端周刊第 60 期:Fresh 1、SPA、框架流行度、1X 工程师、Father 4 RC

📒 巨石瓦解!我把Vue3巨石项目拆成了十几个微应用

· 7 min read
加菲猫

📒 前端四种序列化

1. JSON 序列化

使用 JSON.stringify() 进行序列化,对应的 Content-Type 是 application/json

2. Query String 序列化

使用 new URLSearchParams() 进行序列化,对应的 Content-Type 是 application/x-www-form-urlencoded

注意 URL query string 与 body 发送的 query string 略有不同,特别是对空格的处理

3. FormData 序列化

使用 new FormData() 创建,对应的 Content-Type 是 multipart/form-data

4. XML 序列化

使用 new XMLSerializer() 进行序列化,一般用于 DOM 对象。

📒 React 18 新特性

  • Selective Hydration
  • Offscreen

📒 Vue 2.7 正式发布,代号为 Naruto

📒 线上服务器老是卡,该如何优化

📒 【第2657期】前端JS攻防对抗

📒 Redis 唯快不破的秘密

📒 新一代 npm 包构建工具 father 4 RC 发布

father 4 支持 Bundless 和 Bundle 两种构建模式。

  • Bundless 指把所有源码文件单独编译、平行输出做发布。在 father 4 中,输出 ESModule 及 CommonJS 产物时会使用 Bundless 构建模式
  • Bundle 指把源码按 entry 打包成 1 个或多个文件做发布,也就是 Webpack 的打包模式。在 father 4 中,输出 UMD 及依赖预打包产物时会使用 Bundle 构建模式

依赖预打包

  • 一是 NPM 包发布后安装体积更小、速度更快
  • 二是不担心三方依赖更新引起 Bug
  • 三是NPM 包发布后安装 0 warning

不过,由于依赖中可能存在 dynamic require/import 等复杂的情况,现阶段不一定每个依赖都能顺利打包,father 4 会在 RC 阶段持续优化,将这项功能变得更加好用。

新一代 npm 包构建工具 father 4 RC 发布

📒 【第2656期】使用 React Testing Library 的 15 个常见错误

📒 【第2655期】携程基于 GraphQL 的前端 BFF 服务开发实践

📒 聊聊 Vue 的双端 diff 算法

📒 面试官:Vue的KeepAlive怎么实现的?我:这有啥好问的

📒 如何优雅的写 Controller 层代码

📒 这些 hook 更优雅的管理你的状态

📒 干货 | Trip.com APP QUIC应用和优化实践

📒 基于 qiankun 的微前端实践

📒 [科普文] 浅谈 Function Programing 编程范式

📒 Taze - 一个让你的依赖保鲜的现代 cli 工具,支持定制、支持 monorepo

https://github.com/antfu/taze

📒 如何利用 Why、What、How 框架更好地写作

做项目时,要写三种类型的文档,单页文档、设计文档和 Review 文档,见图1,分别是写于启动前、实施前和完成后。单页文档写给老板看,介绍问题、预期结果、建议的解决方案和其他高层次的点;设计文档程序员可以理解为 RFC,写给同行或下属看,包含方法论、系统设计、实验结果等;Review 文档用于 Review 成功和失败的点。

文档怎么写?用「Why、What、How」的框架。听起来很简单,小学一年级老师也这么教,但作者的大部分文档都是用这个框架。Why 是让听众理解问题和背景,注意站在听众的角度,比如不要对着老板聊技术的 Why,也不要对着技术同学聊规划的 Why;What 讲解决方案是什么样子,以及可以做什么;How 讲如何实现 Why 和 What。

其中「Why」部分可以用 5 Why(https://en.wikipedia.org/wiki/Five_whys)的方法,连续问 5 个 Why,以便找出问题的根本原因。

此外还要注意「Who」,即你的听众是谁。为老板和为工程师写的文档差异会很大,因为不同人关注的点不同,前者更关心客户痛点、商业成果、投资回报率,后者更关心技术要求、设计选择、API 规范。

不同文档类型应用上述框架的例子见图 2。

文章内还有个金句,「Writing docs is expensive, but cheap.」文档很贵,需要花时间写、Review 和迭代,这些时间本可以花在写代码上。文档又很便宜,通过文档可以避免建立不靠谱的兔子洞项目,不靠谱的项目就算做出来也没人用,这个浪费是巨大的。所以,不要做「问题模糊、解决方案有争议」的项目。

https://eugeneyan.com/writing/writing-docs-why-what-how/

⭐️ 看懂 Lighthouse 中 Performance 核心指标

📒 前端抢饭碗系列之Docker容器编排

📒 为什么 2022 年 ESM 又被发布了一次

📒 漫谈 CSS 方法论

📒 HTTP 新增的 103 状态码,这次终于派上用场了!

📒 买啥高并发课程,白嫖不香么?(包括 PDF)

📒 小程序长列表优化实践

📒 前端食堂技术周刊第 42 期:Vue 2.7 Beta、TS 4.8 Beta、React 开源奖、ECMAScript 2022

📒 封装一个管理 url 状态的 hook

· 4 min read
加菲猫

📒 如何从微小细节着手,参与开源贡献

📒 【第2650期】研发同学应该如何负责好一个项目

📒 手写 Vue3 响应式系统:实现 computed

📒 ECMAScript 2022 正式发布,有哪些新特性

📒 手写 Vue3 响应式系统:核心就一个数据结构

📒 通过这两个 hook 回顾 Set/Map 基础知识

📒 React Hooks 使用注意事项

哪些变量应该放进依赖项里面:

  • 与视图渲染有关的变量,例如 propsstatecontext
  • 一些派生的状态,例如 useCallbackuseMemo 的返回值

哪些不应该放进依赖项里面:

  • 与视图渲染无关的变量,例如 ref

这是因为 useRef 返回的引用在整个组件生命周期中保持不变,不存在闭包陷阱问题

📒 React 性能优化策略

引起组件更新的因素:

  • props(包括父组件 rerender 引起子组件 rerender)
  • state(在组件内部 setState 触发调度更新)
  • context(全局状态改变,通知订阅状态的组件更新)

在不做任何优化的情况下,即使 props 没有改变,但是如果父组件 rerender,会导致子组件 props 对象重新生成,由于 React 默认的性能优化策略是 props 严格相等比较,所以不可避免地导致子组件以及所有的子孙组件 rerender。

严格相等比较 高效但是难命中,只有当前组件没有 rerender 才能保证后续组件树都不 rerender

使用了 React.memo 之后,会改为对 props 进行 浅比较,这样可以避免一些不必要的 rerender。

浅比较 容易命中但是有一定性能开销,因为需要遍历对象

📒 如何封装 cookie/localStorage/sessionStorage hook

📒 【第2648期】如何在 Vue 项目中,通过点击 DOM 自动定位VSCode中的代码行

📒 HTTP史记 - 从HTTP/1到HTTP/3

📒 Umi 4 发布啦!

📒 记录第一次给开源项目提 PR

📒 Redis 高可用原理

📒 如何移除你项目中99%的JS代码

📒 浅谈前端项目里如何用 Logger 做好日志管理

📒 如何让定时器在页面最小化的时候不执行

📒 一道有挑战性的 React Hook 场景题,考考你的功底

📒 TypeScript 深水区:3 种类型来源和 3 种模块语法

📒 我为 Netty 贡献源码 | 且看 Netty 如何应对 TCP 连接的正常关闭,异常关闭,半关闭场景

· 6 min read
加菲猫

📒 组件库开发新工具 Histoire

Vue 核心团队成员开发,底层基于 Vite,目测比 dumi 好用:

https://github.com/histoire-dev/histoire

📒 如何做好一个技术分享

最近有同事做了技术分享,发现了一些问题,在这里总结一下。

做技术分享也跟写文章一样,是有条理的,例如:

  • 先讲项目背景,现有方案存在哪些痛点(重点,技术不能为了用而用)
  • 然后再讲讲怎么做技术选型的,有哪些竞品,各自优缺点,可以简单介绍实现原理(有自己的思考,而不是上级让你做 xx 预研就直接做了)
  • 再讲团队中是如何落地的,实践过程中遇到哪些问题,是如何解决的,存量工程迁移方案(重点,节省其他同事的时间,避免重复踩坑)
  • 最后可以总结一下,该方案落地相比现有方案提升的点,此外还存在哪些问题,在选型的时候需要重点考虑

需要避免的几个点:

  • 避免开门见山,可以做一些必要的铺垫,以防有同事对相关技术不了解,为了理解你的内容,还得自己查资料
  • 避免长篇大论都在讲底层架构、底层原理,没多少人会感兴趣,还不如多讲一下自己在实践过程中遇到哪些问题、怎么解决,有哪些心得体会,这样对别人帮助更大
  • 避免内容空洞,例如讲了一大堆新特性,但都没有自己实践过,亦或是说各种性能好、各种优化,但没有实际的数据支撑,没有可以量化的指标、没有与竞品对比等等
  • 搞清楚技术分享的目的,不是给其他同事上课,而是重在分享经验。可以是自己实践过程中踩了哪些坑,或者自己搭建了一套项目模板,可以直接开箱即用

📒 执行 yarn create 命令背后做了哪些

执行 yarn create <starter-kit-package>,会先全局安装 create-<starter-kit-package>,如果已安装则会更新到最新版本,然后会执行 bin 字段中定义的脚本。

例如,yarn create react-app my-app 相当于:

$ yarn global add create-react-app
$ create-react-app my-app

📒 HTTP/3发布了,我们来谈谈HTTP/3

📒 GitHub中文排行榜

📒 80%的Linux都不懂的内存问题

📒 十分钟带你入门 Web Components

📒 前端开发技术与业务的思考

📒 【第2642期】基于 Serverless 的业务轻研发模式探索

📒 React新文档:不要滥用Ref哦

📒 async 函数注意事项

async 函数中,当有一个 await 后面的 Promise 状态变为 rejected,整个 async 函数执行就中断了。

这个在串行请求中非常有用。在很多场景下,我们需要将上一个请求返回的结果,作为参数进行下一次请求。假如上一个请求报错,那么结果自然获取不到,如果此时还进行下一个请求,这个逻辑显然有问题。因此,借助 async 函数的特性,在上一个请求报错的情况下,整个函数执行就断掉了,后续不会再发请求,无需手动进行异常处理。

📒 我与Go的故事、我为什么推荐你学Go以及我的学习路线

📒 CDN 为什么这么设计

📒 Vue3.0 响应性原理

📒 一文读懂 TypeScript 泛型及应用

📒 记录一次切换包管理器引发的血案

📒 数据库表结构设计一点心得和经验

📒 2021-2022,我在大厂的前端最佳实践

monorepo 工具除了最基本的代码共享能力外,还应当至少具备三种能力,即:

  • 依赖管理能力。随着依赖数量的增加,依旧能够保持依赖结构的正确性、稳定性以及安装效率
  • 任务编排能力。能够以最大的效率以及正确的顺序执行 Monorepo 内项目的任务(可以狭义理解为 npm scripts,如 build、test 以及 lint 等),且复杂度不会随着 Monorepo 内项目增多而增加
  • 版本发布能力。能够基于改动的项目,结合项目依赖关系,正确地进行版本号变更、CHANGELOG 生成以及项目发布

2021-2022,我在大厂的前端最佳实践

📒 Ramda 哪些让人困惑的函数签名规则

📒 Github上8个很棒的React项目

📒 全网最强 JVM 来袭

📒 useEffect 怎么支持 async...await

· 6 min read
加菲猫

📒 【第2638期】前端安全之 CSRF 攻击原理和防护方法

📒 何时发起 fetch 请求?试试在 React Router 中吧

这是一则近期在 Reactathon 中的演讲。Remix 创始人之一的 Ryan Florence 极力推荐了在 React Router 中去做 fetch 请求。

https://www.youtube.com/watch?v=95B8mnhzoCM

📒 React Route v6.4 版本已进入预发布阶段

https://github.com/remix-run/react-router/releases/tag/v6.4.0-pre.2

📒 最新一期的 20minJS 请来了 Mark Erikson,主要讨论了 状态管理以及 Redux Toolkit

https://podcast.20minjs.com/1952066/10665172-episode-12-redux-toolkit-and-state-management-in-react-with-mark-erikson

📒 Storybook v6.5 版发布:旨在提升生产力的新工作流

这款流行的组件开发工具库本次发布了许多新功能,包括在浏览器中验证用户行为的交互测试,一个将 story 和 variant 连结起来的 Figma 插件以及引入了 Webpack 5 的惰性编译用来提高启动速度等。

https://storybook.js.org/blog/storybook-6-5/

📒 Glide Data Grid v4.0 版发布:一款高效的 React 数据网格库

它自称是一款“毫不妥协,速度飞快的数据网格”。它支持高达百万条数据的多样化渲染,且支持 TypeScript。主页上还有一个简洁的 Demo,它支持 MIT 许可证。详情请看 GitHub 仓库。

https://grid.glideapps.com/

📒 开发一个浏览器插件从未如此简单

📒 深入浅出 npm & yarn & pnpm 包管理机制

📒 pkg.land:发现 npm 包的替代品的方式

https://pkg.land/

📒 平时的工作如何体现一个人的技术深度?

📒 关于前端大管家 package.json,你知道多少?

📒 【第2636期】从"微前端"到“微模块”

📒 你还在直接用 localStorage 么?该提升下逼格了

📒 ahooks 中那些控制“时机”的hook都是怎么实现的?

📒 实现一个实时预览的 json 编辑器组件(react 版)

📒 微信团队分享:微信后台在海量并发请求下是如何做到不崩溃的

📒 使用 -force 被认为是有害的;了解 Git 的 -force-with-lease 命令

📒 使用 Three.js 实现"雪糕"地球,让地球也凉爽一夏

📒 从0到1带你用webpack 5构建monorepo项目——上篇

📒 content-visibility 再探究,完美替代 Lazyload?

直接看结论:

  • 在一些需要被频繁切换显示、隐藏状态的元素上,使用 content-visibility: hidden,用户代理无需重头开始渲染它和它的子元素,能有效地提升切换时的渲染性能;
  • content-visibility: auto 的作用更加类似于虚拟列表,使用它能极大地提升长列表、长文本页面的渲染性能;
  • 合理使用 contain-intrinsic-size 预估设置了 content-visibility: auto 元素的高宽,可以有效避免滚动条在滚动过程中的抖动;
  • content-visibility: auto 无法直接替代 LazyLoad,设置了 content-visibility: auto 的元素在可视区外只是未被渲染,但是其中的静态资源仍旧会在页面初始化的时候被全部加载;
  • 即便存在设置了 content-visibility: auto 的未被渲染的元素,也并不会影响全局的搜索功能。

content-visibility 再探究,完美替代 Lazyload?

📒 冷知识!使用 display: contents 实现幽灵节点?

📒 基于 Vue3 和 TypeScript 项目大量实践后的思考

📒 ahooks 是怎么解决用户多次提交问题?

📒 这还是我最熟悉的package.json吗?

📒 npm init @vitejs/app的背后,仅是npm CLI的冰山一角

📒 不到 100 行代码,实现 React Router 核心逻辑

📒 ahooks 是怎么解决 React 的闭包问题的?

📒 如何使用插件化机制优雅的封装你的请求hook

📒 【第2633期】JavaScript运行时环境和标准

📒 TS 的 esModuleInterop 与 allowSyntheticDefaultImports 配置

📒 NPM 发包脚本加上下面这段代码

const npmPublish = async () => {
const scripts = [
"npm set-script postinstall \"\"",
"npm publish",
"npm set-script postinstall \"patch-package\"",
];
await scripts.reduce(
(prev, script) => prev.then(() => runScript(script)),
Promise.resolve()
);
}

这里的 reduce() 确保了 Promise 按顺序调用,而 Promise.all() 并发执行不保证顺序

📒 【第2632期】微前端框架 Satum 的性能优化策略

📒 大家都能看得懂的源码(一)ahooks 整体架构篇

📒 React新文档:不要滥用effect哦

📒 你还不会写 vite 插件吗?没关系,我教你啊

📒 用 Node.js 手写一个 DNS 服务器

· 9 min read
加菲猫

📒 为什么不建议用 switch...case 实现策略模式

相比 if...else 来说,switch...case 已经有了明显提升,但还是不适合用来编写策略模式。

这是因为 switch...case 实际上违背了 开闭原则,即对扩展开放,对修改封闭。例如当我们需要增加规则的时候,就需要靠修改代码来实现。

从这一点来说,用 JS 对象或者 Map 对象来实现策略模式就要灵活很多,可以动态扩展规则。

📒 干货 | 携程机票前端Svelte生产实践

📒 通过 Preact 看 Diff 算法细节

📒 Vite 打包流程

首先调用 rollup 方法(Rollup 的编程式 API)编译出 bundle 添加到 build 数组中,接下来就是遍历它,进行 bundle 的写操作(即输出到硬盘上),因为 vite 使用的是 Rollup 完成文件的打包,所以这里调用的是 bundle.write 来将文件输出到硬盘上。

packages/vite/src/node/build.ts
for (const build of builds) {
const bundle = await build.bundle;
const { output } = await bundle[write ? 'write' : 'generate']({
dir: resolvedAssetsPath,
format: 'es',
sourcemap,
entryFileNames: `[name].[hash].js`,
chunkFileNames: `[name].[hash].js`,
assetFileNames: `[name].[hash].[ext]`,
...config.rollupOutputOptions
});
build.html = await renderIndex(output);
build.assets = output
await postBuildHooks.reduce(
(queue, hook) => queue.then(() => hook(build as any)),
Promise.resolve();
)
}
tip

注意 Vite 2.x 源码结构稍有不同,但是整体流程还是类似的:

https://github.com/vitejs/vite/blob/ab23e6e7b490cf610a4465cc533f671a729fdfa8/packages/vite/src/node/build.ts#L543

这里有一个值得学习的地方,这边 postBuildHooks 的类型定义是 ((build: any) => Promise<any>)[],如何保证调用顺序,即上一次调用完成后进行下一次调用?

通常我们用 reduce 做管道操作都是不能用于 Promise,因为管道操作需要将上一次调用的返回值,作为参数传入下一次调用,但 Promise 的话很可能是 pending,根本拿不到上一次调用的返回值。所以一般来说我们只能将 reduce 改成普通 FOR 循环:

let initialValue = Promise.resolve();

for (const hooks of postBuildHooks) {
initialValue = await hook(build);
}

而源码中对 reducer 函数进行了包装,将 hook 的执行放到 then 方法回调中,这样就可以保证调用顺序:

await postBuildHooks.reduce(
(queue, hook) => queue.then(() => hook(build as any)),
Promise.resolve();
)

vite 不支持 ie 11?configureBuild Hook 帮你定制 bundle 打包过程

📒 VS Code 如何快速定位到问题代码

在 TS 项目中,经常会因为类型问题出现报错,因此需要快速定位到问题代码。

在 VS Code 中可以使用 Ctrl + Shift + M 快捷键打开问题面板,可以看到当前文件中所有的 errors 和 warnings。此时,按 F8 可以依次跳转查看当前文件中的问题。

📒 20个GitHub仓库助你成为React大师

📒 从零开始实现一个简单的低代码编辑器

⭐️ 从arco-design的collapse组件分析如何吸收开源项目的知识

📒 模块联邦浅析

📒 我们是怎么在项目中落地qiankun的

📒 【第2631期】浅谈 Atomic CSS 的发展背景与 Tailwind CSS

📒 通过 JS 运行时堆快照进行 Web 爬虫

当网站提供的接口无法满足需求的时候(甚至可能连接口都没有),爬虫可能是一种不太理想的解决方案。虽然 Puppeteer 和 Playwright 使控制无头浏览器变得容易,但是获取你需要的数据,还是会很复杂。如果你可以从网站的页面堆中提取数据呢?Puppeteer Heap Snapshot 是这个实验的最终结果。

https://www.adriancooney.ie/blog/web-scraping-via-javascript-heap-snapshots

📒 JS 清空数组的方式

以下两种清空数组的方式有何区别:

let arr = [...];

// 这种是 immutable 的方式
// 即创建一个空数组,用该空数组指针替换原数组的指针
// 不影响其他引用原数组内存地址的变量
arr = [];

// 这种是 mutable 的方式
// 即直接修改原数组,不创建新数组,仍然是原数组指针
// 会影响其他引用原数组内存地址的变量
arr.length = 0;

📒 【零基础】充分理解WebGL(三)

📒 Go Error 处理最佳实践

📒 Map 对象小技巧

Map 对象可以记住键值对插入顺序,那么如何获取顺序呢?答案是通过迭代器接口。然后迭代器接口可以直接遍历,也可以转为数组,这样就变成获取数组第一个元素了。

按照这个思路,实际上也可以用 Map 实现队列

📒 Web3.0开发入门

📒 从源码中来,到业务中去,React性能优化终极指南

📒 剖析React核心设计原理—Virtual Dom

📒 前端工程化:保姆级教学 Jenkins 部署前端项目

📒 正则表达式完整指南

📒 【第2630期】javascript中的依赖注入

📒 【前端部署附录一】写给前端的 docker 使用指南

📒 Chrome 如何调试移动端 H5 页面

chrome://inspect/#devices

📒 支付宝体验科技 Umi 系列文章

Umi 4 特性 05:稳定白盒性能好的 ESLint

📒 如何回滚 Git 分支代码

# 找到需要回滚的版本哈希,执行 git reset
$ git reset --hard HEAD^
# 然后强制 push
$ git push -f -u origin pre

拜托,不要再问我Git如何回滚代码

📒 如何华丽的实现一套脚手架 - 以umicli和转转zzcli为例

📒 深入浅出 npm & yarn & pnpm 包管理机制

📒 一文带你进入微前端世界

📒 你还在手动部署埋点吗?从0到1开发Babel埋点自动植入插件

📒 一个三小时的 React Native 速成课

https://www.youtube.com/watch?v=VozPNrt-LfE

📒 使用 Three.js:一款流行的 3D JavaScript 库

https://betterprogramming.pub/working-with-three-js-the-popular-3d-javascript-library-bd2e9b03c95a?gi=8c31e429644f

📒 Next.js 后续规划的 RFC:即将到来的重大变化

https://nextjs.org/blog/layouts-rfc

📒 2022 年 React 状态管理库综述

React 的优势在于它可以灵活地适应不同的开发方式,其中也包括状态管理方面。这篇文章总结了几个流行的状态管理库,包括 Zustand、Recoil(来自 Facebook)、XState,当然还有 Redux。

https://www.albertgao.xyz/2022/02/19/react-state-management-libraries-2022/

📒 深入浅出前端做控制反转与依赖注入

⭐️ ⭐️ 现代 Monorepo 工程技术选型,聊聊我的思考

总结一下:

  • 使用 PNPM 作为 monorepo 项目的包管理工具
  • 使用 Changesets 作为 monorepo 项目的发包工具
  • 使用 Turborepo 作为 monorepo 项目多包任务执行工具

现代 Monorepo 工程技术选型,聊聊我的思考

📒 MySQL 主从,6 分钟带你掌握

📒 【第2628期】基于设计稿识别的可视化低代码系统实践

📒 前端配置化真香~上班又多了60%的摸🐟时间