📒 相关文章推荐
一个关于 useEffect
的可视化指南 — 奇怪的是,最受欢迎的文章出现在 2022 年的第一期中。作者创建了一系列 React 渲染的可视化指南文章(比如关于 useMemo 和 props 的文章),在这篇文章中他把注意力转向了 useEffect。如果你想了解更多,还有一个关于 头等函数如何工作的可视化演示
我们能承认 React Hooks 是个坏主意吗? — 第二受欢迎的项目是一个“快速链接”,但这个话题有足够的争议,让很多人谈论!Amy 认为“React Hooks 是个坏主意”。不管你喜不喜欢,你都会有自己的看法
https://medium.com/codex/can-we-all-just-admit-react-hooks-were-a-bad-idea-c48120c5188d
2022 React 库 — React 生态系统已经变得如此之大,问题更多的是选择太多,而不是没有需要的东西。如果您正在为一个新项目选择库,那么这个列表(Robin 多年来一直在更新)仍然很有用。希望我们能看到 2023 年的版本
回顾 2022 的 React 趋势 — 在今年年初,作者看了看他认为 2022 年重要的事情。他在 Remix、服务端渲染、并发渲染和行为测试方面做得很好,这些都是今年讨论最多的话题
https://www.chakshunyu.com/blog/what-you-should-definitely-look-out-for-in-react-in-2022/
Awesome React Components:一个精心整理的组件清单
React Render Tracker:发现有关意外重渲染的性能问题 — 这个工具可以显示组件树状态随时间变化的差异,这样您就可以更好地研究发生了什么
Plasmo:“它就像浏览器扩展的 Next.js” — 一个面向 React 和 TypeScript 的框架,用于构建您自己的浏览器扩展
<ClickToComponent />
:快速跳转到组件源代码
要避免的 10 个 React 反模式 — 一个精心呈现的 8 分钟视频,快速介绍了各种替代的更优方法(或至少值得斟酌)
📒 Golang 相关文章
new
:为变量分配存储空间,返回指针类型,一般不常用make
:为复合数据类型(slice
、map
、chan
)分配存储空间
在 Go 语言中,原生类型都有默认值,即类型的零值
- 布尔型的零值:
false
- 整型的零值:
0
- 字符串类型的零值:
""
- 指针、函数、接口、Slice、Map、Channel 的零值:
nil
需要注意的是,Go 语言类型的零值初始化是递归完成的,即 数组、结构体 的每个元素都进行零值初始化。
在 Go 语言中,推荐定义零值可用的结构体,不仅对程序的安全性和正确性非常重要,它还可以无需预先显式初始化即可直接使用,使 Go 程序代码更优雅。
总结一下,短变量声明在同一作用域内重复使用,只是重新赋值,不会重新创建变量(即指针还是同一个),但是如果在不同作用域(例如 if
语句块),就会创建一个新的变量(内存地址与之前不同)。
Go 语言怎么解决编译器错误“err is shadowed during return”
Go 语言错误处理为什么更推荐使用 pkg/errors 三方库
总结一下:
unsafe.Pointer
主要用来实现 指针类型转换,任意指针类型*T
都可以转换为unsafe.Pointer
,unsafe.Pointer
可以转换为任何类型的指针值*T
uintptr
主要用来实现 指针运算,实际是数值类型,可以用于存储内存地址。将unsafe.Pointer
转换为uintptr
,然后使用uintptr
值进行算术运算,最后将运算结果uintptr
值再转换为unsafe.Pointer
显式类型转换:
// 整型变量省略类型,编译器根据字面量推导默认是 int
var a = 100
a := 100
// 如果需要声明指定类型的整型变量,也可用显式类型转换,例如:
var a = int8(100)
b := int8(60)
变量声明块:
var (
a int = 100
b int = 200
)
var (
c = 300
d = 3.14
f = true
)
var (
e, f, g int = 10, 20, 30
h, i, j string = "a", "b", "c"
)
📒 天呐!我用 go 从零开始写了一个 k8s 应用管理工具(附完整代码和开发过程)
📒 在 Docker build 环境持久化 node_modules
目录
想在 docker build 环境中持久化 node_modules
需要使用到 BuildKit
的 mount
功能,该功能有几个前置条件:
- docker 版本必须高于 18.09
BuildKit
需要手工启用,可在 docker build 命令前添加环境变量DOCKER_BUILDKIT=1
启用- 如果前两个条件不满足,则需要具备 Jenkins 和构建机的读写权限,以调整构建环境参数
- 修改 Dockerfile,使用
RUN --mount=type=cache
运行npm install
和npm run build
指令(--mount=type=cache
)
开启 BuildKit 还有其他特性,比如输出日志更友好,基本每一步都会输出耗时,就这一条,值了!
实际操作分为 2 步:
修改 Jenkins 配置,在 docker build 命令前加上环境变量。修改后镜像构建命令长这样:
$ DOCKER_BUILDKIT=1 docker build .
修改 Dockerfile,将 RUN npm install
和 RUN npm run build
指令前面加上 RUN --mount=type=cache npm xxx
:
FROM node:alpine as builder
WORKDIR /app
COPY package.json /app/
RUN --mount=type=cache,target=/app/node_modules,id=my_app_npm_module,sharing=locked \
--mount=type=cache,target=/root/.npm,id=npm_cache \
npm i --registry=https://registry.npmmirror.com/
COPY src /app/src
RUN --mount=type=cache,target=/app/node_modules,id=my_app_npm_module,sharing=locked \
npm run build
参考:
Docker 从入门到实践 - 使用 BuildKit 构建镜像
https://docs.docker.com/build/buildkit/
⭐️ 【第2823期】打包JavaScript库的现代化指南
⭐️ 通过分析gin、beego源码,读懂web框架对http请求处理流程的本质
📒 这两个特性将在 Go1.20 中被弃用,受影响最大的居然是国内的面试官
📒 Go语言中常见100问题-#25 Unexpected side effects using slice append