周报 #1 - Google 是如何防止别人冒充 Google 的; 简约而不简单,复杂未必高明;你不知道的 tsconfig
本系列文章的初心是记录我阅读英文文章的过程,同时也是为了更好的监督自己学习,最终打算采用这类似周报形式来分享出来,关于内容我会尽量挑选一些有价值的文章来分享。
希望这些内容能为你们带来一些收获。
有关 TLS/SSL 证书的一切
All I Know About Certificates -- Certificate Authority | PixelsTech
All I Know About Certificates -- Clients | PixelsTech
All I Know About Certificates -- Websites | PixelsTech
在建立网站连接时,证书的作用常被忽略。
当我们访问一个网站时,最熟悉的过程可能就是「三次握手,四次挥手」。个人觉得出现这个现象的原因有:一方面是大学教材比较旧没有这些内容,另一方面可能是证书虽然很重要,但在这个过程中只是起验证作用,其创建证书的流程并没有包含在里面。
上述系列文章帮助理解 CA、客户端、网站三者在 TLS/SSL 连接中扮演着怎样的角色,以及证书是如何解决一些问题的:Google 是如何防止别人冒充 Google 的,证书为什么会频繁出问题等等。
提示:这系列的文章难度很低,不涉及数学内容,最多就是几个 openssl 命令,篇幅较长,读者可以打开一瓶啤酒,慢慢阅读。想更不动脑的,更有中文 原文 支持阅读。
另外,如果想对从零开始创建证书以及想详细探索证书内容的读者,可以阅读这篇文章: Exploring TLS certificates and their limits - 0x00,作者在探索过程中总想着做一些「疯狂、有趣」的事情,这可能也就是「苦中作乐」来保持自己的活力吧。
简约是优点,但复杂化更被追崇?
Simplicity is An Advantage but Sadly Complexity Sells Better
有时我们听到过论文投稿因为过于简单被拒,职位晋升因为工作缺乏复杂性而被否决。我认为可以引用下面这段话解释:
“Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make matters worse: complexity sells better.” — Edsger Dijkstra
「复杂」常被认为是努力、工作量和功能多的象征,很多人因此追求复杂化,但正是由于这种想法让我们陷入了另一种处境:复杂可以更能体现自己优势。最终这让我们陷入了一种「复杂性偏见」中。
简单与复杂之间,人们总是倾向于选择复杂,因为复杂总给人感觉更高级,或者让人误以为更高级。
通常人们在未使用一个软件之前,往往根据功能数量来判断软件质量。
简约并不意味着工作量少,往往需要付出更多的努力。其实很多时候我们想要表达的是我们为了解决问题付出多少努力,但你应该追寻用合适的方式表达出解决问题的工作量,而不是盲目的追求复杂化。
尝试将复杂的问题简单化,复杂的系统更应该用简单的模块系统。
我们更应该关注问题的复杂性,而不是关注解决方案的复杂性。
tsconfig 中你不知道的 include 和 references
One Thing Nobody Explained To You About TypeScript - kettanaito.com
这篇文章讲的案例并不是你从来没听说过,也很可能永远用不上的臆想出来的角落案例。恰恰正相反,这是每个 Ts 开发者会经常直接与它交流的案例。
include
和 references
都涉及到 Typescript 编译器对「源文件」(开发者编写的 ts 文件)的可见性,但他们是用不同的方式做到这一点。
include
include
, controls which files are _affected_ by this configuration;
如果 test 目录没有单独的配置文件,而像下面的 include 包含了 test 目录,这样测试框架的 vitest 的类型定义就会泄漏到 src 目录下,对于 src 来说这是一些「幽灵类型定义」。
// tsconfig.json
{
"compilerOptions": {
"types": ["vitest/globals"]
},
"include": ["src", "test"]
}
所以,正确的操作是需要多个 configuration。
# The source files configuration.
- tsconfig.src.json
# The build configuration.
- tsconfig.build.json
# Configuratin for integration tests.
- tsconfig.test.json
references
references
, controls which files are _visible_ to this configuration but not affected by it.
有时候我们需要再 test 下引用 src 下的文件用于更好的测试,同时需要 test configuratin 又不会影响 src 的源文件,这个时候就需要 references
属性了.
// tsconfig.test.json
{
"extends": "./tsconfig.json",
"include": ["./tests"],
"references": [{ "path": "./tsconfig.src.json" }],
"compilerOptions": {
"composite": true,
"target": "esnext",
"module": "esnext",
// Include test-specific types.
"types": ["@types/node", "vitest/globals"]
}
}
具体的实践项目,Vite 就可以作为一个很好的案例。