From 6ba051fa1ba4e23ee47adef5553263ef654e6008 Mon Sep 17 00:00:00 2001
From: muqiuhan [^1]: Decipad 博客 “Collaborative and Offline Editing Using CRDTs” [^2]: Hacker News 讨论(CRDT 相关线程)
https://www.decipad.com/blog/decipads-innovative-method-collaborative-and-offline-editing-using-crdts
https://news.ycombinator.com/item?id=38289327
https://github.com/commandlineparser
在这个 PR 中支持了 Native AOT
https://github.com/commandlineparser/commandline/pull/913
除此之外,还有一个更加精巧的 F# 库可以用,只有两百多行:
https://github.com/B2R2-org/FsOptParse/
AOT 后的大小很可观,并且支持 full trim.
-用例:
-(** defines a state to pass to the option parser *) |
在这个 PR 中支持了 Native AOT
https://github.com/commandlineparser/commandline/pull/913
除此之外,还有一个更加精巧的 F# 库可以用,只有两百多行:
https://github.com/B2R2-org/FsOptParse/
AOT 后的大小很可观,并且支持 full trim.
+用例:
+(** defines a state to pass to the option parser *) |
@tanstack/svelte-query 和 runed.dev 的 useIntersectionObserver,构建一个通用的、可复用的惰性加载组件。
+核心依赖与环境
+Svelte 5: 本实现依赖于 Svelte 5 的符文(Runes)特性,它提供了更精细、更直观的状态管理能力。
+@tanstack/svelte-query: TanStack Query 的 Svelte 适配版,用户获取数据。
+runed.dev: 一个提供多种 Svelte 5 实用工具的库,本文主要使用其 useIntersectionObserver。
该方案的核心思想是将“何时加载”与“如何加载”这两个关注点进行解耦。
+何时加载 (When to Load): 组件的可见性决定了数据加载的时机。我们利用 Intersection Observer API 来精确、高效地监听一个元素是否进入 viewpoint。runed.dev 库为此提供了名为 useIntersectionObserver 的便捷封装。
如何加载 (How to Load): 数据获取、缓存、同步和状态管理的复杂性由 @tanstack/svelte-query (TanStack Query) 处理。它提供了一套强大的工具集来管理异步数据。
通过将这两者结合,可以创建一个名为 LazyQuery 的抽象组件。该组件内部处理可见性检测,并根据检测结果动态控制 TanStack Query 的执行,而将具体的查询逻辑(queryFn)和键(queryKey)完全交由使用者定义。
LazyQuery 组件的实现++目标:封装惰性加载逻辑,并向外暴露一个标准的 TanStack Query 接口。
+
一、对组件的接口类型做如下定义:
+import type { CreateQueryOptions, QueryKey } from '@tanstack/svelte-query'; |
二、组件逻辑:
+<script lang="ts"> |
div 元素作为哨兵(sentinel),并用 bind:this={el} 将其 DOM 引用绑定到变量 el。useIntersectionObserver 接收一个返回目标元素的函数 () => el。isIntersecting 是一个布尔值的符文(rune),当 div 元素进入 viewpoint 时为 true,否则为 false。rootMargin: '200px' 是一个优化选项,它会在元素距离 viewpoint 还有 200px 时就触发加载,从而提升用户体验。使用 LazyQuery 组件非常直观。开发者只需关注数据获取的业务逻辑,而无需关心惰性加载的实现细节,假设有一个获取图表数据的场景:
<script lang="ts"> |
LazyQuery 组件被渲染,但由于其 div 在 viewpoint 之外,isIntersecting 为 false。createQuery 被调用,但因为 enabled 条件为 false,查询处于禁用状态,不会发起任何网络请求。children 片段被渲染,此时 query.isLoading 为 true(这是 TanStack Query 禁用查询时的初始状态),显示 “Loading chart data…”。div 元素进入 viewpoint(或进入 200px 的预加载区域)。useIntersectionObserver 将 isIntersecting 的值更新为 true。createQuery 的 enabled 访问器捕获,查询被自动激活,queryFn 开始执行。isFetching, data, error),并驱动 children 片段内的 UI 自动更新。Rimon Tawadrous 在其 GitHub repo 中的测试,对比 100 万条逐条插入实验,UUID v7 相较 UUID v4 在单线程插入上速度快约 3.24%,多线程下更可观【1】。
参考链接
[1] “为什么 UUID 7 比 UUID 4 更适合作为 RDBMS 的聚集索引?” dbaplus.cn
https://dbaplus.cn/news-160-6313-1.html
[2] “PostgreSQL and UUID as primary key” maciejwalkowiak
https://maciejwalkowiak.com/blog/postgres-uuid-primary-key/
[3] “Optimised UUIDs in mysql” stitcher
https://stitcher.io/blog/optimised-uuids-in-mysql
[3] “Storing UUID Values in MySQL” percona
https://www.percona.com/blog/store-uuid-optimized-way/
Number.toString()的实现, 以V8为例。
+
+在很多地方都能看到:
+*isolate->factory()->NumberToString(value); |
例如 /src/builtins/builtins-number.cc 中。
+下面看看NumberToString的定义, 应该是在 src/heap/factory-base.cc 中:
template <typename Impl> |
可以看到这里调用了 SmiToString, 这里不往下翻这个函数的定义, 只需要知道Smi是什么即可。 Smi 是一种特殊的整数类型,它被用于表示较小的整数值,通常在 32 位系统中是 31 位有符号整数。Smi 类型的值存储在指针的低位,而指针的高位用于标记该值是一个 Smi 类型。IsSmi 函数会检查给定的值是否为 Smi 类型,如果是,则返回 true,否则返回 false。这个函数通常用于 V8 引擎内部的优化和性能优化。
所以NumberToString会判断number是否是一个smi, 如果是的话就调用SmiToString, 否则会尝试将其转换为double再去调用DoubleToSmiInteger, 将DoubleToSmiInteger的调用结果存在smi_value里面, 再通过调用SmiToString将smi_value转换为字符串。
如果这两条路都行不通的话,就直接调用HeapNumberToString了。
HeapNumberToString的定义如下:
template <typename Impl> |
就是熟知的NaN, Undefined处理,重点在:
+char arr[kNumberToStringBufferSize]; |
这里调用了DoubleToCString, 其定义在 /src/numbers/conversions.cc 中:
const char* DoubleToCString(double v, base::Vector<char> buffer) { |
不用过多解释, 已经很清晰了, FastD2I 就是 Fast Double to Integer的意思, 定义如下, 注释也很详尽:
// The fast double-to-(unsigned-)int conversion routine does not guarantee |
以上
]]>Number.toString()的实现, 以V8为例。
-
-在很多地方都能看到:
-*isolate->factory()->NumberToString(value); |
例如 /src/builtins/builtins-number.cc 中。
-下面看看NumberToString的定义, 应该是在 src/heap/factory-base.cc 中:
template <typename Impl> |
可以看到这里调用了 SmiToString, 这里不往下翻这个函数的定义, 只需要知道Smi是什么即可。 Smi 是一种特殊的整数类型,它被用于表示较小的整数值,通常在 32 位系统中是 31 位有符号整数。Smi 类型的值存储在指针的低位,而指针的高位用于标记该值是一个 Smi 类型。IsSmi 函数会检查给定的值是否为 Smi 类型,如果是,则返回 true,否则返回 false。这个函数通常用于 V8 引擎内部的优化和性能优化。
所以NumberToString会判断number是否是一个smi, 如果是的话就调用SmiToString, 否则会尝试将其转换为double再去调用DoubleToSmiInteger, 将DoubleToSmiInteger的调用结果存在smi_value里面, 再通过调用SmiToString将smi_value转换为字符串。
如果这两条路都行不通的话,就直接调用HeapNumberToString了。
HeapNumberToString的定义如下:
template <typename Impl> |
就是熟知的NaN, Undefined处理,重点在:
-char arr[kNumberToStringBufferSize]; |
这里调用了DoubleToCString, 其定义在 /src/numbers/conversions.cc 中:
const char* DoubleToCString(double v, base::Vector<char> buffer) { |
不用过多解释, 已经很清晰了, FastD2I 就是 Fast Double to Integer的意思, 定义如下, 注释也很详尽:
// The fast double-to-(unsigned-)int conversion routine does not guarantee |
以上
]]>