Skip to main content

2023/09/10

这是这个专栏的第一期,创建这个专栏的目的如其名,在周末抽点时间消化下上周收藏和想要学习精进的内容。不过笔记内容可能会不够深入,重在补充知识广度。当然深入点可能就偏向于写篇博客来补充了

Typescript 5.3

不知不觉已经迭代到 5.3 了,这个版本的 First Look 可以参考 https://www.totaltypescript.com/typescript-5-3

我比较好奇的是下面这个语法:

const id = user.id || throw new Error("userId is required");

不过现在只在 Stage 2 阶段,还远着

还有一个字符串的宽松自动补全

type IconSize = "small" | "medium" | "large" | (string & {});
const icons: IconSize[] = [
"small",
"medium",
"large",
"extra-large",
"anything-goes",
];

5.3 可能会实现一个使这个 hack 不必要的新特性,可以使用 string 作为类型并获得相同的自动补全:

type IconSize = "small" | "medium" | "large" | string;

ECMAScript 新提案

异步上下文 AsyncContext.VariableAsyncContext.Snapshot,详情参考 https://github.com/tc39/proposal-async-contexthttps://blog.logrocket.com/understanding-async-context-future-server-side-javascript/

按照提案描述的场景,其实也很好理解:

function program() {
const value = { key: 123 };
try {
shared = value;
implicit();
} finally {
shared = undefined;
}
}
let shared;
async function implicit() {
assert.equal(shared.key, 123);
await 1;
// 在await异步任务执行完时,其实shared变量已经被赋值undefined
assert.throws(() => {
assert.equal(shared.key, 123);
});
}
program();

解决方案的思路其实在于保存一个独立的上下文,确保同个上下文中的变量唯一,如下代码:

const shared = new AsyncContext.Variable();
shared.run("top", () => {
console.log(shared.get()); // 'top'
// 支持嵌套,在内部函数执行期间采用新值,执行完成后恢复为外层函数的值
// shared.run("top2", () => {})
});

AsyncContext.Snapshot 用于捕获特定时间点所有 AsyncContext.Variable 实例的状态

const shared = new AsyncContext.Variable();
shared.run("top", () => {
const snapshotDuringTop = new AsyncContext.Snapshot();
shared.run("top2", () => {
// const snapshotDuringTop2 = new AsyncContext.Snapshot();
snapshotDuringTop.run(() => {
console.log(shared.get()); // 'top'
});
});
});

TailwindCSS

这玩意出很久了,不过一直没机会在实际项目中用到,不是必需品,但听说用过的大部分都说香

使用之前都要考虑一个问题,就是原子化 CSS(Atomic/Utility-First CSS)和语义化 CSS(Semantic CSS) 的对比

语义化,比如写一堆类名去标识某类元素,可能还要遵循 BEM 的规则。比如下面类名就是一个简单的用户卡片的样式

.user-card {
padding: 20px 16px;
margin-top: 16px;
line-height: 1.4;
align-items: center;
}

原子化,将独立样式抽成原子(简写名),将这些原子进行积木式拼凑

<div class="p-6 max-w-sm mx-auto bg-white rounded-xl shadow-lg flex items-center space-x-4">
...
</div>

其实粗略看来,各有优劣,可以参考下卡颂大佬的文章 想明白这点,就知道 TailwindCSS 适不适合你