# introduction

## 2020-10-20\[好文]

相信你在工作中一定用过堡垒机， 大中型公司都会有堡垒机。有的是自建，也有的是用的开源系统。它究竟是什么？做了什么事呢？

[「系统架构」什么是堡垒机？为什么需要堡垒机？](https://mp.weixin.qq.com/s/ptzcIjRePFd_K8_8IiqXfg) 是一个介绍堡垒机的科普文，看我你或许就有答案了。

地址：<https://www.toutiao.com/i6881462700229329421/>

## 2020-10-17\[工具]

不知道你有没有碰到过这样的问题： 你同是开发多个项目，每个项目依赖的 node 和 npm 版本都不一样， 他们彼此不兼容。 你需要在切换项目前修改你的 node 和 npm 版本（当然也可能是其他包管理器，比如 yarn）。你可以使用 nvm 等工具来帮助你，同是在项目的 package.json 中定义一个 engineer 字段，用于指定项目依赖的 node 版本。

这虽然可以解决问题， 但是每次都切换也很浪费时间。 没有使用 volta 时，我的方式是开启多个 tty，每个 tty 的 node 版本不同， 当你切换项目使用对应的 tty 即可。

不过当你使用了 volta，一切会变得不同。volta 可以帮助你管理项目的引擎依赖， 支持 npm， yarn 等宝管理工具。 快来用 volata 管理你的项目包管理器吧。

地址：<https://docs.volta.sh/guide/understanding#managing-your-toolchain>

## 2020-10-16\[工具]

一个可以将 TypeScript 转换为 webassembly 的工具。这意味着你可以用 JS 写 webassembly，获得更好的性能。

地址：<https://github.com/AssemblyScript/assemblyscript>

## 2020-10-15\[工具]

RSLint 是一个用 Rust 写的 lint 工具。 规则挺有意思的， 最关键的是性能好， 其比用 JS 写的 linter 快很多，比如 eslint。

地址：<https://rdambrosio016.github.io/RSLint/index.html>

## 2020-10-14\[行业人物]

在一个圈子中混，怎么能不知道这个行业的领军人物呢？ 今天给大家推荐的是 20 个前端领域的领军人物。

> 你关注了几个？

地址：<https://blog.newrelic.com/technology/javascript-nodejs-developers/?utm\\_campaign=FY21-Q3-DEV-OBSV-AMER-JSW-NL-SL-B\\_JN\\&utm\\_medium=NL\\&utm\\_source=JSW\\&utm\\_content=B\\_JN>

## 2020-10-13\[好文]

我在 [数据结构与算法在前端领域的应用 - 第三篇](https://lucifer.ren/blog/2019/09/20/algorthimn-fe-3/) 中的`重新思考我们的前端应用`小节提到了**假如流行的前端框架比如 React 内置了这种线程分离的功能，即将调和算法交给 WebWorker 来处理，会给前端带来怎么样的变化？**。 这绝对不是异想天开，比如今天给大家分享的这一个文章的观点就很好地印证了这一点。

地址：<https://blog.asayer.io/redux-in-web-workers-off-main-thread-redux-reducers-and-middleware>

## 2020-10-12\[资料]

vue3 出来了，大家都开始学了起来。这里有一份 vue3 学习资料的集合，或者可以帮助你。

![](https://p.ipic.vip/xnhx4z.jpg)

地址：<https://github.com/gautemo/vue-3-playground>

## 2020-10-10\[书籍]

给大家安利一本书现代操作系统（第 4 版），豆瓣评分 9.1。很多人推荐的一本书， 读完绝对有巨大的收获。

如果实在觉得读起来吃力，可以关注一下小林和 cxuan，这两个人对操作系统的理解还是蛮深刻的，文章通俗易懂。

## 2020-10-09\[工具]

figlet.js 是一个用于生产 FIGfont 规范的一个 JS 库。效果图：

![](https://p.ipic.vip/p8m8f1.jpg)

地址：<https://github.com/patorjk/figlet.js>

## 2020-10-08\[工具]

我们平常使用 vue 或者 react 脚手架生产的项目的时候， 启动项目会自动打开浏览器， 你可以借助这款工具实现这个效果。

用法：

```js
const open = require("open");

(async () => {
  // Opens the image in the default image viewer and waits for the opened app to quit.
  await open("unicorn.png", { wait: true });
  console.log("The image viewer app quit");

  // Opens the URL in the default browser.
  await open("https://sindresorhus.com");

  // Opens the URL in a specified browser.
  await open("https://sindresorhus.com", { app: "firefox" });

  // Specify app arguments.
  await open("https://sindresorhus.com", {
    app: ["google chrome", "--incognito"],
  });
})();
```

地址：<https://github.com/sindresorhus/open>

## 2020-10-08\[教程]

一个 30 天免费学习的网站，适合基础薄弱的前端。

![](https://p.ipic.vip/21ccmw.jpg)

<https://javascript30.com/>


# 最新

![](https://p.ipic.vip/2in7io.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

在线阅读：<https://leetcode-solution-leetcode-pp.gitbook.io/mz-ri-yi-jm/>

电子书文件太大， 大家可到我的公众号《脑洞前端》回复“每日一荐”获取。

## :newspaper:   RSS

大家可以用 Github 提供的 [RSS](https://github.com/azl397985856/daily-featured/commits.atom) 来订阅我的仓库更新。

## 图片加载不出来如何解决？

<https://github.com/fe-lucifer/fanqiang>

## :calendar:《91 天学算法》限时活动

很多教育机构宣传的 7 天，一个月搞定算法面试的，我大概都了解了下，不怎么靠谱。学习算法这东西，还是要靠积累，没有量变是不可能有质变的。还有的人选择看书，这是一个不错的选择。但是很多人选了过时的或者质量差的书，又或者不会去写书中给的练习题，导致效果很差。

基于这几个原因，我组织了一个 91 天刷题活动，通过一个相对比较长的时间（91 天）给出最新的学习路径，并强制大家打卡这种高强度练习来让大家**在 91 天后遇见更好的自己**。详细活动介绍可以点下方链接查看。另外往期的讲义也在下面了，大家可以看看合不合你的口味。

最后送给大家一句话： **坚持下去，会有突然间成长的一天**。

[点此参与](https://github.com/azl397985856/leetcode/discussions/532)

![](https://p.ipic.vip/plj0jz.jpg)

* 🔥🔥🔥🔥 [活动首页](https://leetcode-solution.cn/91) 🔥🔥🔥🔥
* [91 第三期讲义 - 二分专题（上）](https://github.com/azl397985856/leetcode/blob/master/thinkings/binary-search-1.md)
* [91 第三期讲义 - 二分专题（下）](https://github.com/azl397985856/leetcode/blob/master/thinkings/binary-search-2.md)

## 1V1 辅导

如果大家觉得上面的集体活动效率比较低，我目前也接受 1v1 算法辅导，价格根据你的算法基础以及想要学习的内容而定感兴趣的可以加我微信，备注“算法辅导”，微信号 DevelopeEngineer。

## 新鲜出炉 (2025-03)

### 2025-03-05\[web3]

现在很多币都是固定时间解锁，这给币价上涨带来压力。赵长鵬提出了一种新的解锁机制。

根据赵长鹏的设计,特设小组将首先解锁10%的令牌,并在令牌发行开始时将其投放市场。筹集的资金将用于满足业务需求,例如产品开发,营销和工资单。但是,将来的令牌解锁将受到严格的条件约束,包括至少六个月的间隔,价格需要达到最后一次解锁价格的两倍,并持续30天,并且单个解锁比率不得超过5%。

例如,假设令牌在首次发行时的定价为$ 1,如果六个月后价格未达到$ 2,则无法解锁更多令牌。假设在7个月4到8个月3期间价格稳定在$ 2以上,则最多可以在8月3日解锁5%的令牌。如果当天的价格为3美元,则最早的解锁时间是次年的3月3日,价格需要超过6美元并稳定30天。

但是模型本身不是完美的，比如解锁 10% 后直接跑路，但至少解决了一部分问题。如果靠谱的团队再加上靠谱的模型，我相信没有谁能拒绝。

### 2025-03-04\[知识]

现在很多的 ai 编程工具并不了解你的代码仓库，比如不了解你的项目结构，约定以及依赖等等。所以写的代码并不是你想要的。你需要不断调整，这很浪费时间。另外一个 ai 编程工具则直接全部扫描你代码，这会导致两个问题：

1. 有些隐私数据不想被访问和学习
2. 有些是外部文件或者屎山代码，不需要学习它的写法

如果可以提供一个类似 gitignore 的配置文件，让 ai 编程工具只扫描你想要学习的部分，而不是全部代码，这将会大大提高效率。这就像互联网早起的 robots.txt 文件一样，它可以帮助搜索引擎更好的索引你想要的内容。

现在有一些工具明确支持，比如 augmentcode，我觉得这是一个不错的实践。希望 ai 编程工具的规范越来越完善，减少使用者的认知成本和学习负担。

### 2025-03-03\[算法]

前一段时间 deepseek（有时候简称 ds）很火，很多人竟然公开教别人如何部署 ds 赚钱，竟然还有很多人买。实际上部署 ds 非常容易，只需要按照文档操作几分钟就好了。这让我感受到了“信息差真的很容易赚钱”。大家可以参考这个文章的部分，几分钟就搞定了。

via: <https://blog.lovefc.cn/archives/start.html>

### 2025-03-01\[工具]

一个 chrome 扩展工具，可以自动将你的视频作品同步到多平台。如果你在做自媒体，并且主攻视频方向，可以试下。

我之前主打文字方向，使用过另外一个类似的工具 openwrite, via <https://openwrite.cn/，只不过那个是自动同步> markdown 文章到多个平台。效果没有自己手动好，比如 tag 等各个平台特有的东西很多都无法做到完美适配。但是确实省时间。

via: <https://github.com/leaper-one/MultiPost-Extension>

## 历史汇总

* [SUMMARY](https://github.com/azl397985856/daily-featured/blob/master/SUMMARY.md)

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)

大家也可以加我微信好友进行交流！

![](https://p.ipic.vip/p6dekr.jpg)

## 贡献

* 如果有想法和创意，请提 [issue](https://github.com/azl397985856/daily-featured/issues) 或者进群提
* 如果想贡献代码，请提 [PR](https://github.com/azl397985856/daily-featured/pulls)
* 如果需要修改项目中图片，[这里](https://github.com/azl397985856/daily-featured/blob/master/assets/README.md) 存放了项目中绘制图的源代码， 大家可以用 [draw.io](https://www.draw.io/) 打开进行编辑。

## License

[Apache-2.0](https://github.com/azl397985856/daily-featured/blob/master/LICENSE/README.md)


# 2024-11

![](https://p.ipic.vip/0bhil1.jpg) ![](https://p.ipic.vip/0bhil1.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2024-11

### 2024-11-30\[好文]

一个 AI 工具，允许你使用自然语言编写基于浏览器的集成测试的测试用例。只需要：

1. 配置好你的 openapi 秘钥
2. 用自然语言描述：Action，query，assertion。Action 就是你想要做什么，query 是你想要获取什么信息，assertion 是你期望的结果。
3. 点击 Run 按钮，即可得到一个可以直接运行的测试用例。

![](https://p.ipic.vip/hjrnz2.png)

via: <https://github.com/web-infra-dev/midscene>

### 2024-11-29\[好文]

自从有了 url 这个东西，人们就在考虑是否有一种方式可以直接链接到页面的某个地方，于是锚点就出现了。那么如果想直接链接到页面的某一句话呢，甚至更复杂的 pattern 呢？类似于我们 ctrl + f 的效果。于是 Text fragments（文本片段）出现了。这篇文章介绍了 Text fragments 的用法。

via: <https://alfy.blog/2024/10/19/linking-directly-to-web-page-content.html>

### 2024-11-27\[网站]

和普通的文件分享不同，它需要两个客户端同时在线。两个客户端都是独立的，都可以发送和接受文件。

使用方法很简单，只要输入对方的 code 就好。如图 WKXR 就是当前自己的 code。我们需要输入的是对方的 code，然后点击输入框右边的链接即可。比如这里输入了 3JE9，就是和 code 为 3JE9 的客户端链接。

![](https://p.ipic.vip/8znnqc.png)

链接后可以发送文件，接受文件，甚至可以收发消息。

这在你需要分享一些东西，但是又不想留在互联网上被别人看到有用。

> 虽然分享文件可以设置密码，但是还是会被看到。这种点对点的方式还是比设置密码更安全。

via:

### 2024-11-26\[好文]

文章分享了六条 shell 编写技巧。完整六条如下：

1. 全面的错误处理和输入验证。包括用法错误、文件不存在等
2. 清晰多彩的输出。包括颜色、格式、表格等
3. 详细进度报告。类似于 debug 日志
4. 使用“set -e”和“set +e”进行策略性错误处理。在不需要停止脚本的情况下，可以跳过错误，需要的时候再开启。
5. 特定于平台的调整。如果你的脚本需要运行在多个平台则需要考虑。另外即使你的用户只在一个平台使用，但测试机可能在另一个平台，因此这种情况也需要额外考虑。
6. 多次运行的时间戳文件输出。每次运行都用时间戳作为文件名生成日志（由于第三条的铺掉，我们只需要将其重定向到文件即可），可以帮助你跟踪脚本的运行情况。

via: <https://nochlin.com/blog/6-techniques-i-use-to-create-a-great-user-experience-for-shell-scripts>

### 2024-11-24\[好文]

一个讲如何缩小 git 仓库体积的文章。文章说他将 git 仓库体积缩小了 94% ！

我之前就经手过一个非常大的 mono 仓库，各种语言的项目都放在里面，体积非常大。每次同步都很久，后续甚至不得不通过减少 depth 来减少同步时间。

作者做了以下两点来缩小仓库体积：

1. Don't keep thousands of things in a single folder. 不要将数千个东西保存在一个文件夹中。
2. git repack -adf --path-walk 可以将仓库打包压缩，减少体积。如果你在大型 monorepo 中工作，并且您有 CHANGELOG.md 或实际上任何具有相对较长名称（>16 个字符）且反复更新的文件，您可能需要密切关注这条路径东西。

你还可以尝试新的 git survey 命令来查看各种新的启发式方法，例如按磁盘大小排列的热门文件、按膨胀大小排列的热门目录或按膨胀大小排列的热门文件。这些启发式方法将帮助您了解路径行走工作是否也会影响你的仓库大小。

![](https://p.ipic.vip/ko61lh.png)

via: <https://www.jonathancreamer.com/how-we-shrunk-our-git-repo-size-by-94-percent>

### 2024-11-22\[工具]

一个在线制作印章的工具，开源的时间不久，但是功能已经很完善了。你可以通过这个工具制作一个印章，然后下载下来，用于你的文档或者其他地方。代码是开源的，仓库甚至连 license 都没有，你可以自己部署到自己的服务器上。

另外一个功能看起来更多，但是不提供源代码，只能在线使用。<https://btbsm.com/ovalseal4>

via: <https://github.com/xxss0903/drawstamputils>

### 2024-11-12\[网站]

一个在线抓取博客的网站，可以抓取 微信公众号，CSDN，博客园，简书，掘金，思否。输出支持 HTML,Markdown,PDF,MHTML

个人认为比较有用的是输出 markdown 格式，可以直接导入到博客编辑器中。输出 markdown 其实一个反过程。比如 markdown 的 `[title](link)` 转化为 html 的时候会变成 `<a href="link">title</a>`，但是在博客编辑器中，自动解析 `<a href="link" title="title">title</a>` 然后转化为 `[title](link)`。 虽然听起来很简单，但是不同的网站兼容性可能不一样，所以还是需要注意一下。这也是它只支持这几个博客网站，而不是全部的博客网站的原因。

via: <https://www.blog-keeper.com/>

### 2024-11-06\[工具]

如果你是一个站长，可能有过接入第三方登录的经历。第三方登录可以让用户更方便的登录你的网站，同时也可以减少用户的注册成本。

比如我自己的网站： <https://leetcode-solution.cn/91> ，我就接入了 github 登录，但是我并没有实现后端。如果你只是想识别一下用户，或许我这种就够了。你如果你不满意于此，可以尝试下 workos。

![](https://p.ipic.vip/wlju64.png)

workos 是一个可以帮助你接入第三方登录的工具，但是接入你需要自己实现后端，但是支持的第三方更多，定制化更高，如果你有这方面的需求，可以考虑一下。

via: <https://workos.com/docs/user-management/vanilla/nodejs>

### 2024-11-05\[经验]

随着 AI 的不断发展。现在多了很多自然语言编程的产品，有了它们，你可以通过自然语言来编程，而不需要写代码。

比如：

* <https://github.com/corbt/agent.exe>
* <https://github.com/guoriyue/LangCommand>
* <https://github.com/Skyvern-AI/Skyvern>

目前我的体验是：

1. 这些产品还不够成熟，比如我明确告诉它，它的解决方案有问题，并进行了解释，它还是无法理解，给出错误的解法，以及错误的解释。但是它们的出现确实给了我们一些启示，未来的编程可能会变得更加简单。
2. 有些时候使用自然语言效率更低。比如我想查看 git 的日志。直接输入 git log 就好了。如果是自然语言很难比这个更快。
3. 自然语言有什么有歧义。做过开发，对接产品的人应该都知道，需求文档中的需求有时候就是有歧义的，这个时候就需要沟通。自然语言编程也是一样，有时候你的自然语言描述可能会有歧义，这个时候就需要沟通。而这个沟通的成本可能会比直接写代码高。当然如果你压根不会写代码，那么这个成本可能就不算什么了。

### 2024-11-04\[好文]

如果你使用 git 来管理你的代码。并且在某一天突然遇到一个 bug，你只知道上个 release 是好的。但是距离上个 release 已经有非常多提交了。

正常的人第一想法通常是使用二分的方法来找到这个 bug 的提交。但是这个方法有一个问题，就是你需要一个一个找到具体的 commit，然后 checkout ，再测试，这个过程是非常繁琐的。

这篇文章介绍了一个命令 `git bisect`，这个工具可以帮助你快速定位 bug 的提交。具体的使用方法可以参考这篇文章。

via: <https://www.mikebuss.com/posts/debugging-till-dawn>

### 2024-11-01\[经验]

你有没有遇到过使用了代理，但是谷歌搜索出来的东西还都是中文，即使你使用了英文关键字来搜索。甚至使用了隐身模式也不行。

这其实有很多可能，这里提供几个思路。

1. 使用 google 高级搜索技巧，按语言来搜索。比如 `language:en lucifer.ren`
2. 修改你的系统语言为英文，然后再搜索。
3. google 判定你的 IP 是中国人在使用，尽管你的代理 IP 可能是美国，所以你可以尝试换个代理来解决。
4. DNS 命中到了 google 中国的服务器，你可以尝试修改 DNS 。

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2024-08

![](https://p.ipic.vip/0bhil1.jpg) ![](https://p.ipic.vip/0bhil1.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2024-08

### 2024-08-31\[工具]

一个可以自动生成会议记录的 ai 工具，它是通过监控你的麦克风和音频输出来生成会议记录的。目前支持 mac 平台。

![](https://p.ipic.vip/f0v9fq.png)

via: <https://www.guillaume.sh/watson>

### 2024-08-30\[网站]

一个可以将白话文转化为文言文的网站，速度还行，就是一次不能处理太多文本。

via: <https://modelscope.cn/studios/chostem/ancient\\_Chinese\\_text\\_generator>

### 2024-08-29\[新闻]

HTTP 请求有一个幂等性的概念，即无论调用多少次，结果都是一样的。

GET 请求被要求是幂等的，通常它只是获取数据，不会对服务器状态产生影响。但是这只是预期和约定，你仍然可以在 Get 请求做一些修改操作，只是不推荐。

GET 有一个问题，这并不是 GET 协议本身的问题，而是浏览器的问题。由于 GET 参数是拼接在 url 上的，所以 GET 请求的 url 长度有限制，这个限制是由浏览器和服务器共同决定的。

因此如果你想遵守“幂等性”约定对幂等请求使用 GET，但是又需要传递大量参考该怎么办？

普遍的做法是将请求拆分为多个，比如 api1 和 api2。api1 接受 a，b，c 参数，api2 接受 d，e，f 参数。这样就可以避免 url 长度的限制。

现在有了一个新的提案，截止到目前（2024-10-07），它还是一个草案，但是它提供了一个新的方法 QUERY，类似于在 GET 请求中传递 body。有了这个新的方法，你就可以遵守幂等性约定，同时又可以传递大量参数。

一个可能得请求：

```http
QUERY /contacts HTTP/1.1
Host: example.org
Content-Type: example/query
Accept: text/csv

select surname, givenname, email limit 10
```

一个可能的对应响应：

```http
HTTP/1.1 200 OK
Content-Type: text/csv

surname, givenname, email
Smith, John, john.smith@example.org
Jones, Sally, sally.jones@example.com
Dubois, Camille, camille.dubois@example.net
```

如上只是一个示意，至于 “body”的格式是什么样的，还需要进一步的讨论。

via: <https://www.ietf.org/archive/id/draft-ietf-httpbis-safe-method-w-body-05.html>

### 2024-08-28\[网站]

很多开源作者都不知道如何选取一个合适的开源许可证，基本就是随便弄一个，甚至压根没有。虽然说大多数这个东西并不会有什么问题，但是如果你的项目真的有价值，那么这个东西就会变得很重要。而这个工具可以帮助你选择一个合适的开源许可证。你只需要回答几个简单的问题，它就会给你推荐一个合适的开源许可证。

![](https://p.ipic.vip/fj349i.png)

via: <https://open-source-license-chooser.toolsnav.top/zh/>

### 2024-08-27\[网站]

一个特别有趣的吐槽网站，作者真的做了一个大家平时遇到过的垃圾网站，故事的开始是你想通过搜索引擎搜索一个东西。原谅我真的绷不住。

via: <https://how-i-experience-web-today.com/>

### 2024-08-26\[网站]

google 出品的一个文字转播客的网站。上传文字，甚至直接贴一个网站的链接，它就会帮你生成一个播客。

我试了下，大概就是生成了几个主持人的对话。他们会模仿自己拿到了作者的文章投稿，然后进行讨论和介绍。最后你甚至可以对他围绕文章的内容进行提问，或者直接让他帮你总结一下。

实际用起来效果很一般。因为我平时都是将播客转为为文字，而不是将文字转为播客。不过如果你想玩玩，或者想练习下英语，那么这其实是一个不错的选择。另外它的背后是 google 的 ai 技术，所以还是值得期待的。

via: <https://notebooklm.google.com/>

### 2024-08-25\[网站]

一个让你当产品经理的工具。你描述下需求，直接帮你生成前后端代码，并且可以直接运行和部署。

via: <https://bolt.new/>

### 2024-08-20\[工具]

在一个地方牌几张照片，然后它就可以帮你生成一个全景照片，效果还不错。

![](https://p.ipic.vip/i9j3ik.png)

via: <https://github.com/krupkat/xpano>

### 2024-08-18\[私有化部署]

一个开源的在线配音工具，提取视频中的语音，将其转化为其他语言，支持多种语言，支持多种音色。工具特别优化了对中文的支持。

部署好后就可以通过 web 来访问了，效果图：

![](https://p.ipic.vip/f2ui3r.png)

via: <https://github.com/Kedreamix/Linly-Dubbing>

### 2024-08-17\[私有化部署]

一个开源且可自托管的 Heroku / Netlify / Vercel 替代品，可以用来部署你的应用，包含前端应用和后端应用。

via: <https://github.com/coollabsio/coolify>

### 2024-08-16\[新闻]

《ECMAScript 错误安全赋值运算符草案》

之前我们可能会这么写代码：

```js
try {
  // try expression
} catch (error) {
  // catch code
}

// or

promise // try expression
  .catch((error) => {
    // catch code
  })
```

而有了这个特性后就可以这样写：

```js
const [error, data] ?= expression

if (error) {
  // catch code
} else {
  // try code
}
```

它不仅仅免去了嵌套，使得代码更简洁，还避免了一些块级作用域问题。

由于目前还是草案阶段，后续 API 可能会有所变动，甚至根本无法通过。

via: <https://github.com/arthurfiorette/proposal-safe-assignment-operator>

### 2024-08-15\[工具]

一个 TTS 工具，可以将文字转化为语音，支持多种语言，支持多种音色。

![](https://p.ipic.vip/dqp7qq.png)

via: <https://tiktokvoice.net/>

### 2024-08-14\[工具]

部分代码工具提供了动态 IP， 你可以自己选择 IP 地址。这款工具的优势在于 IP 可以更加精确，目前可以精确到城市级别。另外有多种收费规则，基于使用量，基于时间收费等。

via: <https://www.proxy302.com/features/>

### 2024-08-12\[好文]

中国的高级资格「系统架构设计师」的考试应该如何准备，这篇文章给出了一些建议，比如要了解考试的内容，要有一定的实践经验，要有一定的技术深度等等。

via: <https://nekonull.me/posts/ruankao-architect/#>

### 2024-08-11\[工具]

ChatTTS 是一个 ai 工具，可以将文字转化为语音，支持多种语言，支持多种音色。

其最大的特点是支持笑声，停顿等等，让语音听起来更加自然。基本上听不出来是机器生成的，而就像是真人在说话。这让我不免想到将来反诈骗是不是更加困难了。

如果你不想私有化部署，只是想试试，这里有一些基于它的衍生品，大家可以直接尝试使用，via: <https://github.com/libukai/Awesome-ChatTTS>

虽然目前的用法需要你输入控制字符 \[laugh\_0] \[break\_4] 等等，但是我相信不久的将来，它就可以根据上下文和预制的一些参数自动插入控制字符，而最大限度减少人为的参与。

via: <https://github.com/2noise/ChatTTS>

### 2024-08-02\[工具]

Stirling PDF 是一个自托管的 pdf 工具，它可以帮助你修改，合并，转化 pdf 文件。

![](https://p.ipic.vip/r13cl5.png)

![](https://p.ipic.vip/svq13w.png)

via: <https://github.com/Stirling-Tools/Stirling-PDF>

### 2024-08-01\[好文]

openai 官方提供的 node 版本的 sdk，可以方便的调用 openai 的 api，支持所有的 model，比如 gpt-3.5-turbo。

```ts
import OpenAI from 'openai';

const client = new OpenAI({
  apiKey: process.env['OPENAI_API_KEY'], // This is the default and can be omitted
});

async function main() {
  const chatCompletion = await client.chat.completions.create({
    messages: [{ role: 'user', content: 'Say this is a test' }],
    model: 'gpt-3.5-turbo',
  });
}

main();
```

同时也支持上传文件。

```ts
const fileList = [
  createReadStream('/home/data/example.pdf'),
  ...
];

const batch = await openai.vectorStores.fileBatches.uploadAndPoll(vectorStore.id, fileList);
```

via: <https://github.com/openai/openai-node>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2024-05

![](https://p.ipic.vip/0bhil1.jpg) ![](https://p.ipic.vip/0bhil1.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2024-05

### 2024-05-31\[好文]

一般我们会将自己的网络服务托管到第三方。他们一般会负责保护你的服务不受攻击，或者收到攻击的时候能够及时恢复。

但是如果你是自托管，那么很多问题都需要自己考虑，其中最重要的就是安全问题。包括但不限于数据安全，病毒攻击，DDOS 攻击等。

![](https://p.ipic.vip/t6bbzs.png)

via: <https://sspai.com/post/89837>

### 2024-05-29\[好文]

上次给大家介绍了一个下载 bilibili 视频的工具，今天给大家介绍另外一个工具 cobalt，不仅可以下载 bilibili 视频，还可以下载很多其他视频网站的视频，比如 youtube。使用方式基本一样，只需要输入视频的地址，然后就可以下载了。 代码是开源的，仓库地址：<https://github.com/imputnet/cobalt>

![](https://p.ipic.vip/fm51j6.png)

via: <https://cobalt.tools/>

### 2024-05-28\[好文]

一个利用 AI 给视频自动添加字幕的工具，这个工具可以帮助你快速给视频添加字幕。我自己试了一个视频，不知道为什么视频后半段是没有字幕的，前半段效果还不错。

这个工具免费版的话只能是 720 P 并且不能去水印，如果想要更高清的视频，或者去水印，需要付费。

使用方法很简单，你只需要上传一个视频，然后它就会自动给你生成字幕，你可以选择字幕的样式，然后就可以下载了。

![](https://p.ipic.vip/9a3ard.png)

via: <https://www.kzzimu.com>

### 2024-05-27\[好文]

看完《2024 年开始使用的 10 个现代 Node.js 运行时功能》 我越来越觉得 nodejs 像 deno 靠拢了。其也加入了 native lib 和 权限控制等。

via: <https://snyk.io/blog/10-modern-node-js-runtime-features/>

### 2024-05-24\[好文]

github 有一个漏洞，使得一些人利用这个漏洞钓鱼。这个漏洞是这样的，当你在 github 上传一个附件，那么这个附件就属于这个仓库。因此攻击者可以去一些权威仓库，比如 react 下面上传一个恶意附件，然后将生成的地址发给别人。别人一看地址来自 react，就会认为是安全的，然后下载这个附件，这样就会被攻击者利用。

via: <https://www.bleepingcomputer.com/news/security/github-comments-abused-to-push-malware-via-microsoft-repo-urls/>

### 2024-05-23\[网站]

一个教你在网络这个黑暗森林里保护自己隐私的网站，里面有很多关于网络安全的知识，比如如何保护自己的隐私，如何防止网络钓鱼等。

对我来说学到的点包括：

* 如何检测蓝牙追踪器
* tor 浏览器 和 whatsapp 的安全性
* metadata 以及 metadata 是如何暴露你的隐私的
* 。。。

另外这个网站提供了一些隐私保护的工具，包括但不限于浏览器，dns，云服务，vpn，密码管理器等。<https://www.privacytools.io/>

via: <https://ssd.eff.org/>

### 2024-05-22\[好文]

一个非常好看的美化 json 的工具。如果你有“在网页中展示 JSON 数据”的需求，那就可以考虑使用。使用方式非常简单，支持所有主流浏览器。

![](https://p.ipic.vip/w5qplu.png)

via: <https://github.com/williamtroup/JsonTree.js>

### 2024-05-16\[好文]

一个 OBS 的插件，可以在直播的时候显示你的键盘输入，这样观众就可以看到你的键盘输入了。这个插件支持 windows 和 linux。除了键盘输入显示，它还支持鼠标输入显示，手柄输入显示。

![](https://p.ipic.vip/1n04cf.png)

via: <https://github.com/univrsal/input-overlay>

### 2024-05-15\[技巧]

网络钓鱼危害非常大，你的隐私，你的资金都会因为网络钓鱼而受到威胁。

然而对待网络钓鱼实际上并没有很有效的方法，因为网络钓鱼的手段非常多样，而且很难被检测出来。

U2F物理加密密钥是一个很好的解决方案，它可以防止网络钓鱼。而做到这一点需要：

1. 一个支持 U2F 的网站，比如 Google
2. 一个 U2F 物理密钥，比如 yubikey

它的原理大概是这样的：当你登录一个支持 U2F 的网站时，网站会要求你插入你的 U2F 密钥，然后你按一下 U2F 密钥上的按钮，这样网站就可以确认你是真的拥有这个密钥。你首次 U2F 登录的时候它也会将你的账号和物理秘钥进行绑定，后面就算钓鱼者通过某种方式获取到你的密码，也无法登录你的账号，因此它没有你的物理密钥，认证不通过。

### 2024-05-14\[好文]

如果你有辅导孩子的需求，那么你可以将数学题截图上传到这个网站，然后它会自动给你解答，底层基于 chatgpt4，而且是免费的。你也可以直接输入题目描述进入代替上传图片。

![](https://p.ipic.vip/6hu85w.png)

via: <https://math.bot/>

### 2024-05-13\[好文]

上次向大家推荐了一个下载 bilibili 视频的网站。这次是一个下载 bilibili 视频**桌面客户端**，使用 flutter 编写，支持 macos 和 windows。

![](https://p.ipic.vip/5b685j.png)

via: <https://github.com/kangpeiqin/bilivideo\\_down>

### 2024-05-12\[好文]

和使用草料等工具生成二维码（qrcode）类似，我们也可以使用一些工具生成条形码（barcode）。这个**在线工具**就可以帮助你生成带有任意信息的条形码。

via: <https://www.1txm.com/barcode>

### 2024-05-08\[好文]

你从网上下载了一个文件，但是你如何确定这个文件是不是被篡改过呢？一般来说，文件作者可以提供一个签名文件，作者用自己的私钥对文件进行签名，然后你可以用作者的公钥来验证文件的签名。这样你就可以确定文件是否被篡改过。

而 GPG 就是一个非常好的工具，可以用来签名文件，验证文件的完整性，以及加密文件。这个视频介绍了如何使用 GPG 签名文件或者验证文件的签名。

MACOS 可以用 gpg Suite，windows 可以用 gpg4win。

via: <https://www.youtube.com/watch?v=MaZ8\\_V-iveQ>

### 2024-05-07\[知识]

node 22 中的新功能 register，register 方法可用于注册导出一组钩子的模块。钩子是 Node.js 调用的函数，用于自定义模块解析和加载过程。导出的函数必须具有特定的名称和签名，并且必须作为命名导出导出。

```js
// hooks.js
export async function initialize({ number, port }) {
  // Receives data from `register`.
}

export async function resolve(specifier, context, nextResolve) {
  // Take an `import` or `require` specifier and resolve it to a URL.
}

export async function load(url, context, nextLoad) {
  // Take a resolved URL and return the source code to be evaluated.
} 
```

如上代码，hooks.js 导出了三个函数，initialize，resolve 和 load。这三个函数分别用于初始化，解析和加载模块。当模块被初始化，解析，加载的时候就可以执行这三个函数。

为了让所有模块都可以被作用到，注册功能越早越好，尤其是入口文件也要被注册到。那我们就可以使用 node 的 import 指令来完成。

```bash
node --import ./register-hooks.js ./my-app.js 
```

import 会在加载入口文件之前，先加载 register-hooks.js，这样就可以保证所有模块都可以被注册到。

更多用法参考：<https://nodejs.cn/api/module.html#customization-hooks>

基于这个功能，node 就可以很容易地实现 web 中的 HMR 效果了，比如 <https://github.com/julien-R44/hot-hook> 就利用 node 的 register 功能实现了 HMR。

### 2024-05-06\[好文]

通过红外线 led 灯来躲避夜市摄像头的监控，这个想法真的很有意思。

via: <https://www.macpierce.com/the-camera-shy-hoodie>

### 2024-05-05\[好文]

jq 是一个非常好用的 json 处理工具，但是它只能在命令行中使用，如果你想在 nodejs 中使用 jq，那么可以使用 node-jq 这个工具。node-jq 就是基于 jq 封装的一个库。

```js
const jq = require('node-jq')

const filter = '.abilities[].moves'
const jsonPath = '/path/to/bulbasaur.json'
const options = {}

jq.run(filter, jsonPath, options)
  .then((output) => {
    console.log(output)
    /*
      {
        "name": "heartgold-soulsilver",
        "power": "10"
      },
      {
        "name": "platinum",
        "power": "50"
      },
      {
        "name": "diamond-pearl",
        "power": "99"
      }
    */
  })
  .catch((err) => {
    console.error(err)
    // Something went wrong...
  })
```

如上代码，我们可以使用 node-jq 来过滤 json 文件。

via: <https://github.com/sanack/node-jq>

### 2024-05-04\[工具]

一个在线的免费在线转换文字为语音的工具，你可以将文字转换为语音，然后下载到本地，支持多种语言。

一次限制 2000 个字，实际上基本够用。

![](https://p.ipic.vip/18dlf0.png)

via: <https://texttospeech.im/zh-CN>

### 2024-05-03\[工具]

一个将 ai 生成的回答“润色”，使其更加自然的工具。

via: <https://humanize.im/zh-CN>

### 2024-05-02\[工具]

只需要一行命名就可以将 sqllite 数据库文件变成可通过 web 访问的网站。

```bash
sqlite_web /path/to/database.db
```

其中 db 文件可通过工具导出。

![](https://p.ipic.vip/htn5hf.png)

via: <https://github.com/coleifer/sqlite-web>

### 2024-05-01\[好文]

《【剧透】电影《怪物》时间线完整还原和三视角叙事结构分析》这篇电影解析写的太好了，简直教科书级别。

作者从多个视角，多个时间线分析了这部电影，让我有种玩 RPG 游戏的感觉。同时也增加了多对电影里很多细节的理解。非常棒，希望我以后也能写出这样的电影解析。

via: <https://www.douban.com/note/858206686/?\\_i=5016320fbwsPHb,5016539fbwsPHb>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2024-04

![](https://p.ipic.vip/0bhil1.jpg) ![](https://p.ipic.vip/0bhil1.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2024-04

### 2024-04-30\[工具]

一个像素级别的 diff 工具，可以帮助你比较两个图片的差异。或许可以用来分析白屏问题，或者是图片是否加载成功等。

via: <https://github.com/dmtrKovalenko/odiff>

### 2024-04-29\[工具]

和上一个工具有点像，也是提取视频下载地址的，只不过这个不针对某个特定网站，而是利用 chrome 的 devtools 来提取视频地址。因此好处是使用范围更广，坏处是精细化程度可能不如专门针对某个网站的工具。

via: <https://github.com/xifangczy/cat-catch>

### 2024-04-28\[工具]

bilibili 手机端是可以下载视频的（部分视频由于版权限制也无法下载），但是电脑端就不行了。这个网站可以帮助你下载 bilibili 视频，你只需要输入 bilibili 视频的地址，然后点击“提取”，等待分析完成后，点击“下载”就可以下载视频了。

![](https://p.ipic.vip/d1srux.png)

via: <https://snapany.com/zh/bilibili>

### 2024-04-27\[工具]

一行命令直接将你的命令行分享给别人，让别人可以直接通过浏览器访问你的命令行。这对于远程调试，教学，合作等还是蛮有用的。比发文字图片告诉对方如何操作效率高多了。

via: <https://sshx.io/>

### 2024-04-24\[新闻]

TestCafe v3.6.0 可以直接拿到 CDP（chrome devtool protocol） 链接，这样你就可以直接通过 CDP 来和 chrome 浏览器通信，做到更多 TestCafe 本身不支持而 CDP 支持的功能。

```js
fixture `Get current CDP session`
    .page('https://devexpress.github.io/testcafe/example');

test(`Get current CDP session`, async t => {
    const mainWindowId = await t.testRun.activeWindowId;

    let clientCDP = await t.getCurrentCDPSession();

    await t.expect(clientCDP.webSocketUrl).contains(mainWindowId);
}
```

via: <https://github.com/DevExpress/testcafe/releases/tag/v3.6.0>

### 2024-04-23\[工具]

previewjs 是一个 IDE 插件，通过它可以让你在你的 IDE 中预览 UI 组件， 如果你了解 Storybook，那么你就可以很快上手 previewjs。 实际上通过 previewjs 甚至直接生成 Storybook 文件，实现和 storybook 的无缝衔接。

对不熟悉 storybook 的同学我简单介绍下它。storybook 是一个 UI 组件的开发环境，它可以让你独立的开发 UI 组件，然后通过 storybook 来预览你的 UI 组件。通过 storybook 你可以很方便的查看 UI 组件的各种状态，比如 hover，active 等。组件的 props 也可以通过 storybook 来调整，最后这些属性组合什么的可以作为一个个 user case 来展示，也叫做用户故事（Storybook）。

下面这个视频展示了 previewjs 的功能，你可以看到它是如何在 IDE 中预览 UI 组件的，是如何修改代码，然后实时预览的。

<https://github.com/azl397985856/daily-featured/assets/12479470/a1bf8307-7d8e-4e8e-81a9-40a5574fb25c>

如果你要做一个类似的插件，其实也不难。核心只要：

1. 拿到当前的组件代码，然后调用库的 api 来 render 就可以了，比如 react 的话，你可以用 react-dom 的 render 方法来 render 你的组件。
2. 至于下面的面板： Story，console，properties。这其实 vscode 等编辑器都有专门的文档告诉你怎么实现。至于展示的数据从哪里来，当前是解析组件的 props 类型定义之类的。
3. 最后就是监听代码变化，然后重新 render。

总的来说，我认为它是**和 wallaby.js 一样好用的工具，都是让你更快的看到你的代码的运行结果。** 而这种快速反馈正是提高开发效率的关键。

via: <https://previewjs.com/>

### 2024-04-22\[工具]

由于我经常用 markdown 写一些教程，因此常常会想：“如果 markdown 中可以直接嵌入代码，让文章既有代码又可以交互多好。”

实际上这并不难实现。由于我写的 markdown 最终都是通过一些工具转成 html 来展示（比如我的博客）。因此只需要按照一定格式去写代码，然后将你的 markdown 编译一下，取出对应代码，将其插入到 html 对应位置即可。

只是做这个插件需要时间，做好后每次写文章也会多很多工作量，因此就没有做。但是如果你有这个需求，可以参考这个工具，它可以让你在 markdown 中嵌入代码，然后通过一个插件来实现代码的交互。

其直接内置了一些 UI 库和 helper 函数，让你可以很方便的实现代码的交互。当然你也可以自己引入你的库，然后实现你想要的效果。

![](https://p.ipic.vip/32pgn5.png)

via: <https://genji-md.dev>

### 2024-04-18\[工具]

figma 是一个非常好用的设计工具，同时它的插件生态也非常丰富，你可以通过插件来扩展 figma 的功能。这是因为 figma 丰富的接口设计，figma 提供了 widget api，rest api 和 plugin api 来让扩展 figma 变得非常容易。

* widget api：可以让你在 figma 中嵌入 ui 组件。
* rest api：可以让你通过 restful api 来操作 figma 的文件，节点等。
* plugin api：可以让你通过 JavaScript 来操作 figma 的文件，节点等。

figma 的插件类似于浏览器的插件，你可以通过插件来实现一些自动化的操作，比如自动生成代码，自动生成图表等。也是用 JavaScript 来编写的。

所谓万事开头难，如果你想自己写一个 figma 插件，看官方文档不那么容易上手。那么这个工具可以帮助你快速创建一个 figma 插件项目。

使用它可以快速生成 typescript 项目，也可以生成 react 项目，让你可以专注于业务逻辑的实现。

via: <https://yuanqing.github.io/create-figma-plugin/quick-start/>

### 2024-04-12\[工具]

准备好你的数据库，执行 `npx dashpress`， 就可以生成一个完整的后台管理系统，包括前端和后端。体验 demo：<https://demo.dashpress.io/>

![](https://p.ipic.vip/c2sm8x.png)

via: <https://github.com/dashpresshq/dashpress>

### 2024-04-11\[网站]

chatgpt 3.5 终于可以免费使用了，无需登录即可使用。但是对于 4.0 版本，还是需要登录付费使用的。

![](https://p.ipic.vip/k6m61f.png)

via: <https://chat.openai.com/>

### 2024-04-10\[技巧]

quickjs 是一个小型的 JavaScript 引擎，它支持 ES2020 标准，可以作为嵌入式脚本引擎使用。它的特点是小巧，快速，可以作为一个库嵌入到你的应用中。

但是你知道吗？它还支持编译为 wasm，这意味着你可以在 JS 引擎中运行 quickjs 来当做沙箱执行 JS 代码（如果你愿意的话也可以继续套娃）。

via: <https://bellard.org/quickjs/>

### 2024-04-09\[工具]

如果你想在 node 中运行 deno 引擎， deno 引擎再运行 JS（或者 TS） 代码，那么 `node-deno-vm` 这个工具可以帮助你做到这一点。

什么情况下会用到这个工具呢？比如你想做一些权限文件读写等权限控制，就可以使用。这是因为 deno 引擎的权限控制更加严格，而 node 在这方面做的不好。

它的原理是用 node 的 spawn 来启动 deno 引擎，然后通过 websocket（deno 目前不支持 IPC） 通信来执行代码，将 websocket 的 url 通过参数传给 deno，deno 构建 websocket 客户端，然后通过 websocket 来通信。

via: <https://github.com/casual-simulation/node-deno-vm>

### 2024-04-08\[工具]

2022-03-04 给大家推荐了一个工具 chrome-extension-cli，这个工具可以帮助你简化 chrome 插件的开发。

今天给大家推荐一个类似的工具，个人感觉也更加好用。你不仅可以用它来开发新的 chrome 插件，还能用它来开发调试现有的 chrome 插件。

via: <https://extension.js.org/>

### 2024-04-02\[网站]

tradingview 是一个提供经济数据的网站，它提供了各种股票，期货，加密货币市场的图表，指标等。

当然有些经济指标是有很多水分的，大家注意分辨。

![](https://p.ipic.vip/quzn8x.png)

值得一提的是，虽然大部分数据是免费的，但是有些数据是需要付费的，比如一些高级指标，高级图表等。你可以使用部分加密货币直接购买，加密货币购买方面是由 [coinbase](https://www.coinbase.com) 提供支持。

如果你只想看加密货币的数据，也可以直接使用 [coinmarketcap](https://coinmarketcap.com)，它提供了更加专业的加密货币数据。

via: <https://cn.tradingview.com/markets/#economy>

### 2024-04-01\[网站]

最近 web3 特别多空投（airdrop），但是消息都比较分散，这个 metamask 钱包提供的功能可以帮助你识别你有资格参与的空投。

可惜的是很多链都不支持，比如 solana，sui 等，期待后续完善吧。

![](https://p.ipic.vip/uby8i6.png)

via: <https://portfolio.metamask.io/explore>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2024-03

![](https://p.ipic.vip/0bhil1.jpg) ![](https://p.ipic.vip/0bhil1.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2024-03

### 2024-03-31\[好文]

Web3 是一个新兴的概念，它是基于区块链的下一代互联网。它的核心思想是去中心化，让用户拥有自己的数据，而不是被大公司控制。

本文将详细介绍Web3 DApp开发的架构、技术，以及使用哪些工具，并给出完整示例。文章涉及

* 区块链：以以太坊（Ethereum）为主流，也包括Solana、Aptos等其他非EVM链。区块链本身是软件，需要运行在一系列节点上，这些节点组成P2P网络或者半中心化网络。节点不仅负责接收新的输入并生成新的区块，还需要存储区块链运行时产生的所有数据，并负责同步、对外提供查询等RPC服务。
* 钱包：帮助用户管理自己在区块链上资产的软件，加密存储用户的私钥。当用户需要和区块链交互时，就需要用到私钥签名；
* 智能合约：运行在区块链上的一段托管程序，主要用来和外部账户交互；
* UI：这里特指前端页面，因为直接通过RPC调用合约仅限个别高级用户，普通用户仍需要一个前端页面，并通过JavaScript脚本配合钱包签名与合约交互。

文章可贵的地方在于你可以根据它从头到尾开发一个 web3 应用，虽然并没有讲如果使用钱包以及如何签名等内容，但是这些内容网上资料很多，大家可以自行搜索。

via: <https://www.liaoxuefeng.com/article/1529816679448611>

### 2024-03-25\[好文]

一个介绍如何在你的 IDE 中使用 GitHub Copilot 的文章。它介绍了一些使用技巧，最佳实践等等。

对于我来说，最有用的两条是：

* “1. Open your relevant files”。我之前以为 copilot 会自动扫描本地文件。但实际上它只会扫描本地中打开的文件。
* “10. Use the @workspace agent” 使用 workspace 指令可以让 copilot 在整个项目中搜索，而不是网络上，这样可以针对你项目进行一些响应。比如你可以问“项目的类型定义写在哪个文件”等等。

via: <https://github.blog/2024-03-25-how-to-use-github-copilot-in-your-ide-tips-tricks-and-best-practices/>

### 2024-03-20\[工具]

oxc 是一套 JavaScript 工具集合，用 Rust 写的。比如用于 lint 的 oxlint， 用于构建的 rspack 等等。

![](https://p.ipic.vip/vefwci.png)

via: <https://oxc-project.github.io/>

### 2024-03-19\[网站]

FIRE(Finance, Independence, Retire Early) 是一个理财自由的概念，它的核心思想是通过投资和理财，让自己的被动收入大于支出，从而实现财务自由。

这里有一个网站，它可以帮助你计算 FIRE 的时间。你可以输入你的年龄，目前的资产，每年的支出，以及你的投资收益率，然后它会帮你计算出你实现 FIRE 的时间。实际上除了输入这些信息，你还可以输入两个额外信息：通货膨胀率和稳定年收入。

如果你已经30岁以上了，那么考虑 70 年基本也就是极限了。比如你的投资收益率是 4%，通货膨胀率是 2.229%（中国近十年通胀率平均在 2.229% 左右），稳定年收入是 30000，每年需要花 12w，那么要活 70 年则需要大约 350w 本金。你可以通过这个网站来计算你的 FIRE 时间。

![](https://p.ipic.vip/61d5aw.png)

via: <https://firecalculate.github.io/>

### 2024-03-15\[工具]

之前公司做发布系统，有一个需求是要在浏览器中直接访问服务器的终端。用户可以直接在浏览器访问服务器的终端，而不需要通过 ssh 客户端。直接集成到了发布系统，非常方便。

它的原理类似于今天介绍的这个工具 webtty。webtty 是一个基于 Web 的终端，它可以让你在浏览器中直接访问服务器的终端。

via: <https://github.com/butlerx/wetty>

### 2024-03-14\[好文]

线上代码大多会经过 sourcemap， 定位问题比较困难。比较有名的系统是 sentry，但是它是收费的。另外大家可能对 sentry 是如何工作的比较好奇，那么这篇文章就比较适合你了。

这篇文章介绍了如何使用 sourcemap 来还原，帮助大家更好的定位问题。 并提供了一些实际的例子 <https://github.com/joeyguo/noerror> ，大家甚至可以直接使用这个系统。

via: <https://github.com/joeyguo/blog/issues/14>

### 2024-03-13\[工具]

Million Lint 处于公开测试阶段，它通过静态编译 + 动态运行的方式，让你能够直接在 IDE 中看到每一个组件的耗时情况，非常的方便。

官方的介绍：优化 React 性能，让您的 React 在几分钟（而不是几个月）内速度提高 70%。当然这个数字仅仅是其内部测试的结果，并且是相对简单的程序，大家可以自己试试，欢迎大家来给我反馈你们项目的实际效果。

官方博客对其进行了详细介绍，大家可以通过这个链接查看 <https://million.dev/blog/lint> 。

via: <https://github.com/aidenybai/million>

### 2024-03-03\[插件]

“大声朗读：使用文本转语音阅读网页” 是一个 Chrome 插件，它可以帮助你将网页上的文字转换为语音，然后朗读出来。

有的时候面对大量文字，我们可能会感到疲劳，这个时候我们可以使用这个插件，让它帮助我们朗读，这样我们就可以不用亲自阅读，而是听它朗读。

via: <https://chromewebstore.google.com/detail/%E5%A4%A7%E5%A3%B0%E6%9C%97%E8%AF%BB%EF%BC%9A%E4%BD%BF%E7%94%A8%E6%96%87%E6%9C%AC%E8%BD%AC%E8%AF%AD%E9%9F%B3%E9%98%85%E8%AF%BB%E7%BD%91%E9%A1%B5/nipboejoampbggkgkdjbogkacmmegcmm?hl=zh-CN>

### 2024-03-02\[工具]

系统信息 (System Information) 是一个用于 Node.js 环境下获取系统信息（如 CPU、内存使用情况、磁盘空间、网络状态等）的库。

它使用简单，跨平台，可以获取大量的信息，包括如下几个关键点：

* 可以以各种格式（JSON、HTML、Markdown 等）输出信息
* 可以获取 CPU、内存、磁盘、网络、操作系统等方面的信息
* 支持所有主流的操作系统（包括 Windows、MacOS 和 Linux 等）
* 输出的信息包含详细的数据，如 CPU 使用率、内存空闲量、磁盘剩余空间等
* 功能齐全，支持许多高级功能，如获取 Docker 容器列表、监视嵌套虚拟化等

但是也有一些缺点。我们之前使用过它，发现尽管我只使用了它的一小部分功能，但是它还是使我的包体积增加了很多。因此如果你的项目对包体积有要求，那么你可能需要考虑一下。可以选择参考它的源码，然后在自己仓库中实现一些功能。也可以考虑选择其他的库。

via: <https://github.com/sebhildebrandt/systeminformation>

### 2024-03-01\[技巧]

OPML（大纲处理器标记语言）是一种允许您与其他应用程序共享您在 Feedly 中关注的 RSS 提要的格式，本质上就是一种标记语言。

它的格式非常简单。大家可以通过这个链接了解一下 <https://en.wikipedia.org/wiki/OPML> 。

如下是一个简单的例子：

```xml
<?xml version="1.0" encoding="UTF-8"?>
<opml version="1.0">
  <head>
    <title>Subscriptions</title>
  </head>
  <body>
    <outline text="My Subscriptions">
      <outline type="rss" text="lucifer的网络博客" title="lucifer的网络博客" xmlUrl="http://lucifer.ren/blog/atom.xml" htmlUrl="https://lucifer.ren/blog/"/>
      <outline title="Blog 2" type="rss" xmlUrl="http://blog2.com/feed" htmlUrl="http://blog2.com"/>
    </outline>
  </body>
</opml>
```

通过它，我们可以在不同的 RSS阅读器之间迁移我们的订阅。比如我们可以在 Feedly 中订阅一些博客，然后通过 OPML 导出，然后导入到其他的 RSS 阅读器中。也可以将自己的订阅分享给其他人，只要导出一份 OPML 文件就可以了。

如果你想导入导出你的 RSS 订阅，或者想分享或者取得他人的订阅，那么使用 OPML 是一个非常好的选择。

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2024-02

![](https://p.ipic.vip/0bhil1.jpg) ![](https://p.ipic.vip/0bhil1.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2024-02

### 2024-02-29\[字体]

《京華老宋体》是一个特别好看的字体，有浓厚的中国风，适合用来做一些中国风的设计。

不过实际使用上来看，锐化的效果不是特别好，不知道是不是 mac 设备的原因。

via: <https://zhuanlan.zhihu.com/p/637491623>

### 2024-02-28\[网站]

输入 ts 类型，帮你生成 ts 类型的图表，可以帮助你更好地理解 ts 类型。

![](https://p.ipic.vip/e3jg1u.png)

via: <https://tsdiagram.com/>

### 2024-02-27\[工具]

kiss-translator 是一个双语对照翻译工具，有对应的浏览器和油猴脚本。

对于有一定英语背景但不是特别好的人来说，**双语对照**可以帮助你更好地理解英文文章，提高你的英文阅读能力。

via: <https://github.com/fishjar/kiss-translator>

### 2024-02-26\[教程]

一个超级实用和简短的 svg 教程，画面非常精美。

![](https://p.ipic.vip/y37zjg.png)

一共 25 个“关卡"。

里面讲了 svg 中如何用 g 来 group 元素，如何处理事件，如何使用动画，如何使用滤镜高阶等等。

via: <https://svg-tutorial.com/>

### 2024-02-25\[工具]

我们见过不少 markdown 转化成 pdf，epub 的工具。但是反向地将 pdf，epub 转化成 markdown 的工具就比较少了。

这个工具借助了人工智能，可以帮你将 pdf，epub 转化成 markdown。

via: <https://github.com/VikParuchuri/marker>

### 2024-02-23\[网站]

一个可以帮你保持屏幕常亮的网站，可以帮助你在一些需要屏幕常亮的场景下使用。

其基本原理是使用了 noSleep.js 这个库，这个库可以阻止屏幕自动关闭。

[noSleep.js](https://github.com/richtr/NoSleep.js/blob/master/src/index.js) 的原理是播放一个无限循环的假视频，让浏览器错误地认为你在看视频，从而阻止屏幕常亮。不过由于 浏览器的 [navigator.wakeLock](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/wakeLock) API 的出现，这个库会优先使用这个 api 来阻止屏幕常亮。

via: <https://www.keepscreenon.com/>

### 2024-02-22\[好文]

学习一个东西就是要从大的方向高屋建瓴地去理解。

这篇文章就将 web 应用从是否动态和是否在线两个维度进行了分类，然后讲解了每一种类型的特点。

两个维度，一共分了 2 \* 2 = 4 种类型。

![](https://p.ipic.vip/ptfto1.png)

并且拿具体的知名的网站作为例子，讲解了每一种类型的特点，以及什么情况下使用什么样的技术栈构建什么样的类型 web 应用。

via: <https://jakelazaroff.com/words/the-website-vs-web-app-dichotomy-doesnt-exist/>

### 2024-02-21\[好文]

chrome 出了很多的 web vitals 监控指标，比如 First Contentful Paint，Cumulative Layout Shift，但是这些指标是如何收集的呢？

说实话很难收集。而 chrome 修改了 performance API，可以帮助我们直接收集这些指标。

比如如下代码就可以手机 Cumulative Layout Shift。

```js
const observer = new PerformanceObserver((list) => {
  let cumulativeLayoutShift = 0;
  list.getEntries().forEach((entry) => {
    // Don't count if the layout shift is a result of user interaction.
    if (!entry.hadRecentInput) {
      cumulativeLayoutShift += entry.value;
    }
    console.log({ entry, cumulativeLayoutShift });
  });
});

// Call the Observer.
observer.observe({ type: "layout-shift", buffered: true });

```

via: <https://www.smashingmagazine.com/2024/02/reporting-core-web-vitals-performance-api/>

### 2024-02-19\[工具]

《Remix 入门实战》讲的内容比较浅显，但是却可以让你快速上手 Remix，了解它的基本使用方法。Remix 是一个新的 React 框架，它的目标是让开发者更容易地构建出高质量的 Web 应用。它的特点是开箱即用，自带了很多功能，比如路由、状态管理等。这篇文章是一个入门实战，通过一个简单的例子，让你快速上手 Remix。

如果有一些基础的话，阅读时间大概半个小时到一个小时。

via: <https://remix.lutaonan.com/>

### 2024-02-18\[好文]

相信大家都看到过视频下方有一些 ai 工具对视频内容进行总结的情形。这篇文章就告诉你如何对视频内容进行总结，生成一些文字内容。

主要用到了 OpenAI API 和 the LangChain。

via: <https://blog.logrocket.com/extracting-youtube-video-data-openai-langchain/>

### 2024-02-17\[好文]

目前很多监控摄像头都是 wifi 传输的，本身没有内置 sd 卡，导致你可以简单地使用 wifi 干扰器来将其干掉。

因此我的做法就是使用 sd 卡 + wifi，并且电池+电源双保险。不管你是切断电源还是干扰 wifi，都无法干掉我的摄像头。当然也有很多别的方式罢了，只是这帮我们多加了一层防护。

via: <https://www.tomshardware.com/networking/wi-fi-jamming-to-knock-out-cameras-suspected-in-nine-minnesota-burglaries-smart-security-systems-vulnerable-as-tech-becomes-cheaper-and-easier-to-acquire>

### 2024-02-16\[好文]

sytax 的一期节目，标题是《how-to-be-productive》

以下是我提取的博客重点内容：

1. 最重要的是你首先要检查你当前的习惯。是什么阻碍了你？你在做什么？日常生活中有哪些事情让你感到困惑？
2. 安排专注时间，排除干扰，专注于具体的一件事情。这个时间段不做其他事情，比如社交媒体，邮件等等，不要让别人打扰你。
3. 专注的时间最好是固定时间。比如可以用番茄工作法，25 分钟专注，5 分钟休息。专注时间最好是创造性的工作，也就是说专注时间里创造性的工作的优先级更高。
4. 改变习惯可能是很难的，但是轻微的环境变化可以改掉坏习惯。比如你可以把手机放在另外一个房间，这样你就不会一直看手机了。
5. 你有一堆的事情要做，如何排序？按焦虑程度对待办事项进行排序
6. 日历是最好的生产力工具。 这里其实关键点在于 deadline。你可以把 deadline 放在日历上，然后扫一下你就知道今天要做什么了。这个技巧我用了好久，现在一般我也会结合使用月度计划，周计划。而日历在我这里更像是部分日计划。
7. 这条是我加的。如果完成了自己的计划，要给自己奖励。这个奖励可以是一些小的东西，比如吃一顿好的，看一部电影等等。这样可以让你更有动力去完成自己的计划。

via: <https://syntax.fm/show/717/how-to-be-productive/transcript#scott-formally-diagnosed-with-adhd-re-examining-how-he-works>

### 2024-02-15\[工具]

pa11y 是一个 web 端无障碍测试工具，可以帮助你测试你的网站是否符合无障碍标准。

你可以使用 cli，也可以使用 api 来测试。

cli 的使用方式如下：

```bash
npx pa11y https://example.com
```

api 的使用方式如下：

```js
const pa11y = require('pa11y');

pa11y('https://example.com').then((results) => {
    // Use the results
});
```

扩展性也是有的，你可以通过 action 自定义一些浏览器的操作，这些操作和 puppeteer 的操作类似。

via: <https://github.com/pa11y/pa11y>

### 2024-02-14\[新闻]

JSR，Deno团队的新包注册表，旨在解决npm的限制。

用户可以直接编写 TypeScript 发布到 JSR，JSR 会完成 ts 编译，ESM 转义等操作。而且据说还更加安全。

via: <https://socket.dev/blog/jsr-new-javascript-package-registry>

### 2024-02-13\[好文]

《How does B-tree make your queries fast?（B 树如何让您的查询更快？）》这篇文章讲解了 B 树的原理，以及为什么 B 树可以让你的数据库查询更快。

文章总结了两个原因：

1. every node may contain more than one value(每个节点可能包含多个值)
2. inserting a new value is followed by a self-balancing algorithm(插入新值之后是自平衡算法)

这是我见过的 B 树讲解最直观最好理解的一篇文章，图文并茂，讲解清晰。

via: <https://blog.allegro.tech/2023/11/how-does-btree-make-your-queries-fast.html>

### 2024-02-12\[好文]

vercel 的产品好多体验都不错。比如今天介绍的这个。它借助于 react server components 和 openai，可以让你在服务端渲染 react 组件，然后再将其传递给客户端。用户可以用纯文本或者图片输入，然后回复给用户一个可以交互的程序，而不是传统的纯文本回复，极大增强了用户体验，也扩展了 openai 产品的使用场景。

![](https://p.ipic.vip/ehn5d4.png)

你也可以直接使用这套 sdk 来构建自己的交互式程序。

```js
import { render } from 'ai/rsc'
import OpenAI from 'openai'
import { z } from 'zod'

const openai = new OpenAI()

async function submitMessage(userInput) { // 'What is the weather in SF?'
  'use server'

  return render({
    provider: openai,
    model: 'gpt-4',
    messages: [
      { role: 'system', content: 'You are a helpful assistant' },
      { role: 'user', content: userInput }
    ],
    text: ({ content }) => <p>{content}</p>,
    tools: {
      get_city_weather: {
        description: 'Get the current weather for a city',
        parameters: z.object({
          city: z.string().describe('the city')
        }).required(),
        render: async function* ({ city }) {
          yield <Spinner/>
          const weather = await getWeather(city)
          return <Weather info={weather} />
        }
      }
    }
  })
}
```

via: <https://vercel.com/blog/ai-sdk-3-generative-ui>

### 2024-02-08\[好文]

tinyMCE\@6 是一个富文本编辑器，它有很多的功能，比如图片上传，表格编辑，代码高亮等等。

使用起来也非常简单，初始化一下就可以直接用了。

```js
tinymce.init({
  selector: 'textarea',  // change this value according to your HTML
  plugins: 'emoticons',
  toolbar: 'emoticons',
  a_plugin_option: true,
  a_configuration_option: 400
});
```

它的最大特点是插件化，你可以根据自己的需求来选择插件，比如 save 插件，全屏插件，emoji 插件等等。甚至还有 ai 插件，<https://www.tiny.cloud/docs/tinymce/6/ai/>

相比于新兴的编辑器，它的优势在于稳定，功能齐全，插件丰富。缺点就是体积比较大，而且有些功能可能不够现代化。

via: <https://www.tiny.cloud/docs/tinymce>

### 2024-02-7\[好文]

这篇文章讲解了 chrome extension 是如何滥用权限来监控用户的行为，比如监控用户的点击行为，监控用户的输入行为等等。

这提示我们在使用 chrome extension 的时候，一定要注意权限，不要随便安装一些不知名的插件。

我对插件非常挑剔，只会安装很少的插件，同时也会注意权限。

但是这其实很难避免被监控，因为插件是会静默更新的，你不知道它更新了什么。对此其实我也比较无奈。大家如果有好的解决方法，欢迎留言告诉我。

因此最主要的方式应该是浏览器厂商加强审核，不要让一些恶意插件进入到插件商店。同时对所有敏感权限都要明确提示用户(类似于插件想要读取剪贴板时候的浏览器提示)。

via: <https://mattfrisbie.substack.com/p/spy-chrome-extension>

### 2024-02-06\[组件库]

daisyui 是一个 tailwindcss 的组件库，它提供了一些常用的组件，比如按钮，表单，卡片等等。

和其他组件库不同的是，它的组件是基于 tailwindcss 的，作为 tailwindcss 的插件进行安装。

```js
// tailwind.config.js
module.exports = {
  //...
  plugins: [require("daisyui")],
}
```

使用的时候，你可以直接在 html 中使用 tailwindcss 的类名，然后就可以使用这些组件了。 而不需要像其他组件库一样引入组件。

```html
<button class="btn">Button</button>
<button class="btn btn-primary">Button</button>
<button class="btn w-64 rounded-full">Button</button>
```

原子化的类名，让你可以更加灵活地使用组件。

via: <https://github.com/saadeghi/daisyui>

### 2024-02-03\[工具]

rspack 出的辅助工具，可以帮你分析项目信息，打包信息，帮助你更好地了解项目的构建情况，做出优化决策。

lucifer PS：如果你也在做工具，不妨参考这个工具来做一个自己的辅助工具，帮助开发者更好地使用你的工具，同时也方便你收集用户的使用情况，定位问题等等。

via: <https://rsdoctor.dev/zh/guide/start/intro>

### 2024-02-02\[工具]

openai 出的文字生成视频的工具，可以生成文字对应的视频，可以用来做一些文字生成的视频，比如一些短视频，或者一些文字解说的视频。

大家可以根据 demo 体验一下，效果非常的惊艳！

via: <https://openai.com/sora>

### 2024-02-01\[工具]

亚马逊出品的 JavaScript 运行时，是 V8，quickjs 的竞品，据说速度更快，有需要的可以看看。

via: <https://github.com/awslabs/llrt>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2024-01

![](https://p.ipic.vip/0bhil1.jpg) ![](https://p.ipic.vip/0bhil1.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2024-01

### 2024-01-31\[工具]

drizzle-orm 是一个用于操作数据库的无头 ORM，它可以帮助你更加方便地操作数据库。

之前我一直使用的是 waterline 和 prism。

via: <https://github.com/drizzle-team/drizzle-orm>

### 2024-01-30\[工具]

从代码中删除过时内容的价值是不可否认的。然而，找到它们是一项手动且乏味的工作。这就是 Knip 的用武之地。随着代码库的复杂性和规模的增长，自动化和全面的工具变得至关重要。

via: <https://knip.dev/overview/getting-started>

### 2024-01-29\[工具]

给大家推荐几个 ai 聊天工具。

1. Google 出的 Google Gemini Pro，可以免费使用。地址： <https://googlegemini.co/try-google-gemini-for-free>
2. perplexity 是我最早使用的 ai 聊天工具之一，同样免费使用。地址：[www.perplexity.ai](http://www.perplexity.ai)
3. glados 也支持集成 chatgpt。如果你使用了 glados 的服务，那么也可以免费使用。地址：<https://glados.space/landing/M9OHH-Q88JQ-DX72D-R04RN>
4. 如果有条件，可以直接使用 openai（主要是可能会限制某些区域的 IP 地址）。 <https://platform.openai.com>
5. 豆包。头条出的 ai 聊天工具，可以免费使用。地址：<https://www.doubao.com/?hh=1>
6. copilot。如果你使用了 copilot，那么 copilot chat 也可以免费使用。比如我使用了 vscode，那么右下角就会出现一个 chat 的按钮，点击即可使用。

我个人更建议使用 3 和 6，这也是目前我在使用的两个工具。

### 2024-01-28\[好文]

Heat.js 是一个用于创建和管理热图的 JavaScript 库。热图是一种数据可视化技术，它使用颜色的强度来表示数据的大小或密度。类似于 Github 上的提交热图。

![](https://p.ipic.vip/ureb9t.png)

这个库的工作原理如下：

* 初始化：首先，你需要创建一个 Heat 对象。这个对象需要一个配置对象，其中包含了创建热图所需的所有信息，如元素的 id、热图的宽度和高度、颜色梯度等。
* 添加数据：一旦你有了一个 Heat 对象，你就可以开始添加数据了。数据是一个包含 x 和 y 坐标以及一个值的对象。这个值将决定该点在热图上的颜色。
* 渲染热图：添加完所有数据后，你可以调用 Heat.render 方法来渲染热图。这个方法会遍历所有的数据点，根据每个点的值和颜色梯度来确定其颜色，然后在相应的位置上画出一个颜色块。
* 更新和清除数据：你可以使用 Heat.clear 方法来清除所有的数据，或者使用 Heat.update 方法来更新某个数据点的值。

在代码层面，Heat.js 主要由以下几个部分组成：

* Heat 类：这是库的主要接口，用于创建热图、添加数据、渲染热图等。
* Gradient 类：这个类用于创建颜色梯度。它接受一个包含颜色和位置的对象，然后使用线性插值来创建一个连续的颜色梯度。
* Canvas 类：这个类封装了 HTML5 Canvas API，用于在 canvas 上绘制热图。
* Point 类：这个类表示一个数据点。它包含 x 和 y 坐标以及一个值。

via: <https://github.com/williamtroup/Heat.js>

### 2024-01-22\[好文]

Refine 在设计上是 headless(无头)的，因此提供了无限的样式和自定义选项。

"headless" 指的是一个系统或框架没有预定义的前端界面。这意味着它不会限制你如何设计和实现用户界面。你可以使用任何你喜欢的技术和工具来创建用户界面，这就为样式和定制提供了无限的可能性。

在 web 开发中，"headless" 通常用于描述那些只提供 API（如 RESTful API 或 GraphQL API）而不提供预定义用户界面的后端系统。这种设计方式的优点是灵活性高，可以根据项目的需要选择最合适的前端技术。缺点是可能需要更多的开发工作，因为你需要自己从头开始创建用户界面。

via: <https://github.com/refinedev/refine>

### 2024-01-19\[技巧]

如何清除 input 输入框历史下拉数据？

有时候我们在 input 中输入东西的时候会出现历史记录，这很容易泄漏隐私。一般的浏览器清除是无法清除这样的数据的。那么如何清除呢？

主要有两种方式：

1. 取消自动填充。

这里以谷歌浏览器为例，在浏览器地址栏输入：

```
chrome://settings/autofill
```

关闭自动填充表单即可（自动填充和密码下面的每一项都可以关闭），这样处理后所有网站下的 input 框都不会出现历史记录了。

2. 删除历史输入记录。

当已输入过的输入框中，点一下输入框就会自动带出先前所输入过的文字，接着当要删除某个文字记录时，只需将滑鼠滑到上方，再按 Shift+fn+Del 键(MAC)/Shift+Del 键(Win)，就可将它删除。

个人推荐第二种，毕竟第一种会影响其他网站的自动填充功能，并且无法再次开启的话仍然会再次泄漏隐私。

### 2024-01-18\[好文]

原文标题：《The Who, What, When, Where, Why and How of Image Optimization in Angular》。

本文结合 chrome 提出的若干关键浏览器指标，介绍了如何使用 angular 来优化图片加载。

angular 新增了 ngSrc 指令，它可以帮助我们更好地优化图片加载。这篇文章介绍了如何使用这个指令来优化图片加载。

这是 angular 团队与 chrome 团队合作成果！尽管你仍然可以自己去实现这个功能，但是这个指令可以帮助你更加方便地实现这个功能。结合 provider 可以更加精细化控制图片的加载策略。比如这里的 loaderParams。

```js
<img
    [ngSrc]="'photo-1417325384643-aac51acc9e5d'"
    [loaderParams]="{ compression: 50 }"
    fill
    priority
    ngSrcset="300w, 800w, 1500w"
/>
```

via: <https://angularindepth.com/posts/1522/the-who-what-where-when-why-and-how-of-image-optimization-in-angular>

### 2024-01-17\[工具]

bit 一种相对新的组件开发方式。 我在前一家公司就使用了 bit 来管理组件。它可以帮助你更好地管理组件，从而提高组件的复用性。

shadcn 和 radix 和 bit 有点类似。他们都强调弱组件库，他们都不是组件库。你需要什么组件，就添加什么组件。每一个组件都是独立的，可以单独发布，也可以单独使用。

radix 可以单独 install 单个组件。比如这样：

```bash
npm install @radix-ui/react-popover@latest -E
```

而 shadcn 则更干脆，你直接使用命令行，将组件源码下载到你本地，并安装组件的依赖。参考：<https://github.com/shadcn-ui/ui/blob/main/packages/cli/src/commands/add.ts>

值得一提的是 shadcn 是 2023 年最火的 ui 组件集成工具。不过并不像 bit 一样你可以在上面开发组件。

via:

* <https://ui.shadcn.com/docs>
* <https://www.radix-ui.com/primitives/docs/overview/getting-started>

### 2024-01-12\[好文]

sms-active 是一个可以帮助你接收短信验证码的网站，它可以帮助你接收各种网站的短信验证码，从而帮助你注册各种网站。

这在：

1. 网站需要短信验证码的时候非常有用，比如你想注册一个网站，但是你**不想给他们你的手机号**，那么你可以使用这个网站来接收验证码。
2. 网站限定手机归属地必须是某个国家的时候，你可以使用这个网站来接收验证码。

这个网站是付费的。

via: <https://sms-activate.org/en/getNumber>

### 2024-01-11\[好文]

很多网站提供了 RSS 订阅，但是 RSS 的订阅地址并不是很好找，网站作者很少有一个认知，那就是：如果你提供了 RSS 订阅，那么大方地放在主页上，这样可以让更多的人知道你提供了 RSS 订阅。

你如果你使用 RSS 管理工具， 一定试过将一个你关心的网站添加到 RSS 订阅却发现找不到订阅地址。而其实网站提供了 RSS 订阅地址，只是藏的很深。因此网站作者在主页标签里明确告诉读者和 RSS 阅读器：”我提供了 RSS 订阅，你可以订阅我的 RSS“ 是一种非常好的做法。

我的博客就提供了这样的一个标签来告诉大家我提供了 RSS 订阅，你可以在这里找到我的 RSS 订阅地址。

```html
<link rel="alternate" href="/blog/atom.xml" title="lucifer的网络博客" />
```

这篇文章 《Exposed RSS （公开的 RSS）》 就讨论了这个问题。

> 博客地址：<https://lucifer.ren/blog/>

via: <https://chriscoyier.net/2024/01/13/exposed-rss/>

### 2024-01-08\[工具]

oxlint 是一个用于检查 rust 代码的工具，它可以检查 rust 代码中的一些常见错误。相比 eslint 来说， 它更快，并且提示信息更加友好。

使用方法和 eslint 类似，集成到你的项目也非常的简单，可能就只需要几秒钟。不过它并不是 eslint 的替代品，目前还不支持插件。不过我相信它会越来越好用的。

via: <https://oxc-project.github.io/blog/2023-12-12-announcing-oxlint.html>

### 2024-01-07\[好文]

这是一篇关于如何在浏览器中实现一个协同编辑器的文章，它介绍了如何使用 OT 算法来实现一个协同编辑器。

OT 算法是一种用于解决协同编辑问题的算法，它的核心思想是将编辑操作转换为操作序列，然后在客户端和服务端分别执行这个操作序列，从而达到同步的目的。 实现上， 客户端和服务端通过 docReq 和 docRes 两个接口来进行通信。

如果你对协同编辑器感兴趣或者正在实现协同编辑，那么这篇文章是一个不错的开始，尽管这篇文章使用 GO 写的，但是重在领会思想。

via: <https://www.aadhav.me/posts/collaborative-editor#h5o-23>

### 2024-01-04\[好文]

这篇文章介绍了如何在 mac 上使用两个 github 账号，这在我们同时使用公司和个人账号的时候非常有用。

通过这篇文章，我学到了：

1. 通过如下命令可以切换 ssh 验证使用的私钥

```bash
alias git_personal="(ssh-agent) && ssh-add ~/.ssh/personal"
alias git_work="(ssh-agent) && ssh-add ~/.ssh/work"
```

2. git config 文件可以使用 path 来指定配置文件位置。
3. git config 支持条件语句 `includeIf`

```bash
[includeIf "gitdir:~/"]
path = ~/.gitconfig-personal

[includeIf "gitdir:~/Work/"]
path = ~/.gitconfig-work

[core]
excludesfile = ~/.gitignore
```

via: <https://fayazahmed.com/articles/how-to-use-two-github-accounts-on-a-macbook-the-right-way>

### 2024-01-03\[工具]

pix2tex - LaTeX OCR 是一个将图片转换为 LaTeX 的工具，它可以将图片中的公式转换为 LaTeX 代码，从而直接粘贴出来。

这在一些不提供复制功能的地方很有用。 虽然我认为网站应该自己提供复制功能，但是有时候我们也无法改变这些事实，所以这个工具还是很有用的。

不过可惜的是，这个工具还不是特别好用，算是勉强可用吧，毕竟是免费的工具。它的准确率还不是特别高，不过这个工具还是很有潜力的，我相信它会越来越好用的。

via: <https://github.com/lukas-blecher/LaTeX-OCR>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2023-11

![](https://p.ipic.vip/0bhil1.jpg) ![](https://p.ipic.vip/0bhil1.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2023-11

### 2023-11-31\[新闻]

excalidraw 是一个在线的白板工具，可以帮助你快速绘制一些图形，比如流程图，思维导图等。最近他新出了一个根据文字生成流程图的功能，和其他工具相比，它生成后你还可以进一步编辑，比如改变颜色，改变形状等。这本质是一个 ai 助手。

不过这个功能目前每天只能使用 10 次，也没有一个很好的教程或者内置 prompt，因此使用起来还是有一些门槛的。

![](https://p.ipic.vip/7bxb45.png)

via: <https://excalidraw.com/>

### 2023-11-30\[文章]

ARIA 是一个被很多人忽视的东西，但是它对于一些残疾人来说是非常重要的。比如屏幕阅读器，如果你的网站没有良好的 ARIA 支持，那么屏幕阅读器就无法正常工作。

这篇文章收集了一些常见的 ARIA 角色，以及如何使用它们。

另外推荐一个 eslint 插件，可以帮助你检查 ARIA 角色是否正确使用。地址：<https://www.npmjs.com/package/eslint-plugin-jsx-a11y>

当你的网站搭建好了，也可以使用这个网站来检查你的网站是否有 ARIA 角色的问题：<https://wave.webaim.org/>

via: <https://www.a11yproject.com/posts/an-indepth-guide-to-aria-roles/>

### 2023-11-29\[好文]

《Prettier's CLI: A Performance Deep Dive》 这篇文章讲解了 prettier 的性能优化过程，以及一些性能优化的技巧。

主要是关于匹配和缓存相关的内容，比如如何避免不必要的匹配，如何使用缓存等。

via: <https://prettier.io/blog/2023/11/30/cli-deep-dive>

### 2023-11-28\[类库]

Million.js 是一个极其快速且轻量级的 <4kb 虚拟 DOM，使 React 速度提高了 70%。 通过使用经过微调、优化的虚拟 DOM，Million.js 减少了 React 的开销。

可以理解为是一个让 React 组件以原始 JavaScript 的速度运行的类库。

它的原理是运行时通过 ref 获取真实 dom, 然后将 state 编译为 props 形式。这样 hoc 就可以控制组件不 render ，然后自己修改 dom （上一步通过 ref 获取到的）的方式来加快速度。

官方文档里有详细的介绍用法和底层原理，感兴趣的可以试试。

这个库功能上有点类似于 react 官方后续将要推出的 react forget。

via: <https://million.dev/docs>

### 2023-11-27\[框架]

fresh 是一个基于 deno 的 web 框架。

从本质上讲，Fresh 是**路由框架和模板引擎的组合**，可在服务器上按需呈现页面。除了在服务器上进行实时 （JIT） 呈现之外，Fresh 还提供了一个接口，用于在客户端上无缝呈现某些组件，以实现最大的交互性。该框架使用 **preact 和 JSX** 在服务器和客户端上进行渲染和模板化。

via: <https://fresh.deno.dev/docs/introduction>

### 2023-11-26\[好文]

得益于浏览器提供的强大 API，如下简单的代码，就可以实现一个简单的录屏，并导出视频功能。

```js
const button = document.createElement("button");
button.innerHTML = "capture";
document.body.append(button);
button.addEventListener("click", async () => {
  const stream = await navigator.mediaDevices.getDisplayMedia();
  const recoder = new MediaRecorder(stream);
  // start recording
  recoder.start();
  const [video] = stream.getVideoTracks();
  video.addEventListener("ended", () => {
    // stop recording
    recoder.stop();
  });
  // save record
  recoder.addEventListener("dataavailable", (evt) => {
    const a = document.createElement("a");
    a.href = URL.createObjectURL(evt.data);
    a.download = "capture.webm";
    a.click();
  });
});
```

via: <https://dev.to/ninofiliu/simple-screen-recorder-in-20-lines-of-javascript-4ina>

### 2023-11-25\[类库]

jest-image-snapshot 是一个 jest 插件，可以帮助你测试 UI 组件的样式是否正确。相比原生的 snapshot 测试，它基于渲染后页面进行像素级对比（可以自定义允许的像素误差），而且不对代码有任何要求，只要是浏览器可以渲染的就可以。

它扩展了 jest 的 expect 方法，你可以直接使用 expect(image).toMatchImageSnapshot() 来进行测试。

```js
const { toMatchImageSnapshot } = require("jest-image-snapshot");

expect.extend({ toMatchImageSnapshot });
```

使用:

```js
it('should demonstrate this matcher`s usage', () => {
    ...
    expect(image).toMatchImageSnapshot();
  });
```

via: <https://github.com/americanexpress/jest-image-snapshot>

### 2023-11-24\[类库]

tencent design 是腾讯的一套 ui 组件库，支持 web，小程序，flutter（这算是一个亮点），可以帮助你快速搭建应用。

它的文档设计地很好，进入到某一个组件，可以看到这个组件对应的 issue 有多少，以及多少是 open 的，组件最近更新的时间，以及组件最早可用版本等非常有用的信息。

![](https://p.ipic.vip/jtt7g1.png)

另外有指南来告诉你组件的最佳实践，也有实时预览（嵌入一个 iframe）。虽然这两个都是标配了，但是我还是从他的指南学到了一些东西。

via: <https://tdesign.tencent.com/>

### 2023-11-23\[好文]

Preact 出了一个 singals 的状态管理库，大小仅为几 kb，但是功能却很强大。

原理类似 vue3 里的响应式，能够自动跟踪依赖，实现应用的局部更新。正因为如此 react 团队觉得其和 react 基本理念不一致，因此不会将其集成到 react 中。但是表示会有一种类似的东西推出。

singals 不再像 hooks 一样局限于函数组件，而是可以在任何地方使用，并且可以做到按需局部更新。感兴趣的可以看看这一个科普视频

via: <https://www.youtube.com/watch?v=SO8lBVWF2Y8>

### 2023-11-22\[好文]

v8 是如何给字符串分配内存的？什么时候回收分配的内存？这里设计到很多性能方面的设计和考虑。

这篇文章详细地讲解了 v8 字符串分配的逻辑。

虽然内容用处不是很大，但是这篇文章的做事方法值得我们学习。学习一下作者是如何学习的，如果是让你去研究下 v8 字符串内存分配，你能做的和他一样好，甚至更优吗？

via：<https://iliazeus.github.io/articles/js-string-optimizations-en/>

### 2023-11-21\[好文]

chatgpt 允许你自己导入知识库，从而创建一个有专业知识的 ai。

比如你可以给它导入一本书， 然后问他任何关于这本书的问题。

更深入一点， 我们可以将某个网站做成知识库，导入进去，它就是这个网站的专家， 直接替代现在网站题目的 faq 或者人工智障机器人。

[gpt-crawler](https://github.com/BuilderIO/gpt-crawler) 可以帮助将任意网站只作为知识库输出一份 json，你只需要登录 openai 将其导入就可以快速生成有这样知识库的专业机器人。

via: <https://www.builder.io/blog/custom-gpt>

### 2023-11-19\[好文]

如何从零做一个拖拽的功能？

这篇文章你可以学到很多有用的和[指针](https://zh.javascript.info/pointer-events)有关知识。比如 setPointerCapture 是干嘛用的？也能学到很多设计思路。比如如果用户用的是触屏而不是鼠标怎么办？

via: <https://www.redblobgames.com/making-of/draggable/>

### 2023-11-18\[技巧]

之前 textarea 不能像 div 那样根据内容自动撑开。因此如果你只能使用类似 rows 属性给他指定高度，如果用户输入内容过多，那么就会隐藏一部分。

而新的 CSS 属性可以解决这个问题。只需要一行代码：

```css
textarea {
  form-sizing: normal;
}
```

### 2023-11-14\[新闻]

新的 chrome (112 或之后的版本)升级了无头浏览器，现在无头浏览器不再会出现**真实浏览器和无头浏览器不一致的情况了**。

如果你在项目中使用了无头浏览器进行端到端测试，不妨进行升级一下。

via: <https://developer.chrome.com/articles/new-headless/>

### 2023-11-10\[仓库]

一个关于 web3 的学习资料集合页，不仅有入门，也有实战，新闻媒体，工具等。

如果你想学习 web3，尤其是快速入门 web3 ， 这是一个还算不错的资料。

via: <https://github.com/jameslee-7/Web3.0-club>

### 2023-11-09\[仓库]

一个 waf 工具， 可以直接私有化部署。

想当年我也给我们公司做过 waf，也是花了至少几个月时间来完成的。如果你没这个预算，这个就是不错的选择。

配置要求也不高：

```
操作系统：Linux
指令架构：x86_64
软件依赖：Docker 20.10.6 版本以上
软件依赖：Docker Compose 2.0.0 版本以上
最小化环境：1 核 CPU / 1 GB 内存 / 10 GB 磁盘
```

via: <https://github.com/chaitin/SafeLine>

### 2023-11-08\[仓库]

facebook 开源的 docusaurus，社区算是比较活跃的， 基于 MDX，用户直接写 markdown， 帮你转化为网站，支持插件，主题，搜索等高级功能。

via: <https://github.com/facebook/docusaurus>

### 2023-11-07\[仓库]

一个 docx 渲染器，原理是将 docx 里的 xml 格式转成 html

相对于 Canvas 渲染，这个实现方案比较简单，最终页面也可以很方便复制，但无法保证和原始 docx 文件展现一致，因为有部分功能难以在 HTML 中实现，比如图文环绕效果。

你可以将他直接集成到你的项目中，无需后端服务，无需付费就可以架设一个 word 解析网站。

via: <https://github.com/baidu/amis/tree/master/packages/office-viewer>

### 2023-11-06\[好文]

如果你是一个 react 库的开发者。不免会使用 npm link 来测试。而这样会因为使用了 react 两个不同的包副本。当我们运行 npm link 时，我们不仅需要链接我们的项目，我们还需要链接 react 和 react-dom 以确保只有一个副本。

使用 yalc 可以解决这个问题，yalc publish 会在本机上进行发布，而不会发布到 npm。

via: <https://www.propelauth.com/post/test-your-react-libraries-with-yalc>

### 2023-11-04\[网站]

一个在线网站， 可以帮你生成隐私声明网页。

如果你是一个工具开发者（比如浏览器扩展），并且会收集一些隐私数据，比如用户当前访问的网站地址，有很多提供商现在要求你提供的工具的隐私声明网页。

我的 chrome 插件最近就遇到了这个问题。于是我就使用了这个网站，不到一分钟就生成了，谷歌审核还真就通过了。

via: <https://www.generateprivacypolicy.com/#wizard>

### 2023-11-03\[库]

FFCreator 是腾讯视频团队开源的生成视频的 JS 库。通过它可以将图片，音频或者视频片段按照各种方式组合起来，从而形成一个视频。

使用 FFCreator 和 vue.js，可以开发可视化拖拽搭建短视频的 web 项目，使用就像 h5 搭建工具一样的简单。

via: <https://github.com/tnfe/FFCreator>

### 2023-11-02\[工具]

一个脚本工具，可以集成到 ci 中，自动将你的 markdown 翻译为多种语言。由于集成了 chatgpt，因此翻译质量也很好。

这里的翻译质量很大程度上取决于你的 prompt。让大家看看人家的其中一段 prompt 是怎么写的，大家可以作为参考。

```
You are a professional translation engine, please translate the text into a colloquial, professional, elegant and fluent content, without the style of machine translation. You must only translate the text content, never interpret it.
```

via: <https://github.com/linyuxuanlin/Auto-i18n>

### 2023-11-01\[库]

我们平时做前端开发的时候，不免需要 mock 数据。最简单的写法自然是代码中写死。但是这样不利于维护和复用。 比较常见的做法是：

1. 写一个 baseurl，将所有请求封装为 baseUrl 拼接的形式。这样只需要将 baseUrl 改为一个提供 mock 服务的服务器地址即可。
2. 启动一个代理。配置一个规则， 这个规则将当前请求的 baseUrl 改掉转发到一个提供 mock 服务的服务器。

msw 类似于 2，相当于在浏览器上直接启动了一个代理（原理是使用 service worker）。不同之处是，它不仅是代理， 也是 mock 服务器，本身可以配置规则直接返回数据。

参考代码：

```js
// src/mocks.js
// 1. Import the library.
import { http, HttpResponse } from "msw";
import { setupWorker } from "msw/browser";

// 2. Describe network behavior with request handlers.
const worker = setupWorker(
  http.get("https://github.com/octocat", ({ request, params, cookies }) => {
    return HttpResponse.json(
      {
        message: "Mocked response",
      },
      {
        status: 202,
        statusText: "Mocked status",
      }
    );
  })
);

// 3. Start request interception by starting the Service Worker.
worker.start();

// Performing a GET https://github.com/octocat request in your application will result into a mocked response that you can inspect in your browser's "Network" tab
```

![](https://p.ipic.vip/sqarjj.jpg)

via: <https://github.com/mswjs/msw>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2023-09

![](https://p.ipic.vip/0bhil1.jpg) ![](https://p.ipic.vip/0bhil1.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2023-09

### 2023-09-26\[网站]

一个非常好用的编程语言互相转换的在线工具。

我试用了一下，效果非常好，应该有 AI 的加持。

我在刷题的时候，写题解需要提供多种编程语言就使用过这个工具，真的好用。

via: <https://www.codeconvert.ai/free-converter>

### 2023-09-25\[插件]

一个油猴脚本。安装后可以直接在豆瓣读书中，下载对应的 pdf 和 epub 文件。

![](https://p.ipic.vip/e2enzk.jpg)

via: <https://greasyfork.org/en/scripts/461293-%E6%88%91%E5%8F%AA%E6%83%B3%E5%A5%BD%E5%A5%BD%E7%9C%8B%E4%B9%A6>

### 2023-09-19\[好文]

《Design Trade-offs in Bundler: The Rationale Behind Creating Rspack 》是 rspack 的作者在字节对外的 github 组织下的一篇 discuss 分享。 讲述了为什么要自己开发 rspack，其解决了什么问题。

通过这个文章，我学习了两点。

1. webpack 中部分 loader 会 parse 生成 ast，原来这部分时间这么长。 文章作者通过复用 ast 达到了优化的目的。（当然其他构建工具也有复用 ast 的问题）如下图：

![](https://p.ipic.vip/yku6ee.jpg)

2. github dicsussion 支持了一个新的 markdrown 语言。用来给 quote 增加一些样式。如下图：

![](https://p.ipic.vip/5qosmd.png)

> 更多： <https://github.com/orgs/community/discussions/16925>

via: <https://github.com/web-infra-dev/wg/discussions/1>

### 2023-09-14\[工具]

一个油猴脚本，可以帮助你解决一些网站跳转到第三种需要你二次确认的问题。通过它，直接一键跳转到目标第三方网站。

via: <https://greasyfork.org/zh-CN/scripts/462796-%E5%A4%96%E9%93%BE%E8%87%AA%E5%8A%A8%E8%B7%B3%E8%BD%AC>

### 2023-09-13\[网站]

Tabserve 允许你将本地服务（通过 localhost 提供的服务）暴露到互联网。其他人可以通过一个域名直接访问到你的本地服务。而完成这个你不需要安装软件，只需要打开一个网站即可。

原理很简单，但是很有趣。

其原理大概是在你本地启动一个 websocket， 域名访问到 Tabserve 的服务后，会转发到你本地的 websocket，然后你本地的 websocket 转发到 localhost，然后将响应回传过去。**其实就是在你本地启动一个 websocket 充当代理。**

via: <https://tabserve.dev/>

### 2023-09-08\[工具]

pdf-poppler 是一个讲 pdf 转化为图片的库，通过它你可以自己搭建一个 pdf 预览服务。前端请求一个资源路径， node 端返回图片到前端进行展示即可。相比于浏览器端直接展示 pdf，兼容性和一致性都会有优势。

参考代码：

```js
const path = require('path');
const pdf = require('pdf-poppler');
 
let file = 'C:\\tmp\\convertme.pdf'
 
let opts = {
    format: 'jpeg',
    out_dir: path.dirname(file),
    out_prefix: path.baseName(file, path.extname(file)),
    page: null
}
 
pdf.convert(file, opts)
    .then(res => {
        console.log('Successfully converted');
    })
    .catch(error => {
        console.error(error);
    })
```

via: <https://www.npmjs.com/package/pdf-poppler>

### 2023-09-07\[网站]

一个在线工具，可以将音频转化为文字。目前支持三种方式，From URL，From file 和 Record。

via: <https://huggingface.co/spaces/Xenova/whisper-web>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2023-08

![](https://p.ipic.vip/0bhil1.jpg) ![](https://p.ipic.vip/0bhil1.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2023-08

### 2023-08-31\[好文]

ECMAScript 终于要推出 using 了。之前上大学的时候学习的事 C#，ECMAScript 的 using 和 C# 的恰好是一样的。TypeScript 5.2 也对 using 进行了抢先支持 👍。

如果你仅仅是做前端的，可能影响不大。毕竟客户端代码跑在客户电脑上，而且硬件配置一直在提高。因此问题不大。 但是如果你是做服务端的，你如用 node 来做后端服务，那么就必须考虑资源回收的问题。那么使用 using 则可以大大减少你的代码量，进而减少一些潜在的 bug 出现。

via: <https://mp.weixin.qq.com/s?\\_\\_biz=MzU2MTIyNDUwMA==\\&mid=2247522542>

### 2023-08-27\[类库]

一个移除背景的 JS 库，你可以通过它搭建一个在线的去除背景的网站。

via: <https://github.com/imgly/background-removal-js>

### 2023-08-26\[好文]

很有意思的一个想法。 通过 API 发送 UI，这样可以更容易做到千人千面的个性化 UI 页面。 然后发布也更容易。

不过似乎也加大了平台的审核难度。因为代码是通过 API 来发送的，而 API 可能不是部署到平台的，这样平台就很难审核。所以后期这个技术发展起来了，平台有可能会进行抵制。

via: <https://www.builder.io/blog/ui-over-apis>

### 2023-08-25\[类库]

Make React Faster. Automatically.

一个基于编译时的类库， 通过它可以将 react 应用重新编译（主要是加速 VDOM 算法），并获得性能提升。

比如你使用 CRA（create react app）创建 react 项目，那么就可以通过简单地如下配置接入 million。

```js
const million = require('million/compiler');
module.exports = {
  webpack: {
    plugins: { add: [million.webpack({ auto: true })] }
  }
};
```

via: <https://million.dev/>

### 2023-08-24\[新闻]

idx 是谷歌的线上开发环境，支持 AI 辅助编程。目前还没发布， 不过可以申请内测资格， 一变第一时间进行体验。（我已经申请啦\~）

via: <https://addyosmani.com/blog/project-idx/>

### 2023-08-23\[好文]

一个 css 属性，轻松制作缩略图？

用法很简单，只需要给想显示缩略图的元素一个属性即可。代码：

```css
mini-map .screen-image .canvas {
  background: white -moz-element(#main) no-repeat scroll center center / contain;
}
```

其中 -moz-element(#main) 是关键。 main 是想要显示缩略图的主体 DOM 的 id。

效果如下图（注意右面的缩略图）：

![](https://p.ipic.vip/7ekyiq.jpg)

你也可以监听点击时间，从而做一个可交互的缩略图。用户点击到哪里，页面就跳转到对应位置。类似 VSC 的缩略图。

via: <https://www.stefanjudis.com/a-firefox-only-minimap/>

### 2023-08-16\[好文]

文章名：

一个目前只有 chrome for android 才有的 api。通过它，可以给 input 指定弹起的键盘的位置。有了它，web 越来越逼近小程序了。如果继续发展， 或许小程序会消失也不一定？

![](https://p.ipic.vip/zockv1.jpg)

via: <https://ishadeed.com/article/virtual-keyboard-api/>

### 2023-08-15\[类库]

一个 chatgpt 网页风格的 UI 库。 如果你想要搭建一个基于类似 chatgpt 的网站，那么这个还算有点用，会让你快速搭建一个大家普遍熟悉的 ai 聊天网站。

via: <https://www.langui.dev/components/prompt-containers>

### 2023-08-04\[库]

neutralinojs 是一个类似于 electron 以及 NWJS 的桌面应用程序框架。主打的就是体积小，内存占用少，构建速度快。

via: <https://github.com/neutralinojs/neutralinojs>

### 2023-08-02\[库]

Mapkick 是一个地图库（sdk）， 支持 Mapbox and MapLibre，通过它除了可以实现诸如地图标点，地图画区域等功能。也可以实现诸如位置共享，轨迹回放等进阶功能。

via: <https://chartkick.com/mapkick-js>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2023-07

![](https://p.ipic.vip/0bhil1.jpg) ![](https://p.ipic.vip/0bhil1.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2023-07

### 2023-07-31\[好文]

chatgpt 发展了好久了， 很多人封装了一些工具给大家用。

比如

```
请用中文回答我。如果是代码问题，只提供代码，不要解释。
${query}
```

然后你的所有问题都会经过上面的包装，这样你不需要每个 thread 提问都告诉 gpt “用中文回答我。如果是代码问题，只提供代码，不要解释”。

openai 官方提供了类似的支持 Custom Instructions，目前是内测阶段，具体介绍请看文章。

via: <https://sspai.com/post/81470>

### 2023-07-28\[技巧]

有时候我会写一些自动化脚本。 就有一些系统层面上的接口需求， 比如我想获取当前正在激活的窗口等等。这在传统的 shell 脚本中不提供的功能。

我是 Mac 用户，可以利用 osascript 来实现这个需求。Windows 不太熟悉，有知道的小伙伴欢迎告诉我。

学习 osascript 都做 Mac 上的自动化很有帮助，结合 afred 等工具，简直如鱼得水。

比如我就写过一个 create new file in current folder 的功能。它会获取当前激活的 finder 的路径，然后在其下新建文件。（要是 Mac 下原生右键有新建文件我可能就不会写这个自动化工具了）。核心代码参考:

```bash
myPath=$(osascript -e 'try' -e 'tell application "Finder"' -e 'set this_folder to (the target of the front window) as alias' -e 'set this_folder to POSIX path of this_folder' -e 'return this_folder' -e 'end tell' -e 'end try' -e 'set this_folder to POSIX path of (path to desktop)' -e 'return this_folder')
cd ${myPath}
touch ${query}
```

有没有发现 osascript 和自然语言几乎一样了？ 有没有想到让 chatgpt 来帮你写？大家可以去试试。

### 2023-07-25\[网站]

有些港剧会限制 IP，只有香港才能看，开了 VPN 也没用，可以试试埋堆堆。

via: <https://www.mddcloud.com.cn>

### 2023-07-24

一个在线的海报制作工具。在如今很多工具都收费的时候， 可以用这个私有化部署到本地进行使用。

官方的介绍是：一款漂亮且功能强大的在线图片设计器，仿稿定设计，适用于多种场景：海报生成、电商产品图、文章长图、视频/公众号封面等，让设计更简单！（A beautiful online image designer, suitable for various scenarios like generate posters, making design easier.）

当然也可以当做技术进行学习，里面使用了很多主流的工具：

* moveable: 提供了画布中选择、拖动缩放等能力
* html2canvas: 前端生成图片兜底方案
* qr-code-styling: 风格化二维码
* sky: 参考了其 PSD 解析的实现

另外其是一个前后端同构的项目，这一点也可以学习一下（只不过很简单就是了，纯新手可能能够学习点东西）。

via: <https://github.com/palxiao/poster-design>

### 2023-07-23\[好文]

《Testing the dark scenarios of your Node.js application(测试 Node.js 应用程序的暗场景)》讲述了一些 node 服务测试中容易被大家忽略的点。比如应用启动不了的情况，请求超时的情况，文档和代码不一致的情况等等。

其中文档和代码不一致的方法这一点让我学到了，作者使用了 toSatisfyApiSpec 来进行类似于 snapshot 的测试。即根据你的请求返回值和文档文件（比如你使用了 openapi 做文档，那就是其导出的 yml 文件）进行对比，比如不一致就抛出错误。

有一个基于 jest 的工具 jest-openapi（<https://www.npmjs.com/package/jest-openapi）> 就是做这个的。

via: <https://practica.dev/blog/testing-the-dark-scenarios-of-your-nodejs-application/>

### 2023-07-22\[类库]

sortable 允许你给 HTML 的 table 标签增加一个 class="sortable" 就可以实现 sort 的功能。用法足够灵活， 需要注意的是在和目前主流的虚拟 DOM 框架结合使用的时候需要注意一下。

其原理很简单，就是绑定在 document 上一个 click 事件，handle 里进行判断，如果你点击的是 table 且有 sortable 的 class，并且点击的是表头，那么就将 table rows 进行排序，然后将排序后的结果 replaceChild 到原有的 table 上。

via: <https://github.com/tofsjonas/sortable>

### 2023-07-21\[技巧]

都 2023 年了， node 20 终于即将支持 timer 的 mocke 了。使用后，用户使用 settimeout 和 setinterval 等 api 就不需要真正地等待那么久了。

其实很多测试库都支持，但是 node 原生一直没有支持，现在支持了。

之前我们业务中就有一个需求是每五分钟拉取一次数据， 然后处理一下。 有了它就可以 tick 5 分钟， 然后断言。

```js
import assert from 'node:assert';
import { test } from 'node:test';

test('mocks setTimeout to be executed synchronously without having to actually wait for it', (context) => {
  const fn = context.mock.fn();
  // Optionally choose what to mock
  context.mock.timers.enable(['setTimeout']);
  const nineSecs = 9000;
  setTimeout(fn, nineSecs);

  const threeSeconds = 3000;
  context.mock.timers.tick(threeSeconds);
  context.mock.timers.tick(threeSeconds);
  context.mock.timers.tick(threeSeconds);

  assert.strictEqual(fn.mock.callCount(), 1);
});
```

context.mock.timers.tick(ms)， 会模拟经过了 ms 毫秒，而不必等真实世界过去 ms 毫秒。

via: <https://nodejs.org/en/blog/release/v20.4.0>

### 2023-07-20\[库]

一个新手导航插件，之前用过别的，这个插件的特点是体积小，无依赖，定制化程度也够用。

via: <https://driverjs.com/>

### 2023-07-14\[技巧]

借助于 HTTP 提供的 range，我们可以实现断点续传， 分段传输的功能。

也可以基于 range 实现视频快速跳转（点击指定时间就会加载那一部分的视频， 你看视频的时候的灰色区域就是通过类似的方式加载的），其实这本质也是分段传输。

实现将视频分为很多段，用户点击后判断下其属于哪一段，然后利用诸如 range 来实现分段传输即可。

via: <https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Range>

### 2023-07-13\[好文]

如何破解滑动验证码？

基本思想不是图像识别。而是利用滑块验证码中的滑块与周围图片的色差进行判断。即滑块会与周围图片有很大的色差，很违和。正因为如此， 人们才能识别出来应该滑动到哪里。

代码上，你可以将滑块放到 canvas 上，然后利用 canvas api 获取图片的像素信息，进而判断滑块的位置， 最后将滑块的位置和 token 传给后端。至于 token 怎么来，不同的网站方法会不同， 这篇文章就介绍了一种方式，以及破解思路。

via: <https://mp.weixin.qq.com/s/iK\\_JkVRrh5vIRBjnQbDOyw>

### 2023-07-11\[库]

我之前一直想用代码写动画。

但是太麻烦了，如果有一套声明式的代码就可以写动画，那就太好了。

我之前的想法是设计一套声明式语言，然后转为 excalidraw 组件，最后根据一系列的 excalidraw 组件调用库就可以完成。

> 有一个现成的库可以基于 excalidraw 生成 svg 动画， 我一直在用，效果不错。

但是使用我们今天介绍的网站(remotion)也是一个很不错的思路。

via: <https://www.remotion.dev/>

### 2023-07-10\[网站]

mikan 是一个追番平台， 你可以直接在上面下载最新的番剧。我试了一下， 下载速度挺快的， 一分钟左右就可以下载一集 MP4 到本地，清晰度也不错。

![](https://p.ipic.vip/3dlv5z.png)

我下载了一个 430 M，长度为 23m40s 的视频效果。

![](https://p.ipic.vip/a73vy1.png)

你也可以使用一些工具， 在线搭载一个在线视频播放网站， 从而打造一个自己专属的视频网站。

如果你愿意，也可以公开给别人。 不过这个 CDN 的费用恐怕会很高罢了。

另外，如果结合使用这个自动追番工具（<https://github.com/EstrellaXD/Auto\\_Bangumi/wiki），> 则会**自动**生成你的专属番剧库。

via: <https://mikanani.me/>

### 2023-07-09\[库]

据说是取代 gitalk 的工具。 gitalk 是基于 issue 做了，而此工具是基于 discuss。你可以直接使用网站（<https://giscus.app/）> 来快速生成接入代码。最后将代码复制集成到你的项目就好了。但是目前我这边一些配置并不能无缝从 gitalk 迁移到 giscus，因此我并没有取迁移，期待后面的完善。

via: <https://github.com/giscus/giscus>

### 2023-07-06\[技巧]

给任意在线网站调速度。

只要网站的视频是使用 video 标签播放的(不是 flash) 都可以用这个方法。

打开开发工具，选中我们要控制的 元素，然后输入以下内容：`$0.playbackRate = 10` ，并按 Enter 执行。你会发现，视频的播放速度已经发生变化了。

$0 表示我们最近选中的元素，playbackRate 是 video 的一个熟悉，表示视频的播放速度，10 表示的是 10倍速。

### 2023-07-02\[工具]

一个免费的多语言语音转字幕工具，你可以上传一个视频过去，它会自动帮你提取其中的语音并生成字幕。

最主要的用处是帮你生成字幕，你也可以用它来快速知道视频里讲的内容， 结合 chatgpt 的总结功能， 会更好用。

via: <https://godlucky.net/whisperapp/>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2023-05

![](https://p.ipic.vip/0bhil1.jpg) ![](https://p.ipic.vip/0bhil1.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2023-05

### 2023-05-31\[saas]

一个 saas 工具， 可以所见即所得地协作创建自己的网站，微小团队可以免费使用，可以用它接私活？

另外这个网站有很多功能是暂时没有的（比如 Git 集成），但是却出现在了宣传文章里。让我想起来了”新闻稿导向型开发”。即先出新闻稿，然后倒推。不过这个开发模式是假设产品开发出来了，要发新闻稿。而人家是真的发了新闻稿。

via: <https://dynaboard.com/features>

### 2023-05-23\[工具]

文字转语音工具吗，特点是可以插入笑声，哭泣声等。

目前支持的特性：

* \[laughter]
* \[laughs]
* \[sighs]
* \[music]
* \[gasps]
* \[clears throat]
* -or ... for hesitations
* ♪ for song lyrics
* CAPITALIZATION for emphasis of a word
* \[MAN] and \[WOMAN] to bias Bark toward male and female speakers, respectively

使用示例：

```py
from bark import SAMPLE_RATE, generate_audio, preload_models
from scipy.io.wavfile import write as write_wav
from IPython.display import Audio

# download and load all models
preload_models()

# generate audio from text
text_prompt = """
     Hello, my name is Suno. And, uh — and I like pizza. [laughs] 
     But I also have other interests such as playing tic tac toe.
"""
audio_array = generate_audio(text_prompt)

# save audio to disk
write_wav("bark_generation.wav", SAMPLE_RATE, audio_array)
  
# play text in notebook
Audio(audio_array, rate=SAMPLE_RATE)
```

如果你想直接用，也没有这种复杂的感情需求，那么可以使用一个免费的文字转语音网站：<https://ttsmaker.com/zh-cn> 这个网站也支持多种语言。

![](https://p.ipic.vip/h2bvwd.png)

via ： <https://github.com/suno-ai/bark>

### 2023-05-22\[工具]

ezno 和 esno 类似都可以代替 txc 的工具，基于 esbuild 来编译 TypeScript ，因此速度更快，主打的就是一个速度。使用方法很简单，本来用 tsc 的，直接替换为 ezno 或者 esno 即可。

via:

* <https://github.com/kaleidawave/ezno>
* <https://github.com/esbuild-kit/esno>

### 2023-05-21\[教程]

教你使用 Github Action 的一个文章，特色是交互式的网站。看完这篇教程，常见的 Action 都可以模仿它的 example 写出来。

左边是文章，右边是代码，鼠标移到文章上，会在代码中对应位置进行高亮处理。 上次看这种文章还是看的 React 的教程。

这种网站做起来比单纯写一篇文章累很多， 这我深有体会。对于读者来说， 这种效果也实实在在更好。

via: <https://www.actionsbyexample.com/>

### 2023-05-20\[库]

用 TypeScript 开发树莓派？devicescript！

DeviceScript将TypeScript开发体验带到了低资源微控制器设备中。

via: <https://microsoft.github.io/devicescript/api/settings>

### 2023-05-17\[工具]

midjourney 是一个 ai 工具，可以根据文字生成图片。最大的卖点就是生成后会给你若干选项， 你可以基于给出的选项不断优化图片使之满足你的预期效果，这是我在其他文字生成图片工具中没有看到的。

话说，已经有自媒体基于它给自己文章配图了。

via: <https://docs.midjourney.com/docs/quick-start>

### 2023-05-16\[工具]

slate 是一个富文本编辑器组件，语雀就是基于它来实现的。

via: <https://github.com/ianstormtaylor/slate>

另外一个特别火的最新的富文本编辑器是 blocksuite，和 notion 类似，是基于 block 来组织的。

via: <https://github.com/toeverything/blocksuite>

### 2023-05-15\[工具]

Easydict 是一个简洁易用的翻译词典 macOS App，能够轻松优雅地查找单词或翻译文本。Easydict 开箱即用，能自动识别输入文本语言，支持输入翻译，划词翻译和 OCR 截图翻译，可同时查询多个翻译服务结果，目前支持有道词典，🍎苹果系统翻译，DeepL，谷歌，百度和火山翻译。

via: <https://github.com/tisfeng/Easydict>

### 2023-05-13\[工具]

dify 是一个支持快速根据模板生成基于 chatgpt 应用的一个网站。 也可以 fork 到自己的仓库通过修改代码的方式进行定制。默认提供 200 次免费调用额度（一般都是不够用的）。

![](https://p.ipic.vip/u4jizn.png)

网站预览图：

![](https://p.ipic.vip/heah66.png)

via: <https://cloud.dify.ai/datasets>

另外有一个类似的工具，它也提供了类似的方式，不过 chatllm 是没有服务器的（也就不需要 openai 的秘钥了），更牛逼了，可以直接本地化部署， 一切都在浏览器中运行，并使用 WebGPU 加速。via: <https://mlc.ai/web-llm/。>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2023-04

![](https://p.ipic.vip/0bhil1.jpg) ![](https://p.ipic.vip/0bhil1.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2023-04

### 2023-04-30\[工具]

将可视化测试集成到你的系统？ 本工具（chromatic）是著名的 storybook 开发的。

via: <https://www.chromatic.com/docs/>

### 2023-04-29\[工具]

这是一个类似 chatgpt ，只不过其实一个 IDE 插件， 并且只是为了生成测试用例和优化代码。

我预测，将来一定会有很多仅覆盖某个领域的工具产生。

比如只喂法律数据源的法律 AI， 只喂前端数据源的前端助手等等。这样不仅回答更加专业，而且对于用户来说也更容易写提示词（prompt）。

via: <https://www.codium.ai/>

### 2023-04-28\[新闻]

亚马逊也推出了自己对标微软 copilot 的产品 CodeWhisperer，对个人免费，企业收费。

via: <https://aws.amazon.com/blogs/aws/amazon-codewhisperer-free-for-individual-use-is-now-generally-available/>

### 2023-04-27\[好文]

讲解 chatgpt 的原理的一篇文章，比较浅显，但是对于想了解但又不愿意花时间学习的外行来说很有用。

简单来说就是根据大数据建立模型， 并使用训练数据调整参数。 当用户提问时，它会内部使用机器学习算法计算出多种 output，然后取概率最大的 output 返回给用户。

via: <https://typefully.com/DanHollick/yA3ppZC>

### 2023-04-23\[网站]

自从 openai 公布自己的 chatgpt 后，各大公司也都在跟进，推出自己的 ai 产品。

vercel 就出了一个 playground ，集成了市面上常见的 ai 聊天引擎，你可以直接提问，并且支持选择引擎。然后根据对比两者的答案。

![](https://p.ipic.vip/rxs7ek.png)

via: <https://play.vercel.ai/>

### 2023-04-22\[库]

一个基于 svelt 的移动端组件库，特点是体积小， 速度快（无运行时 diff）。

via: <https://github.com/dufu1991/stdf>

### 2023-04-23\[库]

如何在 node 中引用其他语言写的库？

你可以使用 Node.js 的 child\_process 模块来在 Node.js 中调用其他语言编写的库。具体而言，您可以使用 child\_process 模块的 exec 或 spawn 方法来执行其他语言编写的可执行文件或脚本，并从 Node.js 中传递参数和接收输出。另外，您也可以使用 Node.js 的 C++ 插件来编写与其他语言库交互的 Node.js 模块。

linker.js 可以帮助你轻松生成 binding， 从而实现在 nodejs 中调用 cpp，rust，go 等代码。

via: <https://github.com/bitair-org/linker.js>

### 2023-04-22\[好文]

使用 webworker 来解决主进程负载过高是一个好的办法。 不过有如下问题：

1. 无法对 DOM 进行访问，因此设计到 DOM 时代码会比较复杂，需要不停地传输数据。 这个文章介绍可以通过 <https://github.com/ampproject/worker-dom> 来封装，屏蔽掉细节
2. 通信开销。 虽然减少了主进程的占用， 但是总的计算不但没有少，还增加了通信时间。如果通信数据很大，或者很频繁，那么这个开销就不可忽略。文章也提供了一种简单的参考方式。

via: <https://www.smashingmagazine.com/2023/04/potential-web-workers-multithreading-web/>

### 2023-04-18\[好文]

文章介绍了如果溯源 NPM 包，从而发现 npm 包是否是正规的（不是山寨的），有没有被篡改，最近有没有异常提交， 有没有危险的依赖等等。

但是这个成立的前提是这些 npm 包是通过 github action 发布的。

这或许是微软的一个野心，收购 github 和 npm，然后将其完全整合。

via: <https://github.blog/2023-04-19-introducing-npm-package-provenance/>

### 2023-04-11\[新闻]

Github 官方推出了商店系统，可以在上面购物，不过目前能买的东西比较少。

<https://www.thegithubshop.com/>

### 2023-04-10\[类库]

以更可读的方式操作 AST。

比如你想给一个文件增加一个导出成员，可以这样：

```js
import { loadFile, writeFile } from "magicast";

const mod = await loadFile("config.js");

mod.exports.default.foo.push("b");

await writeFile(mod);
```

其底层会操作 AST 来完成， 而如果你来操作 AST， 肯定会复杂一点。如果是我的话，还会去查一下 AST 操作库的 api 文档。 而使用了这个库就不用查询文档了，基本都是比较符合直觉的。

via: <https://github.com/unjs/magicast>

### 2023-04-09\[新闻]

copilot 集成了 chatgpt， 可以通过自然语言聊天实现修改代码了（会有一个类似聊天的窗口）。

copilot lab 扩展（<https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-labs）还可以直接翻译代码，> 自动生成测试用例等。（虽说不用这个也可以，但是却更加方便，相当于chatgpt 的 prompt）

via: <https://code.visualstudio.com/blogs/2023/03/30/vscode-copilot>

### 2023-04-02\[网站]

UX matters！

这是一个讲如何优化 UX，里面还有一些专业术语表 。更关键的是 UX 的好处，比如变现，提高满意度。

其中还有 case study 栏目， 其中第一个就是一个之前看过的比较老套的案例，但是确实值得一些公司学习。

via: <https://builtformars.com/>

### 2023-04-01\[好文]

代码同构对很多前端开发都不陌生。讲的是服务端和客户端都用一样库，这样可以实现代码共用。

但是如果你使用 ssr，那么实际上服务端是需要运行客户端代码的（生成 html 发给客户端）。因此就有了将客户端和服务端代码写到一个项目的实践，比如 .server.js 放服务端逻辑 .client.js 放客户端逻辑。然后通过打包分别生成服务端和客户端代码。

这有时候不是很方便， 因为客户端有时候也想访问服务端的一些东西， 如果能将其写到一个文件就好了。

《WTF Is Code Extraction》就讲了三种将客户端和服务端代码写到一起的方式， 以及都有什么问题需要解决，最后图穷匕见地安利了一下自己的产品😄 （它安利的那个库我没用过）

![](https://p.ipic.vip/nldp9u.jpg)

via: <https://www.builder.io/blog/wtf-is-code-extraction>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2023-03

![](https://p.ipic.vip/0bhil1.jpg) ![](https://p.ipic.vip/0bhil1.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2023-03

### 2023-03-31\[工具]

visual-chatpgt 可以允许你使用自然语言来进行图像识别， 图片修改（P图）等操作， 底层基于 chatgpt，由微软开源的一个项目，短短三个礼拜就收获了将近 30 k 的 star。

你只需要有 OPENAI\_API\_KEY 就可以按照网站上的方法进行安装了。如果没有 OPENAI\_API\_KEY，可以去 openai 网站上注册申请一个。

![](https://p.ipic.vip/dwhd33.jpg)

via: <https://github.com/microsoft/visual-chatgpt>

### 2023-03-30\[好文]

人工智能时代已经开启？？来看比尔盖茨的发言。

via: <https://www.gatesnotes.com/The-Age-of-AI-Has-Begun>

盖茨竟然将现在的 ai 比作它的旷世大作 windows，可见其厉害。

### 2023-03-29\[技巧]

bash 中可以使用 ctrl + r 开启前缀搜索功能，根据你输入的前缀在历史输入记录中进行匹配。如果想匹配下一项可以再次按下 ctrl + r。个人认为这个设计有点反人类，好在很多人都意识到了这个问题，并有了解决方案。

我使用的 oh-my-zsh，只需要下载一个插件 zsh-history-substring-search，并就其添加到配置文件，最后设置 bindkey ，将上下翻阅历史记录的按键映射到 up 和 down 上即可。

部分 .zshrc 文件如下：

```zsh
bindkey "^[[A" history-beginning-search-backward
bindkey "^[[B" history-beginning-search-forward
bindkey '^[[H' beginning-of-line
bindkey '^[[F' end-of-line

plugins=(
    zsh-history-substring-search
)
```

不仅仅是 ctrl + r 的搜索， 如果你安装了自动补全插件， 那么直接输入前缀就可以 up 和 down 切换了，也就说帮你省了按 ctrl + r 的时间！

如果需要使用，安装并在配置文件增加如下插件即可：

```
plugins=(
    zsh-autosuggestions
    zsh-history-substring-search
)
```

别忘记 source \~/.zshrc 使配置文件生效哦。

### 2023-03-28\[网站]

chatgpt 训练的数据是 2022 年以前的，因此如果你的数据太新了，可能会搜不到结果。

另外大家想把自己的网站集成 chatgpt，让他回答用户的问题，增强体验。

但是有两个问题：

* 太贵
* 训练比较麻烦。（比如你一段一段给它输入，让他学习，chatgpt 有输入限制）

chatpdf 这个网站可以支持几百页的一次性输入，要大得多。而且这个网站支持每天解析三个 pdf（截止到目前是的）。

你只需要将 pdf 丢给它训练，之后你就可以对 pdf 的内容进行提问。他会自己提炼，然后生成回答。（只不过一些回答是错的，大家需要注意，等待 chatgpt 升级可能会好点）

via ： <https://www.chatpdf.com/>

### 2023-03-27\[好文]

node 18 中终于内置了 fetch，test 等基础函数，太棒了，可惜来得太晚了一点。

node 19 原生支持 --watch 参数，终于不用安装三方包了。

更多请访问链接。

via: <https://blog.logrocket.com/exploring-competitive-features-node-js-v18-v19/>

### 2023-03-26\[工具]

Simplified IP client using WebRTC.

一个可以获取客户端 IP 的 JS 脚本，原理是基于 webrtc 协议会发送 IP 的特点。

注意是获取客户端 IP，而不是本机，因此这其实涉及到了隐私问题。 不过浏览器并不会提示你有人正在获取你的 IP，听起来还有点可怕，尽管使用代理可以解决这个问题，但是很多人都不用代理的，即使使用代理，有可能使用了规则， 对于某些网站仍然会暴露自己的真实 IP。

via: <https://github.com/joeymalvinni/webrtc-ip>

### 2023-03-25\[好文]

deno 竟然为了兼容 node 加入了 package.json，很多人表示不解，这篇文章来自 deno 官方博客，解释了其原因，。

via: <https://deno.com/blog/package-json-support>

### 2023-03-24\[好文]

NPM 发布了新功能 granular-access-token，详情：<https://github.blog/changelog/2023-03-21-general-availability-of-granular-access-token-on-npm/，> Github 也在 Actions 中对其进行了支持。

这篇文章详细讲解了如何在 Github Action 中使用 以最大限度保证代码安全。

via: <https://httptoolkit.com/blog/automatic-npm-publish-gha/>

### 2023-03-23\[好文]

学习一个东西最好是亲自经历，其次就是从别人的经历中学习。

作者介绍了自己从业二十年的两次重大投资失败案例， 最后的总结很重要，尤其是最后一条。

以下是最后一条的原文：

```
自由现金流才是投资企业第一要素，只有企业靠经营有了自由现金流，以上问题基本都可避免，它才有能力对你分红，不圈你的钱，所以我目前研究企业第一看企业有没有自由现金流，然后才看其成长性。
```

里面的经验有几条我都感同身受，那就是国内的报表几乎啥都可以造假（唯有现金，分红是不可能造假的），上市公司代表说的话啥也别信，高科技谨慎投资。

via：<https://xueqiu.com/1960822545/245105713>

### 2023-03-22\[好文]

精读《维护好一个复杂项目》,文章提炼了两个观点：

* 要有主人翁心态
* 要解耦

第一个观点比较有启发，就是你招聘的那个人很重要，而这个人的心态更重要。文章给了一个自动化测试用例的例子也很有启发，实际上已经有很多成熟的产品了，普遍的名字叫”录制测试用例“，比如微信的自动化测试就可以录制测试用例。

第二个观点有点老生常谈了。

via: <https://mp.weixin.qq.com/s/Fh72-rVU\\_I-ilCLQTCfgug#h5o-6>

### 2023-03-21\[好文]

将 react hooks 放到一张图中，并根据类型进行分类（state 相关的，effect 相关的，context 相关的等等）。一图胜前言，秒懂，好记。

![](https://p.ipic.vip/7zfnqc.png)

via: <https://julesblom.com/writing/map-of-react-api>

### 2023-03-20\[工具]

socket-npm = npm + audit

即 npm 的功能外加审核，你每次操作都会对你的包进行安全分析，防止安装一些危险的包。

这个工具的流行恰恰说明 npm 官方做的不行啊。

官方提供了一种使用方法：

```bash
alias npm="socket-npm"
alias npx="socket-npx"
```

这样以后使用 npm 都自动使用 socket-npm ，没有任何心智负担。不过我建议这样设置别名，类型 cnpm，给自己留一个区分二者的行为，并期待 npm 官方的行动。

```bash
alias snpm="socket-npm"
alias snpx="socket-npx"
```

另外其官方网站提供了完全可以替代 npm 官网的功能。在此，你可以查看项目的贡献者，项目的依赖，项目的风险（包括依赖的风险）等等，并直观上从各个层面给出得分，帮助你更好的选择包。

via: <https://socket.dev/blog/introducing-safe-npm>

### 2023-03-19\[类库]

Framer Motion 是一个基于 react 的动画库， 相比于 animejs 这种不依赖于框架的动画库，其更加易用。你只需要设置当前的值，它会自动根据上一个值自动做动画效果。

比如:

```js
<motion.div animate={{ x: 100 }} />
```

几秒后：

\<motion.div animate={{ x: 200 }} />

那么就会自动生成一个 100 - 200 平滑动画。

主要功能有：

* 手势支持（比如点击）
* 滚动
* 多种 Component，比如 Reorder 组件可以生成可拖动的组件（当然是自带动画的）
* 众多 hooks
* 。。。

via: <https://www.framer.com/motion/animation/>

### 2023-03-18\[工具]

Codex-CLI 是一个基于 chatgpt 的工具， 你可以使用自然语言来描述， Codex-CLI 自动帮你转化为 cli 语言，比如 bash 语言。

对于一些经常需要查 shell 语法的人来说，简直就是福音。但是如果你很熟悉 shell 的话，基本没啥用。

对于我来说， 常见命令我都有插件（我用的是 zsh 的第三方插件， 比如 git-plugin 等），缩写很容易就敲出来了，因此用处不是很大。我这里说的是常见命令，假如我突然需要做一些非常见的任务， 那么或许对我会很有用。

via： <https://github.com/microsoft/Codex-CLI>

### 2023-03-17\[心得]

买贵重物品东西前，可以先将价格转化为生命。比如你一天可以赚 100，买一个手机 3000，那么相等于你花了 30 天的生命买了个手机， 你觉得值么？如果你觉得值，那就买。

### 2023-03-16\[工具]

一个前端打包工具 farm， 采用 rust 编写，主要卖点是快。

rspack 才出几天，farm 就出来和 rspack 比性能了 😄。 想当初 rspack 出来就和 webpack，swc 等比性能。

作者还专门写了一篇中文文章来介绍《比 Vite 快 5 倍? 2ms HMR？Farm：基于 Rust 的极速构建引擎！》via: <https://zhuanlan.zhihu.com/p/611603260>

via: <https://github.com/farm-fe/farm>

### 2023-03-15\[框架]

vitest 是一个前端测试框架， 类似于 jest，用法”基本“兼容了 jest 中的常用 api， 因此很多项目都可以很容易地从 jest 迁移到 vitest。 比如大名鼎鼎的 react query 就刚刚从 jest 迁移到了 vitest。

vitest 的特点是：

* 快
* 支持 in-source 测试。即在代码文件中直接写测试（灵感来源于 rust ）
* 类型测试。还能对 TS 类型进行测试 😄
* 内置 benchmark

via: <https://vitest.dev/guide/features.html>

### 2023-03-14\[好文]

前端最近有一个新的概念 特别火，叫 Signal，之前也在 daily featured 中介绍过。

今天给大家推荐几个资料。

* 《Demystifying Create React Signals Internals》via: <https://blog.axlight.com/posts/demystifying-create-react-signals-internals/>
* 《dan\_abramov's reply for Discussion on: React vs Signals: 10 Years Later》via: <https://dev.to/dan\\_abramov/comment/256g9>
* 《The Evolution of Signals in JavaScript》via: <https://dev.to/this-is-learning/the-evolution-of-signals-in-javascript-8ob>
* 《React vs Signals: 10 Years Later》 via: <https://dev.to/this-is-learning/react-vs-signals-10-years-later-3k71>

### 2023-03-13\[投资]

这家企业值多少钱，换句话说：

* 如果你有钱买这个公司，你愿意花多少？
* 如果你是这个公司的老板，别人出价多少你愿意卖？

这篇文章提供了三个计算方法，企业价值＝分红 /（折现率 - 增长率），这三种方法都是 DDM 估值法，只是折现率取值不一样，分别是 10%，4% 和 2.5% ，并且通过巴菲特的例子来帮助大家理解什么时候应该用哪个折现率更合适。

文章标题：《永久持股收息是兑现伟大企业价值的唯一途径》

via: <https://xueqiu.com/3921480024/243769146>

### 2023-03-12\[投资]

芒格年度股东会（Daily Journal ）很有意思，里面很多内容都很有用。 给我的感觉就像是和一个投资界大佬谈话（实际上就是一个谈话类的会议），拓展我的投资视野。

2023 年的会议文字整理版本可以看这个，往年的大家可以自行搜索一下。

2023 年内容主要讲到了自己的投资策略和思想以及半导体行业，加密货币行业等，很有启发。

part1 via: <https://xueqiu.com/1173786903/243801264> part2 via: <https://xueqiu.com/1173786903/243807832>

### 2023-03-11\[类库]

TanStack Query (以前叫 React Query)，是一个功能异常强大的状态管理库，以前是为 React 做的。现在支持所有主流框架，就连名字都改了，目前的版本是 V4。

几大核心功能：

* fetching
* caching
* synchronizing
* updating server state

我的感受是，使用了它可以让你更方便的管理状态，尤其是服务端的数据。比如你新建了一个 mutation 是修改服务端的 post 数据， 那么这个库可以帮助你自动更新绑定了这个 post 数据源的组件。就不会发生修改了数据后，页面没有刷新的问题。同时它可以减少一些网络请求，至于什么时候以及为什么可以减少网络请求，留给大家去发现原因吧。

React 引入 hooks 之后，这个库就更好用了，核心功能就是 useQuery 的一个 hook。 代码大概这样：

```js
function Todos() {
  const { status, data, error } = useQuery({
    queryKey: ["todos"],
    queryFn: fetchTodoList,
  });

  if (status === "loading") {
    return <span>Loading...</span>;
  }

  if (status === "error") {
    return <span>Error: {error.message}</span>;
  }

  // also status === 'success', but "else" logic works, too
  return (
    <ul>
      {data.map((todo) => (
        <li key={todo.id}>{todo.title}</li>
      ))}
    </ul>
  );
}
```

via: <https://tanstack.com/query/latest/docs/react/overview>

### 2023-03-10\[框架]

remix 是一个基于 JS 的全栈框架。类似于 next.js 或者 nuxt.js ，大家可以对比起来理解和学习。

它可以通过 esbuild 构建出：

* 服务端代码
* 客户端代码

并”自动”进行优化，使得发送到客户端的代码足够少，进而实现更好的性能，这也是它的主打特点。

要做到这一点，就需要严格区分 client 和 server，并贯穿整个 codebase。所以它就是一个服务端渲染+客户端渲染的框架，屏蔽了一些底层细节，开发者更好上手。

我的下一个网站就打算使用 remix 来做，看看它到底有多快。

via: <https://remix.run/docs/>

### 2023-03-09\[工具]

我经常需要写一些脚本做一些事情，之前都是用 bash。但 bash 用起来实在没有高级语言方便，尤其是 JS。

于是后来我也尝试使用 nodejs 写脚本，但是 node 写起来真的是又臭又长。

这个工具是 Google 开源的，通过它你可以使用 JS 来写脚本，并且不会像原生 nodejs 写法一样又臭又长。尤其你需要使用 child\_process 去做一些其他事情，然后需要通过进程通信传输数据的时候。

来看一个官方的例子感受一下：

```js
#!/usr/bin/env zx

await $`cat package.json | grep name`;

let branch = await $`git branch --show-current`;
await $`dep deploy --branch=${branch}`;

await Promise.all([$`sleep 1; echo 1`, $`sleep 2; echo 2`, $`sleep 3; echo 3`]);

let name = "foo bar";
await $`mkdir /tmp/${name}`;
```

以下是一些其提供的很好用的”简写“。

```js
$ · cd() · fetch() · question() · sleep() · echo() · stdin() · within() · retry() · spinner() · chalk · fs · os · path · glob · yaml · minimist · which · __filename · __dirname · require()
```

via: <https://github.com/google/zx>

### 2023-03-08\[新闻]

Github 资料中可以编辑代称了，通过代称其他可以知道你是个人还是团体，是男的还是女的。

![](https://p.ipic.vip/o84h1m.png)

这个是 Github 2023-03-01 加的一个新功能。via: <https://github.blog/changelog/2023-03-01-add-pronouns-to-your-github-profile/>

### 2023-03-07\[新闻]

TypeScript 5.0 RC 已经发布了，来看看人家是怎么写发布博客的。如果你也要发布重大更新，想通知他人，而不知道如何写，不妨参考一下。

另外这个博客有个很有意思的事情。”原来 anyscript 这个梗， 微软官方也玩 😄“

![](https://p.ipic.vip/paggl6.png)

via: <https://devblogs.microsoft.com/typescript/announcing-typescript-5-0-rc/#const-type-parameters>

### 2023-03-06\[好文]

FinalizationRegistry 是一个新的浏览器 api，可以监听 JS 中的变量的内存释放情况。

《Experiments with the JavaScript Garbage Collector》 使用了这个 API 对常见的内存泄漏情况进行了分析，非常通俗易懂。 其中有一个 case 使用 eval，非常有意思。

via: <https://dev.to/codux/experiments-with-the-javascript-garbage-collector-2ae3>

### 2023-03-05\[类库]

texthighlighter 是一个 JS 类库，可以高亮 textarea。

如果不使用这个库，你可能需要自己实现一个 textarea，然后用样式定制， 比较麻烦。

![](https://p.ipic.vip/a8aemg.png)

via: <https://wstaeblein.github.io/texthighlighter/>

### 2023-03-04\[类库]

idraw 是一个画图工具， 不仅提供网页版本， 还提供一个 JS 库供开发者使用。类似 @excalidraw/excalidraw， UI 风格不太一样， 当时 API 基本是一致的。

via: <https://idraw.js.org/>

### 2023-03-02\[好文]

deno 自从诞生就考虑安全，隐私问题。 因此使用 deno 来搭建在线环境要比使用 node 简单很多。 这篇文章就介绍如何使用 deno 来搭建一个安全的 sandbox 用于执行用户的代码，提供一个云平台（Cloud Platform）。

via: <https://healeycodes.com/sandboxing-javascript-code>

### 2023-03-01\[好文]

一个可以去除网页中讨厌的悬浮框的小工具。 之前我都是直接打开控制台，然后找到悬浮窗手动”删除 DOM 元素“。

有了这个工具就可以自动地完成这个操作。原理也很简单， 就是直接使用 DOM API 找到 fixed 和 sticky 的 DOM，然后将其移除。代码参考：

```js
document.querySelectorAll("body *").forEach(function (node) {
  if (["fixed", "sticky"].includes(getComputedStyle(node).position)) {
    node.parentNode.removeChild(node);
  }
});

document.querySelectorAll("html *").forEach(function (node) {
  var s = getComputedStyle(node);
  if ("hidden" === s["overflow"]) {
    node.style["overflow"] = "visible";
  }
  if ("hidden" === s["overflow-x"]) {
    node.style["overflow-x"] = "visible";
  }
  if ("hidden" === s["overflow-y"]) {
    node.style["overflow-y"] = "visible";
  }
});

var htmlNode = document.querySelector("html");
htmlNode.style["overflow"] = "visible";
htmlNode.style["overflow-x"] = "visible";
htmlNode.style["overflow-y"] = "visible";
```

via: <https://github.com/t-mart/kill-sticky>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2023-02

![](https://p.ipic.vip/0bhil1.jpg) ![](https://p.ipic.vip/0bhil1.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2023-02

### 2023-02-28\[新闻]

chrome 的 headless 模式（无头浏览器）可以做一些集成测试。而之前由于 headless 模式和非 headless 模式两者是使用不用的技术实现，因此会有一些 bug（比如在无头浏览器好好的，在有头浏览器就有 bug，反之亦然）。

新的 chrome (版本大于等于 Chrome 112) 无头浏览器和有头浏览器采用的技术（codebase）是一样的， 因此不会有上面提到的问题。

via: <https://developer.chrome.com/articles/new-headless/>

### 2023-02-27\[好文]

《useSignal() is the Future of Web Frameworks》这篇文章解释了为什么 react 不能像 vue 那样智能追踪需要更新的组件。react 想做到这一点，就需要引入类似 useSignal() 这样的机制。而 preact 就对 useSignal() 进行了支持。

目前 Vue, Preact, Solid 和 Qwik 都支持。

via: <https://www.builder.io/blog/usesignal-is-the-future-of-web-frameworks>

### 2023-02-26\[库]

> A 'CSS reset' for TypeScript, improving types for common JavaScript API's

ts-reset 是一个类似于垫片的库，可以”修复“一些 ts 上的诡异行为。

Without ts-reset:

* 🚨 .json (in fetch) and JSON.parse both return any
* 🤦 .filter(Boolean) doesn't behave how you expect
* 😡 array.includes often breaks on readonly arrays ts-reset smooths over these hard edges, just like a CSS reset does in the browser.

With ts-reset:

* 👍 .json (in fetch) and JSON.parse both return unknown
* ✅ .filter(Boolean) behaves EXACTLY how you expect
* 🥹 array.includes is widened to be more ergonomic
* 🚀 And several more changes!

via: <https://github.com/total-typescript/ts-reset>

### 2023-02-25\[工具]

The fastest JSON schema Validator. Supports JSON Schema（最快的 JSON schema 验证器，支持 JSON schema）。

via: <https://github.com/ajv-validator/ajv>

如果你有验证 JSON 的需求，可以一试。

下面是一个使用 ajv 的简单例子。

```js
// or ESM/TypeScript import
import Ajv from "ajv"
// Node.js require:
const Ajv = require("ajv")

const ajv = new Ajv() // options can be passed, e.g. {allErrors: true}

const schema = {
  type: "object",
  properties: {
    foo: {type: "integer"},
    bar: {type: "string"},
  },
  required: ["foo"],
  additionalProperties: false,
}

const data = {
  foo: 1,
  bar: "abc",
}

const validate = ajv.compile(schema)
const valid = validate(data)
if (!valid) console.log(validate.errors)
```

另外它的报错相对于用户来说不友好，可以结合使用 better-ajv-errors 来获得更好的效果。

![](https://p.ipic.vip/s7ifcr.jpg)

via: <https://github.com/atlassian/better-ajv-errors>

### 2023-02-24\[类库]

一个帮助你 debug 的库。可以：

* 通过环境变量显示指定的信息（信息过滤的作用
* 自动在尾部添加时间消耗
* 不同颜色高亮显示
* 等等

支持在 nodejs 和 浏览器中使用。

![](https://p.ipic.vip/eamq1p.jpg)

![](https://p.ipic.vip/9czksq.jpg)

via: <https://www.npmjs.com/package/debug>

### 2023-02-15\[教程]

这个教程内容其实一般，不是我看过的同类型中质量最好的，但是其交互式的这种形式我特别喜欢，想要借鉴。

这真的是一个我一直想做的类型 - 交互式教程。我的想法是做一个交互式的算法教程，我之前没有接触过这种形式，但是在我的想象中如果做出来，那么肯定能帮助到很多人。

这个教程是使用 JS 编写 Lisp 的编译器。可以帮助你理解：

* 词法分析
* 语法分析
* AST 遍历
* 代码生成

另外可以帮助你理解语言规范，递归等内容。

via: <https://citw.dev/tutorial/create-your-own-compiler>

### 2023-02-14\[新闻]

chrome 110 新增一个新的伪类选择器：:picture-in-picture 可以自定义画中画元素样式。

其实从 chrome 69 开始我们就可以通过 api 来让视频画中画播放。

```js
function togglePictureInPicture() {
  if (document.pictureInPictureElement) {
    document.exitPictureInPicture();
  } else if (document.pictureInPictureEnabled) {
    video.requestPictureInPicture();
  }
}
```

不过现在我们甚至可以为其自定义样式。

via: <https://developer.mozilla.org/en-US/docs/Web/CSS/:picture-in-picture>

### 2023-02-10\[技巧]

分享几个 git 配置技巧。

1. 先配 name 和 email。

```bash
git config --global user.name "Your Name"
git config --global user.email "you@your-domain.com"
```

2. 再执行这两条命令。

```bash
git config --global --add push.default current
git config --global --add push.autoSetupRemote true
```

你会收获两个好处。

* 1）不需要「git push origin xxx」，只要「git push」
* 2）再也不会遇到「no upstream branch」的报错，也不需要「git push --set-upstream origin test && git push」。

因为我们执行 git push 的大部分场景都是 push 到同名的 remote branch。来源是 Auto setup remote branch and never again see an error about the missing upstream

3. 再修改 \~/.gitignore\_global，加入和你 IDE 相关的 ignore 配置。

我会把 .idea 加进去，这是和你相关的专有配置，如果给其他用 VSCode 的作者的项目提交时，都加上 .idea 的 .gitignore 配置，其实并不太礼貌。反之，VSCode 或其他编辑器工具的用户也要加上自己的。

```
*~
.DS_Store
.idea
```

### 2023-02-07\[工具]

turbo 管理 mono 有一很吸引我的点就是它的 cache。它会利用尽可能多的信息（比如参数， 环境变量等），判断 output 在之前是否已经生成了，进行减少重复工作。它甚至支持服务端缓存， 整个开发团队共享一份 cache，那么构建速度肯定会显著提高。

via: <https://turbo.build/repo/docs>

### 2023-02-06\[工具]

Tauri 是一个 electron 的竞品， 在 2022 年非常闪耀。

via: <https://tauri.app/>

### 2023-02-05\[工具]

和 deno，node 以及 quickjs 类似， Bun 是一个 JavaScript 引擎，采用 zig 编写，性能很强。

![](https://p.ipic.vip/32xrod.jpg)

via: <https://byteofdev.com/posts/what-is-bun/>

### 2023-02-02\[好文]

浏览器提供了一个内置的 API： structured-clone 用来深拷贝。

via: <https://www.builder.io/blog/structured-clone>

### 2023-02-01\[好文]

chrome 浏览器提供了一些新的 api： document.onscrollend

```js
document.onscrollend = event => {…}
```

可以用来监听是否滚动已经停止。

via: <https://developer.chrome.com/blog/scrollend-a-new-javascript-event/>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2023-01

![](https://p.ipic.vip/0bhil1.jpg) ![](https://p.ipic.vip/0bhil1.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2023-01

### 2023-01-31\[插件]

error lens 是一个 vscode 插件， 可以内敛的形式显示错误信息。在这之前大家需要在 output 或者 problems 面板查看，相当麻烦。

![](https://p.ipic.vip/6kpp7b.png)

比如你的括号少了一个， 它就立马提示你哪里需要添加一个括号。大家 vscode 插件市场搜索 Error Lens 即可安装。

### 2023-01-30\[好文]

Zod: The Next Biggest thing after Typescript

本文介绍了 zod 如何同时在运行时和编译时进行类型校验的。 有点像一次编写，到处运行？

via: <https://dev.to/jareechang/zod-the-next-biggest-thing-after-typescript-4phh>

### 2023-01-28\[库]

你可能遇到文本换行后第二行只有一个字的情况， 这个时候会显得不美观，能不能让他们挤挤，弄到一行呢？

react-wrap-balancer 就可以满足这个需求， 它是一个优化换行样式的 react 库。当浏览器视口发生变化的时候，它能适应这个变化，然后以最佳的方式展现换行文字。

via: <https://www.npmjs.com/package/react-wrap-balancer>

### 2023-01-20\[技巧]

如何实现弹幕防遮脸功能？

其实很简单。 普通的弹幕都是在视频上放一些 div 然后滚动即可， 防遮挡只需要：

1. 预先处理出一个遮罩图片。
2. 将遮挡图片放到弹幕和视频之间即可。用 CSS 的 [mask-image](https://developer.mozilla.org/en-US/docs/Web/CSS/mask-image) 就可以实现。

关键是如何预处理出遮罩图片呢？我们可以在后台利用人脸识别技术对视频中的每一帧进行人脸识别， 并将人脸处理成一张遮罩图片。这样我们得到了每一帧的遮罩图片， 前端根据视频进度不断更新对应这道图片即可。

### 2023-01-19\[仓库]

这是一个给 JS 选手的 Go 语言学习手册。

通过一个个常见的 case 的 JS 写法和 Go 写法对照，帮你快速掌握 Go。 之前我也分享过一些各种语言主流写法对比，感兴趣的可以翻翻历史记录。

![](https://p.ipic.vip/9unsf7.png)

这个仓库的对比写法或许有用， 不过大家千万不能仅仅阅读一下就完事了，这不是 API 手册。

我的方法是每天通过刷力扣的时候使用 Go 来刷来强化， 话说我的 Python 就是这么学习的 😄。

![](https://p.ipic.vip/de8c5c.png)

via: <https://github.com/miguelmota/golang-for-nodejs-developers>

### 2023-01-18\[扩展]

meduim 是一个很流行的国外网站， 里面各种内容都有， 我之前会时常在里面看一些技术文章。

这个网站很反人性的一点是，他会给你每一月的阅读额度，超过后需要付费才能继续看。这本身可以理解， 但是竟然只要你使用无痕模式就没有这种限制，这让付费的我很难接受。

这个扩展工具可以在你没有额度的时候通过点击一下立马解锁阅读权限，原理和上面类似，就是退出登录并将一些标记你身份的信息消除。

![](https://p.ipic.vip/18p8e2.png)

via: <https://chrome.google.com/webstore/detail/unlimited-medium/medpfcealkejgpagldhgadbfaejjacaa/>

### 2023-01-17\[类库]

astro 是一个不错的框架，不过给我印象最深的是它的 tutorial，做的太好了，值得我学习。

我已经完成了它的全部教程 🎉

![](https://p.ipic.vip/cixlhd.png)

他有很多特性非常有意思，比如：

* CSS，JS 和 HTML 写到一个文件里。 上面可以写 JS 然后用分隔符分割。

![](https://p.ipic.vip/gxbr09.png)

* 默认 0 JS。

![](https://p.ipic.vip/gsdbm5.png)

* 开箱即用的 RSS， 对博客用户非常优化啊，不用找第三方插件，而且定制性很强，你甚至可以过滤一些不想被 RSS 的文章。

![](https://p.ipic.vip/xyisvn.png)

等等。更多特性，请参考官方网站。

via: <https://docs.astro.build/en/tutorial/0-introduction/>

### 2023-01-13\[仓库]

根据文件的引用关系计算文件的重要程度，被引用的越多越重要，这个思路和代码其实都蛮简单的。大家没必要真的项目中使用，主要就是学习思路。

via: <https://github.com/codemix/deprank>

### 2023-01-12\[教程]

这个视频教程教你如何使用 JavaScript 在几分钟内实现一个迷你区块链，二倍速观看效果更佳。看完后你会对区块链背后的技术有一个简单认知， 别小看这个简单认知， 这就是区块链的核心。一些其他都是围绕这个核心展开。

> 这是第一部分，视频的介绍部分有第二部分的链接。为了防止修改， 我贴一下 <https://youtu.be/HneatE69814>

via: <https://www.youtube.com/watch?v=zVqczFZr124>

### 2023-01-11\[教程]

《The Newbies Guide to Crypto》一个面向新手（无需编程语言基础）的加密货币，区块链教程。 更加侧重的是实用角度，你如何想开发，可以关注一下智能合约， Dapp 等， Github 也有很多优秀的资料。

via: <https://helpthisbook.com/sunny/the-newbies-guide-to-crypto/42abff74-1052-4181-a097-ca0309c4cc15>

### 2023-01-04\[工具]

中国的称谓真的很复杂， 很多时候面对一些常见不见的亲戚我都反应不过来叫啥。

这个工具可以直接根据关系计算称谓。

![](https://p.ipic.vip/aruc0c.png)

via: <https://github.com/mumuy/relationship>

### 2023-01-03\[工具]

大家上网的时候一定见过 placeholder， 在图片没有加载出来之前用来占位。很多网站的 placeholder 都是一个样子。 而有的做的更精进一点的是先加载一个分辨率很低的 placeholder。

而这个工具可以根据原图计算一个哈希，然后根据这个哈希可以直接在本地渲染一个 placeholder， 这个 placeholder 在上一个解决方案的基础上还不用占用网络带宽。

via: <https://github.com/woltapp/blurhash>

### 2023-01-02\[网站]

又一个好用的在线画图工具来了，测试了一下， UI 非常好看，share 功能很好用，易用性有待提高。好在现在是 beta 阶段，后面应该会进行优化，期待后续的表现吧。

![](https://p.ipic.vip/iaowp9.png)

via: <https://beta.tldraw.com/>

### 2023-01-01\[仓库]

iptv(Internet Protocol television) 可以让你看世界各地的电视直播，我自己试了一下，频道非常多，流畅度也不错。甚至可以看一些成人电视（当然建议你过滤掉这些成人内容，这个仓库也贴心地提供了一个过滤了成人内容的 m3u 地址）。

使用方式很简单：

* 选择你想看的直播列表
* 复制链接，粘贴到支持 m3u 的播放器（比如 IINA）。

![](https://p.ipic.vip/75t0y9.jpg)

via: <https://github.com/iptv-org/iptv>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2022-11

![](https://p.ipic.vip/ptsz11.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2022-11

### 2022-11-30\[软件]

Syncthing 是一个在不同设备之间同步文件的软件， 你可以用它来备份还原。

使用方法很简单，下载后双击打开后访问：<http://127.0.0.1:8384/#>

接下来选择你需要同步的文件， 然后添加远程设备（输入一个设备 ID 就好了）就可以发送文件了。

![](https://p.ipic.vip/arcjyh.jpg)

via: <https://syncthing.net/>

一个类似的软件是 Sendy，通过它可以分享文件，生成链接给任意朋友，当然你也可以发送给自己实现跨设备发送文件。地址：<https://chrome.google.com/webstore/detail/sendy-for-chrome-gmail-sl/pagahecnnmjjlpoakhagcpnalaodfbkk>

### 2022-11-29\[算法]

输入一个 DOM， 返回这个 DOM 的选择器（selector）。

Given a DOM, can you return its selector?

```js
function t(dom: HTMLElement): string {}
```

我们可以从当前 DOM 借助 parentNode 属性往上找到根节点， 路上的节点通过选择器进行定位，最后拼接即可。代码参考：

```js
function t(dom: HTMLElement): string {
  if (dom.tagName.toLowerCase() == "html") return "HTML";
  let str = dom.tagName;
  str += dom.id != "" ? "#" + dom.id : "";
  if (dom.className) {
    str += dom.className
      .split(/\s/)
      .map((c) => `.${c}`)
      .join("");
  }
  return t(dom.parentNode) + " > " + str;
}
```

其实我们还可以做的更好一点，那就是遇到 ID 选择器直接 break。

```js
function t(dom: HTMLElement): string {
  if (dom.tagName.toLowerCase() == "html") return "HTML";
  let str = dom.tagName;
  str += dom.id != "" ? "#" + dom.id : "";
  if (dom.id) return str;
  if (dom.className) {
    str += dom.className
      .split(/\s/)
      .map((c) => `.${c}`)
      .join("");
  }
  return t(dom.parentNode) + " > " + str;
}
```

### 2022-11-24\[网站]

如果你发现一个网站无法打开，你可能会想知道是你打不开了还是所有都打不开了。

这个时候一个检查网站目前是否可用的工具就很重要了。这里介绍一个我使用过的网站。

via: <https://downforeveryoneorjustme.com/>

### 2022-11-17\[好文]

论算法的重要性。 原帖标题《十年程序员难倒了一个算法上面，真的老了》

via: <https://www.v2ex.com/t/895464#reply135>

简单说一下这道题。 如果第一个数组只有一项，那么就是一个典型的背包问题。 不过，背包问题求的是组合数或者极值，而这道题是求匹配方案， 因此我们不得不采用回溯的方法。

另外，第一个数组不止一项，怎么办呢？其实我们还是用回溯的思路，新建一个数组来标记一下第二个数组中每一项的选择情况即可。

### 2022-11-16\[好文]

github 代码搜索确实不好用，以至于我一般都是直接将 .com 改为 .dev 然后在一个在线版的 VSCODE 中搜索。

而现在搜索功能以及代码阅读等都进行了增强，比如可以通过正则来搜代码。

![](https://p.ipic.vip/lj25qz.jpg)

via: <https://github.blog/2022-11-15-a-better-way-to-search-navigate-and-understand-code-on-github/>

### 2022-11-15\[技巧]

有时候我们使用的 Mac 应用突然间挂了，你又想知道为什么挂了。可以将 mac 应用使用终端（terminal） 打开，这样应用如果有打印日志的话，你就可以看到。

那么如何将 mac 应用使用终端打开呢？大家可以在应用文件夹中找到你想打开的应用，然后右键**显示包内容**（show package contents），里面找到一个 Contents/MacOS/ 下 找到一个可执行文件，将其拖到终端即可。

比如 /Applications/Karabiner-EventViewer.app/Contents/MacOS/Karabiner-EventViewer

你也可以直接将上面的路径粘贴到终端执行。

### 2022-11-14\[工具]

electron-log 是 electron 上一个日志管理工具，可以输入日志到终端，文件，也可以重写后上报到后端。其还支持很多功能， 比如 Catch Error， 从而上用户手动上报错误等。

via: <https://github.com/megahertz/electron-log>

### 2022-11-13\[网站]

一个开发人员参考手册，内容一般，但是界面还是蛮漂亮的，期待后续的完善吧。

![](https://p.ipic.vip/lj25qz.jpg)

* 英文版: <https://github.com/Fechin/reference>
* 中文版：<https://github.com/jaywcjlove/reference>

### 2022-11-11\[工具]

AutoCut: 通过字幕来剪切视频

这意味着你只需要文本编辑器就可以剪辑视频。

via: <https://github.com/mli/autocut>

### 20220-11-04\[网站]

fly.io 是一个类似 heroku， vercel 的免费代码托管平台，相当于得到了一个免费的云服务器。

via: <https://fly.io/docs/>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2022-10

![](https://p.ipic.vip/y0jsyp.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2022-10

### 20220-10-31\[技巧]

input 输入框有一个 capture 属性，允许用户在手机上直接调用摄像头。之前我们大多是通过混合式 app 调用 jssdk 的方式来实现。

代码：

```html
<body>
  <label for="environment">Capture environment:</label>
  <br />
  <input type="file" id="environment" capture="environment" accept="video/*" />
  <br /><br />
  <label for="user">Capture user:</label>
  <br />
  <input type="file" id="user" capture="user" accept="image/*" />
</body>
```

capture="environment" 会开启录制， capture="user" 会开启拍照模式。

### 2022-10-24\[工具]

我们通常会对自己的线上服务进行监控，保证自己服务的可用性。而很少有对自己服务中的外链进行监控。其实想做到也很简单，直接爬虫后正则匹配网站后发送一个请求查看其是否可用即可。这里介绍一个工具，它的作用就是帮你检查网站的**坏链**。

使用方法非常简单，一行命令就可以了。

```bash
$ npx check-html-links your_site_url
```

via: <https://github.com/modernweb-dev/rocket>

### 2022-10-22\[好文]

一个如何解决一个 bug 的深度复盘文章。原文标题《随手给 Safari 提了一个 Bug，让我意外收获了这些新知识 》

via: <https://github.com/mrlmx/blogs/issues/2>

### 2022-10-21\[类库]

现在市面上有一些在线编辑 gif 的工具，那么你知道如何自己实现一个这样的工具么？借助今天介绍的类库就可以很简单地实现，我们可以对帧率，算法等进行深度定制，灵活性极高。

canvas-gif 是一个编辑 gif 的图片，通过它可以修改 gif 的内容，增加文字等。

via: <https://github.com/newtykins/canvas-gif>

### 2022-10-19\[仓库]

Pake 是一个让你用 Rust 开发桌面客户端的工具， 类似于 electron 开发桌面应用，只不过这个基于 Rust 的，最大的特点是大小要小将近 50 倍，一般不到 2M。(electron 应用打出来都是百兆起)

via: <https://github.com/tw93/Pake>

### 2022-10-18\[类库]

两行代码将 playground 集成到你的项目中。

```js
import { Sandpack } from "@codesandbox/sandpack-react";

<Sandpack template="react" />;
```

如上代码直接生成 playground 到 DOM 上， 你可以在左侧编辑代码，右侧可以实时看到效果。

在这之前，我想实现类似的效果都是嵌入一些这种网站， 比如 codepen 到我的项目中的，自定义程度很差。

via: <https://github.com/codesandbox/sandpack>

### 2022-10-15\[网站]

输入文字自动生成高清视频，视频素材打打字就能搞定？ 或许吧，目前网站还在预定中，对这个功能感兴趣的可以先预定。

> 目前市面上已经有竞品了，这对用户来说是好事 😄

via: <https://makeavideo.studio/>

### 2022-10-16\[教程]

keynote 自从有了**神奇移动** 动效后， 我发现用 keynote（类似于 windows 的 ppt） 做动画很简单。很多人也发现了这一点。同时我看了一些教程，现在基本上大多数的动画只要看一眼就大概知道怎么去做了。

这里推荐我看过的一个教程，里面有几十个 demo，每一个都用一分钟左右的碎片化时间完成。看完你会发现，使用到的技巧其实就那么几种。然而恰好就是这几种就能完成大多数的动画效果，而且还**特别简单**。

via: <https://space.bilibili.com/25777113/channel/collectiondetail?sid=83180>

### 2022-10-06\[好文]

一个可以在 web 上直接接入打赏功能的工具。

打赏者需要下载一个浏览器插件并注册一个账号，被打赏者需要在网站增加一个 link 标识一下网站的被打赏人的基本信息。

感觉之后的自媒体会往这个方向发展，结合 web3 逐渐弱化中心化的自媒体平台。

via: <https://blog.logrocket.com/getting-started-web-monetization-api/#using-coil-extension-send-money>

> 目前也有一些自媒体工具，可以直接给你生成一个属于你自己的自媒体平台。比如这个 <https://ghost.org>

### 2022-10-05\[好文]

分享一篇雪球上的关于投资的好文。《众所周知，最有价值的投资资料，都是免费的》

via: <https://xueqiu.com/1830902728/230241156#h5o-8>

### 2022-10-04\[仓库]

novu 是一个关于消息推送的解决方案。

它提供了易于使用的 JS 客户端。

如下代码可以精准地向某一个用户推送一条 hello world 消息，并附带一个 logo。

```js
import { Novu } from "@novu/node";

const novu = new Novu(process.env.NOVU_API_KEY);

await novu.trigger("<TRIGGER_NAME>", {
  to: [
    {
      subscriberId: "<UNIQUE_IDENTIFIER>",
      email: "john1@doemail.com",
      firstName: "John",
      lastName: "Doe",
    },
  ],
  payload: {
    name: "Hello World",
    organization: {
      logo: "https://happycorp.com/logo.png",
    },
  },
});
```

其中 NOVU\_API\_KEY 就是你在 novu 上申请的一个秘钥，由于服务端验证。

via: <https://github.com/novuhq/novu>

### 2022-10-03\[仓库]

一个可以不多写一行代码就给 Java 项目生成 API 文档的工具。 基本原理是基于 AST 去分析代码，然后给其添加 API Doc。

Node 项目很难使用这种方法，因此 JS 是一门动态语言， 很难通过 AST 去分析出所有的路由定义信息，除非加一些显式的约定。

via: <https://github.com/tudou527/OneAPI>

### 2022-10-02\[技巧]

大家可能看过这种表格，里面的上涨和下跌使用不同深度的颜色来区分。

![](https://p.ipic.vip/i1ohfv.jpg)

使用 excel 可以很容易实现这个需求。

具体操作为：选择“条件格式”-“色阶”-“红白绿色阶”，这样就使得涨幅大的数据自动显示深红色，跌幅大的数据自动显示深绿色。

### 2022-10-01\[资料]

操作系统是计算机专业重要的课程，对每一个从事软件开发的人都是很重要的课程。

* 从思想上， 你可以学到先辈的先进思想和经验，比如操作系统中的各种数据结构和算法。
* 从操作上， 可以帮助你更高效地使用操作系统。比如学习 shell 可以帮你更快写出脚本。

因此非常推荐大家进行学习。这里推荐一份《如何从零开始编写一个操作系统!》

via: <https://github.com/ruiers/os-tutorial-cn>

如果实在觉得啃得困难，可以看看《重学操作系统》这个资料 <https://kaiwu.lagou.com/course/courseInfo.htm?courseId=478#/sale>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2022-09

![](https://p.ipic.vip/j7mttv.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2022-09

### 2022-09-30\[好文]

文章介绍了如下几种可以不使用括号执行函数的方法。

比如 alert(1337) 可以写成：

```js
alert`1337`;
```

甚至是这样：

```js
[].sort.call`${alert}1337`;
```

这有什么用？

* 有的放地方会静态检测代码有没有函数执行代码（invoke）。
* 看起来很酷 😎
* 。。。

via: <https://portswigger.net/research/the-seventh-way-to-call-a-javascript-function-without-parentheses>

### 2022-09-29\[工具]

一个 nodejs 库，可以将你的 nodejs 应用打包为二进制包，支持多种操作系统。打包后就可以在不安装对应 nodejs 环境的情况下使用软件，因为 pkg 已经将依赖打包进去了。

via: <https://github.com/vercel/pkg>

### 2022-09-27\[技巧]

今天学到了一个很巧妙的做图技巧。

如下图是中国人民银行日前发布的《2022 年人民币国际化报告》 中的一张图：

![](https://p.ipic.vip/w0fsrv.gif)

人民币如果和其他货币一个纵轴的话， 那么就会显得人民币很不显眼（事实就是这样）。 这里直接将人民币的纵轴画到右侧，这样从图上看人民币和其他的就差不多，甚至还特别领先！

因此如果你想要体验你是前 x 名，但是和前面的 x - 1 名差距非常大，就可以试试这个技巧。

### 2022-09-23\[好文]

webpack 项目如何配置 sourcemap， 开发环境和生成环境有什么不同？

我想仅仅映射到原文件怎么配置？我想映射到具体的行呢？ 我想映射到具体的行列信息呢？我不想把 sourcemap 和源文件一起打包，因为那样体积太大了，怎么配置？等等等等。。。

正所谓难者不会，会者不难。其实你只要知道了有几种配置，然后根据自己的情况排列组合即可。

via: <https://mp.weixin.qq.com/s/0Sq9Z0i9Q3N0likFlZB0rQ>

### 2022-09-16\[插件]

有些网站很讨厌， 给你禁用右键(right-click)，不能把复制之类的。 这个 chrome 插件可以帮你解决这个问题。 使用方式很简单，安装好后只有点一下就行。

via: <https://chrome.google.com/webstore/detail/allow-right-click/hnafhkjheookmokbkpnfpmemlppjdgoi/related?hl=en-US>

### 2022-09-15\[网站]

又一个可以可视化 Github 用户资料的网站，包含的信息非常全，包括 star， code 和 code review 等。

![](https://p.ipic.vip/bn2ws6.jpg)

via: <https://ossinsight.io/analyze/azl397985856>

### 2022-09-14\[好文]

elab 团队的《联机游戏原理入门即入土 -- 入门篇》， 对游戏开发感兴趣的可以读一读。

via: <https://mp.weixin.qq.com/s?\\_\\_biz=MzkxNTIwMzU5OQ==\\&mid=2247495741\\&idx=1\\&sn=140145af9fd8e838a5ded3200b3bd049\\&c>

### 2022-09-13\[网站]

输入 URL，它能够帮你分析这个网站的技术栈，并提供一些分析和建议。 比如：

* 包的大小版本
* 包的风险
* 包是否过期
* 等等

via: <https://gradejs.com/w/leetcode-solution.cn>

### 2022-09-09\[仓库]

一个持续更新的 **打包 JavaScript 库的现代化指南**。

里面很多提到的大多数规则都是开源社区一致认可的最佳实践。如果你在开发为他人服务的 JavaScript 库代码， 那么可以参考下，即使你是在做公司内部项目。

> 有中文版本

via: <https://github.com/frehner/modern-guide-to-packaging-js-library>

### 2022-09-08\[好文]

上个月刚刚更新的 Chrome devtool 调试技巧 **Modern web debugging in Chrome DevTools**， 这几个功能我个人非常期待，或许会大大提高我的调试效率。

除此之外还有一些其他的实验功能也很不错，推荐大家打开尝试一下。

![](https://p.ipic.vip/ymv8tw.jpg)

via: <https://developer.chrome.com/blog/devtools-modern-web-debugging/>

### 2022-09-07\[工具]

之前介绍过一个在线可视化生成 **nginx** 的网站。 而这个工具是类似的， 是一个 nginx 管理前端，通过它可以启动 nginx 服务并通过 UI 直接生成 nginx 配置。

via: <https://nginxproxymanager.com/screenshots/>

### 2022-09-06\[工具]

一个开源的 lldap， 可用于小型团队的验证服务。之前介绍过很多这种开源的给小公司团队的工具，比如堡垒机等。

via: <https://github.com/nitnelave/lldap>

### 2022-09-05\[好文]

tsc --listFiles 可以列出来 ts 处理的所有文件。基于此可以使用一个工具对这些文件进行可视化分析，类似于 webpack 的包可视化工具。本文讲解了如何使用这个工具来分析并加速 tsc 编译速度。

![](https://p.ipic.vip/wjvoe8.jpg)

via: <https://effectivetypescript.com/2022/07/30/treemap-for-source-files/>

### 2022-09-04\[工具]

又一个检测 JS 内存泄漏的网站。

你只要告诉它你网站的进入和退出方法就可以使用 cli 来检测潜在的内存泄漏点。

![](https://p.ipic.vip/p3ffar.jpg)

<https://facebookincubator.github.io/memlab/>

### 2022-09-03\[网站]

目前国内比较便宜的 CDN 服务商（一个人搞的，好像不怎么出名）。感兴趣的可以先免费体验一个月。

via: <https://www.dfyun.com.cn/>

### 2022-09-02\[好文]

git 就是一个分布式存储系统。 我之前也从零实现过简化版的 Git。

而这篇文章更为细致，并配有大量图片，如果你对 git 原理感兴趣，非常值得深入阅读。目前已经更新了三篇。

![](https://p.ipic.vip/8ayd3n.jpg)

via: <https://github.blog/2022-08-29-gits-database-internals-i-packed-object-store/>

### 2022-09-01\[类库]

immerjs 是一个对标 immutable 的状态管理辅助库，优点是使用简单，一个 api 就可以搞定。缺点的话大概就是部分场景性能略差。至于原因，可以看看我之前写的这篇文章 《immutablejs 是如何优化我们的代码的？》，地址：<https://lucifer.ren/blog/2020/06/13/immutable-js/。>

via: <https://immerjs.github.io>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2022-08

![](https://p.ipic.vip/jz9ms7.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2022-08

### 2022-08-31\[视频]

web3 的零基础科普视频。

via: <https://www.youtube.com/watch?v=1QKbm3Sv2Uw>

### 2022-08-30\[仓库]

这个工具可以将 Go 代码编译成 JS 代码。

via: <https://github.com/gopherjs/gopherjs>

### 2022-08-29\[好文]

pico.js, 一个只有两 2kb 的人脸识别 JS 库？

via: <https://nenadmarkus.com/p/picojs-intro/>

### 2022-08-26\[仓库]

upptime 是一个自动化检测网站可用性的仓库。你可以直接通过 Github 直接 fork 不用写一行代码，只要改改配置文件就可以生成自己的网站并监控自己想监控的任意网站。

如下是我自己生成的监控我旗下的四个网站的可用性。

via: <https://github.com/azl397985856/leetcode-pp-available>

![](https://p.ipic.vip/lzhbmf.jpg)

可以看出我的博客的访问时间是最长的，看来还是需要优化啊。

upptime 可以自动生成天，周，月，年的可用性报表，不用你做任何操作。

我在使用的过程目前还有一些小的 bug 没有解决，我还提了 issue。不过这不影响它的整体使用。

via: <https://github.com/upptime/upptime>

### 2022-08-25\[好文]

如何开发一个简单的云服务？如果云函数需要使用数据怎么办？这边文章以 cloudflare 为例讲解了如何处理这一情况，内容非常详细。

其他云服务厂商也是非常类似的， 你甚至可以使用一些工具来屏蔽云服务厂商的差异（除了价格差异，很多差异都很容易屏蔽）。

via: <https://blog.logrocket.com/creating-url-shortener-cloudflare-workers/>

### 2022-08-21\[网站]

webauthn 是 web3 的验证方式，基于公钥/私钥体系， 你可以使用它来为你的 web3 应用接入鉴权。

<https://webauthn.guide/#webauthn-api>

### 2022-08-20\[仓库]

u 是一个类似 protobuffer 的序列化和反序列化方案，特点是面向 URL 的，因此编码的字符不会有不兼容 url 的字符，比如 `?`。

via: <https://github.com/ananthakumaran/u>

### 2022-08-19\[网站]

一个基于 `web3` 的云盘，卖点是安全， 支持 10 GB 的免费存储。

via: <https://internxt.com/>

### 2022-08-18\[网站]

一个可以在线给文字加拼音的网站。

如果你想集成到你的项目或者应用里，只要下载它提供的字体即可。字体在 Github 上， 地址：<https://github.com/jeffreyxuan/toneoz-font-pinyin-kai>

via: <https://toneoz.com/ime/?fnt=1>

### 2022-08-17\[仓库]

一个可以用 vue 写命令行工具的库。 如果你在写一个需要一些复杂 UI 的命令行工具，就可以考虑使用它。当然 React 也有类似的库，感兴趣的可以自行搜索下。

via： <https://github.com/webfansplz/temir>

### 2022-08-16\[好文]

《SSL 和 SSH 和 OpenSSH，OpenSSL 有什么区别》

via: <https://www.cnblogs.com/foohack/p/4103212.html>

### 2022-08-17\[网站]

一个可以根据例子反推正则的工具，实际作用不大，更多的是参考。 就好像 copilot 的提供测试用例自动推导代码一样，参考作用更大一点。

via: <https://pemistahl.github.io/grex-js/>

### 2022-08-16\[技巧]

如果你不知道怎么为你的程序写 release note， 可以参考 prisma 的这个，可以说是很正规和常见了，可以当做模板来使用。

via: <https://github.com/prisma/prisma/releases/tag/4.2.0>

### 2022-08-12\[网站]

一个类似于 learn-anything 的工具网站，它可以提供一个关于技术岗位的 roadmap。比如前端，后端， 数据库工程师等等。

之前就有关注过这个网站， 只不过最近有一个重大更新分享给大家。

现在每一个学习项目都是可以点击的。点击后就可以看到推荐的学习资料， 有文章和视频。 我看了几个，资料还是非常高质量的。

![](https://p.ipic.vip/9hbj5y.jpg)

via: <https://roadmap.sh>

### 2022-08-16\[网站]

一个在线玩数独的网站。同时推荐一个在线玩五子棋的网站。<https://cloudpigapp.com/gobang/>

via: <https://sudoku.com/>

### 2022-08-06\[仓库]

又一个类 React 的 UI 框架，主打还是小和快。其实和 preact 主打的点是相当重叠的，但是从 million 提供的 benchmark 数据来看的话比 preact 更小更快。

不知道会不会超越 preact 甚至超越 react 呢？

via: <https://github.com/aidenybai/million>

### 2022-08-05\[仓库]

用 TS 写了一个 TS 类型系统。

一个没啥应用场景的 TS 泛型 `HypeScript`，接受一段 ts 代码，然后返回报错信息。 不过却是你学习和理解泛型很好的资料哦。

via: <https://github.com/ronami/HypeScript>

### 2022-08-04\[工具]

推荐几个前端打包相关的工具，如果你在做构建性能优化的话，或许能用上。

* 第一个是 thread-loader， 这个是第三方维护的 loader，用于开启多线程进行打包，可以说是 happypack 的后继者吧，目前在 webpack 官方网站上可以看到 thread-loader 的介绍。 <https://webpack.js.org/loaders/thread-loader/>
* 第二个是 HardSourceWebpackPlugin，它可以缓存构建的结果以便下次使用，实际使用上来看效果很明显。<https://github.com/mzgoddard/hard-source-webpack-plugin>
* 最后一个是 esbuild-loader，它是基于大名鼎鼎的 esbuild 来做的，速度相当快，并且配套设施发展地很快。同样， 这个工具的提速效果也相当明显。<https://github.com/privatenumber/esbuild-loader>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2022-06

![](https://p.ipic.vip/llyo44.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2022-06

### 2022-06-30\[资讯]

W3C 出了一个新的标准，关于`多屏窗口放置`。

如果你是多屏幕玩家，那么就很可能因为此 API 的出现而受益。不过这需要时间来让开发者进行支持，个人还是很期待它给我带来的便利的，毕竟我是多屏的深度用户。

via: <https://mp.weixin.qq.com/s/d1IQyMPU7IReD9RB-sdc8g>

### 2022-06-29\[网站]

一个在线练习 Vue 的网站。 基本上是模仿（致敬）了之前很火的**TS 类型体操**。

via: <https://cn-vuejs-challenges.netlify.app/>

### 2022-06-28\[好文]

我想很多人都看见过这个按钮，但是不知道它是做什么的吧？（甚至不知道这个功能叫啥名字）

![](https://p.ipic.vip/lxqau2.jpg)

这个功能叫 live expression， 可以监听表达式的依赖，当依赖变化的时候更新表达式结果。 有点像 vue 的 reactive。

这个文章详细讲述了这个功能的使用方法以及解决的问题。

via: <https://blog.bitsrc.io/debugging-javascript-with-live-expressions-in-chrome-devtools-9f0af008af45>

### 2022-06-22\[动画]

Little Fox 出品的《西游记》动画版， 英文配音。台词都是常见的词汇，因此可以用来学习英语。

> 我要学外语 😏

via: <https://www.bilibili.com/video/BV1MS4y1f74y?p=1>

### 2022-06-21\[仓库]

一个可以将 VSCODE 进行私有化部署并在浏览器上直接访问的工具。

![](https://p.ipic.vip/khj72n.jpg)

via: <https://github.com/coder/code-server>

### 2022-06-20\[网站]

也许是 Github 和 Gitlab 的替代品？

via: <https://sr.ht/>

### 2022-06-12\[网站]

storybook 官方出品的 showcase，展示了各个使用 storybook 构建的组件库。其中有 Gitlab，Github，windows，BBC 等网站的 UI 组件，挺有意思的。如果你需要一些不太常见的组件库（我指的是和市面上常见的后台管理 UI 库（比如 antd，element ui 等）不一样的组件库），可以去看看有没有可以直接用的。

via: <https://storybook.js.org/showcase>

### 2022-06-09\[好文]

学习一个东西的最好方式就是动手实现一遍。

但是市面上的东西值得学习的通常都是非常成熟的，意味功能已经和刚开发出来的时候发生了很大的变化，这其实已经不那么适合学习了。

最小化实现在学习新东西的时候是非常有必要的。这篇文章《用 Node.js 手写一个 DNS 服务器》就带你最小化实现了一个 dns 服务器。

via: <https://mp.weixin.qq.com/s/Gl94ISY5N4BYyYmVT9-QFQ>

### 2022-06-08\[资讯]

6 月 10 日，中国证券投资基金业协会发布《基金管理公司绩效考核与薪酬管理指引》（以下简称《指引》），落实《公开募集证券投资基金管理人监督管理办法》和《关于加快推进公募基金行业高质量发展的意见》规定，对公募基金公司的薪酬结构、薪酬支付、绩效考核、薪酬内控管理等方面提出了具体要求。

这意味着基金经理等职业的绩效一部分要拿来买自己的基金，这对基民来说是一个很大的好消息。因为基金经理不得不为了自己的利益从而更加用心。

via: <https://xueqiu.com/8152922548/222330472>

### 2022-06-07\[好文]

web3 是什么？如何开发 web3 应用，什么 Dapp，DeFi？

这两篇简单入门的文章，让我们一起来看看 web3 应用的基本流程。

* Integrating Web3 into Vue applications via: <https://blog.logrocket.com/integrate-web3-into-vue/>
* Integrating WalletConnect into Vue.js DApps via: <https://blog.logrocket.com/integrating-walletconnect-vue-js-dapps/>

### 2022-06-02\[教程]

圣彼得堡国立研究性 信息技术，机械和光学大学 (ITMO University) 的老师写的算法竞赛专题教程。

教程更新在 codeforces，主要面向的是竞赛选手。目前更新了五个章节：

1. 前缀树组
2. 线段树
3. 二分查找
4. 并查集
5. 双指针

via: <https://codeforces.com/edu/course/2>

这是目前 cf 唯一的 course，之后如果更新，会在 <https://codeforces.com/edu/courses> 列出。

### 2022-06-01\[仓库]

一个浏览器扩展程序的脚手架。

通过它可以方便地编写各个主流浏览器的扩展，目前支持 chrome，firefo 和 safari 。

文件夹按照功能进行了分类，非常直观。

![](https://p.ipic.vip/8uxww4.jpg)

via: <https://github.com/Debdut/browser-extension>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2022-05

![](https://p.ipic.vip/vmh9kg.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2022-05

### 2022-05-30\[工具]

前端写 UI 的时候可能会想找几个图片进行测试，这就需要这个图片没有防盗链。再加上我们有时候还对图片的尺寸有要求，于是就有了各种 image placeholder 服务。比如我今天介绍的这个。

用法非常简单,直接 url 上跟着长宽就行。

```
https://picsum.photos/200/300
```

如上就是一个 200 x 300 的图片。如果省略高的话，就是正方形的图片。另外还支持灰度设置，设置具体的图片等等功能。

via: <https://picsum.photos/>

### 2022-05-30\[网站]

如果你用过 PS，应该知道 PS 可以更改图片的背景。如果是纯色的就更好了。

这个工具就是一个网页版的证件照换底色。支持常见的红色底，蓝色底和白色底三种颜色的互转。

via: <https://www.bgconverter.com/>

### 2022-05-29\[网站]

一个可以帮助你制作 logo 的工具，我记得我的力扣加加的 logo 就是用它做的？

via: <https://www.designevo.com/cn/logo-maker/>

### 2022-05-28\[网站]

一个可以查询化妆品成分的网站。

via: <https://cosdna.com/chs/product.php>

### 2022-05-27\[工具]

一个可以帮你查看其他扩展程序源码的工具。不过这个源码可能是编译后的代码，因为上传到 chrome 商店的就有可能是编译后的代码。

无论如何，它能帮你查看和下载作者提交到 chrome 商店的代码。

![](https://p.ipic.vip/3lb3hp.jpg)

via: <https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin>

### 2022-05-26\[仓库]

一个基于 React 的后台管理系统的 UI。基于它，你可以快速开发同一个后台管理系统。

via: <https://github.com/adrianhajdin/project\\_syncfusion\\_dashboard>

### 2022-05-25\[好文]

一个关于部署的专栏，其中有一章比较有意思，就是根据分支不同，部署到不同的地方，能通过不同的 URL 地址访问。

比如:

* feature-preview 分支部署在 <https://feature-preview.lucifer.ren>
* feature-prod 分支部署在 <https://feature-prod.lucifer.ren>

via: <https://q.shanyue.tech/deploy/ci-preview.html>

### 2022-05-24\[仓库]

ya-webadb（yet another webadb） 是一个在 web 上操作安卓设备的工具。注意是操作安卓设备，不是调试安卓设备上的网页。

比如你可以通过它截屏，安卓 apk 应用，开关机等等操作。

via: <https://github.com/yume-chan/ya-webadb>

### 2022-05-23\[仓库]

得益于无头浏览器（headless browser），我们可以对 UI 进行自动化测试。

也因为无头浏览器，我们可以自动化检测应用可能的内存泄漏。原理也很容易，使用无头浏览器打开网页，然后使用浏览器的相关 api 检测堆内存，通过对比不同时间内存使用情况从而检查出潜在的内存泄漏。

这款工具就可以捕获浏览器的堆内存使用情况。

使用起来也非常简单：

```js
const browser = await Puppeteer.launch();
const page = await browser.newPage();

await page.goTo("https://google.com");

const heapSnapshot = await captureHeapSnapshot(await page.target());
```

via: <https://github.com/adriancooney/puppeteer-heap-snapshot>

### 2022-05-22\[好文]

原文标题：《Tree shaking 问题排查指南来啦》，这是字节团队出品的好文，应用价值比较高，如果你有类似的需求， 那么有很大的参考价值。

via: <https://mp.weixin.qq.com/s/SfZbBg0lWhvgzS023wTjYA>

### 2022-05-21\[仓库]

一个可以美化你 Github Profile 页面的资料集合。

我的 [Github Profile](https://github.com/azl397985856) 所有内容都被这个仓库收录了。

![](https://p.ipic.vip/arhkz0.jpg)

via: <https://github.com/rzashakeri/beautify-github-profile>

### 2022-05-20\[工具]

国内音乐这块网易云很受欢迎。因此有很多针对网易云的工具。

比如这款将其他平台版权的歌曲收录到网易云的，表现上就是你可以在网易云听网易没版权（灰色）的歌曲。

via: <https://github.com/nondanee/UnblockNeteaseMusic>

另外还有网友做了网易云的 sdk 供大家使用，你可以用它搭建自己的音乐客户端。

via: <https://github.com/Binaryify/NeteaseCloudMusicApi>

### 2022-05-19\[工具]

一个老照片修复的工具。

之前听过有人利用这个信息差，有偿给别人修复老照片赚翻了，不知道真假。不过信息差确实是个好东西。我们每个人都生活在信息差中。

via: <https://jpghd.com/>

### 2022-05-18\[网站]

一个云逛街网站，可以去世界各地云旅游。国内有好几个地方可以去，比如长沙，重庆，成都。

如下是我云旅游东京的效果：

![](https://p.ipic.vip/8m5zjz.jpg)

PS：似乎有点吃性能

via: <https://citywalks.live/>

### 2022-05-17\[好文]

一个没啥用的正则，功能是识别一个数字是否是质数。除了炫酷之外，应该没什么其他用了。

```js
/^1?$|^(11+?)\1+$/;
```

大概原理是使用正则的回溯机制，具体大家可以看看这篇文章。

via: <https://www.noulakaz.net/2007/03/18/a-regular-expression-to-check-for-prime-numbers/>

### 2022-05-16\[技巧]

两行命令可以审查 macos 系统 UI。

```bash
defaults write NSGlobalDomain WebKitDeveloperExtras -bool true
defaults write -g WebKitDeveloperExtras -bool YES
```

![](https://p.ipic.vip/dmobjp.jpg)

via: <https://blog.jim-nielsen.com/2022/inspecting-web-views-in-macos/>

### 2022-05-15\[仓库]

微软出品的前端基础学习资料。话说微软在技术入门资料这块发力不少啊？刚看完 Python， 前端又出来了。

via: <https://github.com/microsoft/Web-Dev-For-Beginners>

### 2022-05-14\[好文]

Web 可以读取 USB 数据？可以通过蓝牙进行数据传输？还能用 NFC?

这份资料讲解了 web （这里是 chrome 为例）如何与硬件进行交互。

via: <https://web.dev/devices/>

### 2022-05-13\[网站]

Google 开发的前端学习网站，用于谷歌技术布道(给自己打广告)以及一些学习资料。强烈建议前端开发者关注。

via: <https://web.dev/>

### 2022-05-12\[仓库]

在 JS 中 调用 Python。不仅支持 python 的语法，还支持 python 的三方库。

比如你想用 numpy 提供的功能，你就可以这样写：

```py
# data.py
import numpy as np

def make_x_and_y(n):
    x = np.random.randn(n)
    y = np.random.randn(n)
    return x, y
```

然后在 JS 中进行调用。

```html
<html>
  <head>
    <link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css" />
    <script defer src="https://pyscript.net/alpha/pyscript.js"></script>
    <py-env> - numpy - matplotlib - paths: - /data.py </py-env>
  </head>

  <body>
    <h1>Let's plot random numbers</h1>
    <div id="plot"></div>
    <py-script output="plot">
      import matplotlib.pyplot as plt from data import make_x_and_y x, y =
      make_x_and_y(n=1000) fig, ax = plt.subplots() ax.scatter(x, y) fig
    </py-script>
  </body>
</html>
```

via: <https://github.com/pyscript/pyscript>

### 2022-05-11\[好文]

如果公司有一个公共的代码需要在多个项目间使用，你的做法是什么？ 复制粘贴？npm？cdn + external？ 你可以试试 webpack5 中的 Module Federation！

via: <https://mp.weixin.qq.com/s?\\_\\_biz=Mzg2MDY5MTMxOA==\\&mid=2247485894\\&idx=1\\&sn=debfda7356d2d3098c78bd0f436c1510>

### 2022-05-10\[好文]

如何落地一个客户机器人？这个文章告诉你。

这个文章是那种实战型的，没有理论基础讲解。因此如果你有类似需求的话倒是可以读一下。或者收藏一下等到用的时候借鉴一下。如果你纯粹想知道技术原理的话，这篇文章不是很适合。

via: <https://zoo.team/article/intelligent-robot>

### 2022-05-09\[工具]

客户遇到问题了，如何远程调试？devtools-remote 这个工具帮助你。

客户只需要安装这个插件，然后你在自己的应用中进行集成即可。

其原理很简单，代码也只有短短的 200 行左右。核心原理是利用 CDP（chrome devtool protocol） 和远程通信，将本地的支持 CDP 应用的信息同步到远程。 其实就是一个调试代理。

值得注意的是这个工具仅支持 **支持 CDP 的客户端**，比如 chrome。如果客户端不支持 CDP 是不行的。

via: <https://github.com/auchenberg/devtools-remote>

### 2022-05-06\[好文]

文章标题：Using GitHub Actions to get notified when an API response (or web page) changes

如果你想监控一个网页的状态你会怎么做？比如抢购一个商品？

最简单的思路就是写一个脚本不断轮训。如果没有现成接口，也可以使用爬虫来做。

这篇文章就是类似的思路，只不过其借助了 Github Action 这个自动化工具来完成。

这个是作者使用的完整 github action yml 文件：

```yml
on:
  schedule:
    # Run every hour, on the hour. This can be customized to checking as frequently as every 5 minutes.
    - cron: "0 * * * *"

name: Check for changes

jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      # Use cURL to fetch the given URL, saving the response to `data.json`
      - name: Fetch data
        run: curl "<URL YOU WANT TO CHECK HERE>" -o data.json

      # Optionally, use `jq` to pull one or more fields from the JSON to include in the SMS message
      - name: Parse data
        id: parse_data
        run: echo '::set-output name=someField::'$(jq -r '.someField' data.json)

      # Compare the response to the previous run, using a hash of the response as the cache key
      - name: Fetch Cache
        id: cache
        uses: actions/cache@v2
        with:
          path: data.json
          key: ${{ hashFiles('data.json') }}

      # If there was not a cache hit (meaning the response changed), notify me via text message
      # See https://github.com/twilio-labs/actions-sms for setup instructions
      # You could use a different notification action here, so long as you include the `if` condition below
      - name: Notify if data has changed
        uses: twilio-labs/actions-sms@v1
        if: steps.cache.outputs.cache-hit != 'true'
        env:
          TWILIO_ACCOUNT_SID: ${{ secrets.TWILIO_ACCOUNT_SID }}
          TWILIO_API_KEY: ${{ secrets.TWILIO_API_KEY }}
          TWILIO_API_SECRET: ${{ secrets.TWILIO_API_SECRET }}
        with:
          fromPhoneNumber: ${{ secrets.from_phone }}
          toPhoneNumber: ${{ secrets.to_phone }}
          message: "There's been a change! someField is now ${{ steps.parse_data.outputs.someField }}."
```

via: <https://ben.balter.com/2021/12/15/github-actions-website-api-change-notification/>

### 2022-05-05\[好文]

我们常常听说某某网站被注入恶意 JS 脚本，造成 xxx 的严重后果。但是你听过 CSS 也可以用来攻击么？

CSS 不仅可以窃取你的访问记录，知道你访问了哪些网站，还能窃取你的密码，从而造成更严重后果。

文章讲的 CSS 攻击技巧很有趣，同时也给我们提了一个醒，大家上网的时候多多留意，做好防范。

via:

* [Can you get pwned with CSS?](https://scotthelme.co.uk/can-you-get-pwned-with-css/)
* [Retrieving your browsing history through a CAPTCHA](https://varun.ch/history)

### 2022-05-04\[技巧]

测试用例可以通过 only 和 skip 实现仅测试部分测试用例。主流测试框架都支持它们。

```js
describe.skip("skip test", () => {});
// or
it.skip("skip test", () => {});

describe.only("only test", () => {});
// or
it.only("only test", () => {});
```

具体来说，skip 可以跳过测试用例。only 可以只测试部分测试用例。

### 2022-05-03\[网站]

actual 是最近上 Github trending 的一个仓库。

它的核心理念是**本地优先，并尽可能和网络进行同步**，这和常规的网络系统是相反的。

如下图是我本地部署 actual 后的效果。

![](https://p.ipic.vip/tq4xhd.jpg)

如果你满足以下两点，那么可以考虑使用这个支持私有化部署的**个人记账理财工具**。

1. 对信息比较敏感，不想把信息存到别人的服务器或者希望自己的数据放在自己机器
2. 想增加一些特别定制化的功能

相反，如果这两点你都不是特别在意，使用目前现有的记账理财软件也是 ok 的。

via: <https://github.com/actualbudget/actual>

### 2022-05-02\[仓库]

一个后台管理系统的前端 UI。我之前的公司内部的系统就和这个长的几乎一样。如果当时直接拿过来用，岂不是省了很多时间么？

![](https://p.ipic.vip/3z90ex.jpg)

via: <https://github.com/HalseySpicy/Geeker-Admin>

### 2022-05-01\[工具]

一个可以下载咪咕音乐曲库的 cli 工具。

![](https://p.ipic.vip/o5nb67.jpg)

via: <https://github.com/zonemeen/musicn>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2022-04

![](https://p.ipic.vip/bf0p0k.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2022-04

### 2022-04-28\[工具]

import-local 是一个 NodeJS 端的工具，用于检测本地是否安装了某个包。如果你在开发一个 node 的 cli 应用，并且想要提高性能使用用户本地安装好的包，它就很适合你。

via: <https://github.com/sindresorhus/import-local>

### 2022-04-28\[好文]

rest api 中的 POST 和 PUT 有什么区别？一个用于新建资源，一个用于更新资源？不是的！

via: <https://stackoverflow.com/questions/630453/what-is-the-difference-between-post-and-put-in-http>

### 2022-04-25\[网站]

一个低代码平台，通过它可以拖拽生成自己的网站。

值得一提的是，一些框架已经开始集成它了。你可以通过 builder.io 导出代码，然后通过一些工具生成各个框架的中间代码（比如 react，vue），也可以直接生成原生 JS 代码。

via: <https://www.builder.io/>

### 2022-04-24\[工具]

> 今天是中国五一假期的调休。调休真的是一个反人类的设计。

cypress 是一个 e2e 测试工具，可以很容易地集成到各个测试框架中去，比如 jest。

via: <https://github.com/cypress-io/cypress>

### 2022-04-23\[好文]

Navidrome 是一个音乐管理系统，你可以将其部署到本地，然后通过网页播放器播放**本地音乐**。Navidrome 体验 via: <https://demo.navidrome.org/app/>

很多其他的工具使用的都是网上现成的资源，比如 1listen 就是使用的虾米，QQ 和网易云的音乐源。

![](https://p.ipic.vip/kfr1t2.jpg)

via: <https://www.navidrome.org/>

### 2022-04-22\[好文]

之前我写过 TypeScript 系列教程，其中有一篇是 [上帝视角看 TypeScript](https://segmentfault.com/a/1190000023489694)

这个文章和我的那篇很像，都是从宏观上带大家理解 TypeScript 究竟做了什么。这篇文章比我的更细致一点，推荐大家结合起来阅读。

via: <https://www.huy.rocks/everyday/04-01-2022-typescript-how-the-compiler-compiles>

### 2022-04-21\[网站]

yandex 提供了简洁的在线翻译功能。 你可以直接输入文字进行翻译，也可以上传文件整体翻译。

它还提供了 api 供开发者使用，我的 leetcode 项目的部分内容就是用它进行翻译的。不得不承认，专有名词的翻译还是不行，比如动态规划会翻译为 dynamic planning。

via: <https://translate.yandex.com/>

### 2022-04-20\[好文]

只要 5 美元就可以破解指纹解锁？Your Fingerprint Can Be Hacked For $5. Here’s How.

via: <https://blog.kraken.com/post/11905/your-fingerprint-can-be-hacked-for-5-heres-how/>

### 2022-04-19\[好文]

如果检测有没有全局变量引起的内存泄漏？这篇文章告诉你，作者提供了 js 代码，大家可以直接拿来主义。

文中有一点没有提到，其实很多全局变量是需要一定条件才会触发的。因此要想真正将其集成到项目的 CI 中，还需要一些额外的条件，那就是在程序中手动多次调用检测方法，而不是调用一次就完事了。

via: <https://mmazzarolo.com/blog/2022-02-14-find-what-javascript-variables-are-leaking-into-the-global-scope/>

### 2022-04-18\[工具]

上海疫情使得很多人买不到菜。热爱折腾的网友开源了抢菜软件。

注：如非必要，不要使用这种极端方法，这会给其他没有菜吃的人带来很多麻烦。

via:

* [ddshop](https://github.com/zc2638/ddshop)
* [dingdong-helper](https://github.com/JannsenYang/dingdong-helper)

### 2022-04-15\[技巧]

Github 的 issue 有很多不好用的地方，比如不支持 comment 自定义排序，以至于有一些插件“钻了空子”，提供了按照 reactions 进行排序的功能。

Disscussion 弥补了这块空白。 Disscussion 内置两种排序规则，分别是时间顺序和投票数。

![](https://p.ipic.vip/14e1qg.jpg)

你可以结合使用 issue 和 Disscussion 获得更好的体验。

近期 Github 还给 Disscussion 提供了问答社区才有的功能 - **选为答案**。

![](https://p.ipic.vip/etgt0t.jpg)

只需要在新建 Disscussion 的时候类别选择 Q\&A 就可以体验这个功能了。

via: <https://github.com/azl397985856/leetcode/discussions>

### 2022-04-14\[好文]

JS 的继承和传统的 class 继承（比如 Java 的）有什么区别？（How does JavaScript's prototypal inheritance differ from classical inheritance?）

via: <https://dev.to/chalarangelo/how-does-javascripts-prototypal-inheritance-differ-from-classical-inheritance-oii>

### 2022-04-13\[网站]

和昨天的推荐类似，这个网站也是移除不想要的部分的神奇网站。

只不过它不是移除图片中不想要的部分，而是分离音频中的人声和非人声。这样就可以达到**移除人声或者移除噪音的效果**。

via: <https://vocalremover.org/>

### 2022-04-12\[网站]

一个无需注册的在线网站，你可以用它来移除图片中的部分内容。

![](https://p.ipic.vip/iuy1kf.gif)

via: <https://www.magiceraser.io/>

### 2022-04-11\[网站]

一个俄罗斯的网站，据说是全世界最大的**名画博物馆**。

![](https://p.ipic.vip/azpsbw.jpg)

并且提供免费的高清下载，比如蒙娜丽莎这里可以直接下载，分辨率是 3931 \* 5178，4 M 左右的大小。

via: <https://gallerix.asia/>

### 2022-04-08\[网站]

Games104 网站提供了从零学习游戏引擎的教程，有成型的完整代码托管在开源的 Github 仓库。

![](https://p.ipic.vip/oeb82c.jpg)

有做游戏的，或者想了解游戏引擎的可以看一下。

via: <https://games104.boomingtech.com/sc/course-list/>

### 2022-04-07\[好文]

chrome 103 目前支持了 fs api。

用户可以通过 fs api 来读取文件，写入文件，删除文件，创建文件等。

比如读取文件的代码：

```js
let fileHandle;

document.querySelector(".pick-file").onclick = async () => {
  [fileHandle] = await window.showOpenFilePicker();

  const file = await fileHandle.getFile();
  const content = await file.text();

  return content;
};
```

除了 chrome 103 ，其他部分浏览器的新版本也提供了支持，具体支持情况如下图。

![](https://p.ipic.vip/2d53wj.jpg)

via: <https://css-tricks.com/getting-started-with-the-file-system-access-api/>

### 2022-04-06\[杂谈]

想去贵州看樱花\~

via: <https://fashion.sina.cn/l/ds/2022-03-07/detail-imcwipih5777616.d.html>

### 2022-04-05\[工具]

bitbucket 是一个开源的代码仓库，可以用来存放开源项目的代码。

和 Github，Gitlab 不同，bitbucket 内置了 jira 用于管理需求 ，snyk 用于管理 包安全。个人感觉 Github 和 Gitlab 在这几方面体验还没那么好。

![](https://p.ipic.vip/dk87k4.jpg)

via: <https://bitbucket.org>

### 2022-04-03\[技巧]

vscode 中会自动为 typescript 项目选择 workspace 的 node\_modules 的 typescript，但是我们可以手动选择 workspace。

方法很简单， 你只需要打开一个 workespace 下的 TypeScript 文件，然后点击右下角的 TypeScript 旁边的版本号。

![](https://p.ipic.vip/h1ilnf.jpg)

然后会让你选择版本。

![](https://p.ipic.vip/b4aj8s.jpg)

如果有多个 TypeScript ，错误使用其他版本的 TypeScript 会导致编译失败。项目中可以通过配置 vscode 的方式解决这问题。

具体地，大家可以在项目根目录的 .vscode 文件夹下新建一个 setting.json 然后进行如下配置。

```json
{
  "typescript.tsdk": "node_modules/typescript/lib/typescript.js"
}
```

更多用法参考官方文档：<https://code.visualstudio.com/docs/typescript/typescript-compiling>

### 2022-04-02\[好文]

Github 面试还会布置家庭作业？

家庭作业也通过 Github 进行。大概是给你一个仓库，然后你 fork 过去后进行编辑，完成后 pr 到原仓库进行 review。

via: <https://github.blog/2022-03-31-how-github-does-take-home-technical-interviews/>

### 2022-04-01\[网站]

CS61A（Structure and Interpretation of Computer Programs）是伯克利所有计算机系学生必须要上的第一门编程课，前半部分以 Python 为主，后半部分以 Schema 为主。网站资源很丰富，作为一个普通游客最主要的就是课件，其提供了 html 和 pdf 两种格式。课件图文丰富，这和其他同级别课程差异很大，对新手比较友好。

![](https://p.ipic.vip/dcsbso.jpg)

via: <https://cs61a.org/>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2022-03

![](https://p.ipic.vip/emlgxu.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2022-03

### 2022-03-30\[仓库]

如果你需要调用 github 的 api，那么可以使用官方提供的客户端工具 octokit。而如果你需要调用 gitlab 的 api，则可以使用 gitbeaker（仅支持 NodeJS）。

地址：

* <https://github.com/octokit/octokit.js/> （这个是 JS 客户端，其他客户端在 [Octokit 组织](https://github.com/octokit?type=source)下查看）
* <https://github.com/jdalrymple/gitbeaker>

### 2022-03-28\[网站]

一个关于辟谣的网站，内容更新慢，实用性不是特别强。大家也可关注一个微信官方的公众号，也是关于辟谣的，叫**微信辟谣助手**。里面可以告诉你最近看的文章哪些是谣言。如果你经常使用微信，这个绝对更使用。

地址：<https://www.factpaper.cn/large>

### 2022-03-27\[网站]

市面上关于前端技能 roadmap 的网站很多。这个网站实话实说内容一般，没啥两点，但是有一个创新点就是展示形式很别致。这种展示技能图谱的交互还是第一次见。

![](https://p.ipic.vip/5jcbkr.jpg)

地址：<https://andreasbm.github.io/web-skills/>

### 2022-03-26\[工具]

阿里集团开源的低代码引擎，基于它可以创建自己的低代码平台。

地址：<https://lowcode-engine.cn/>

### 2022-03-25\[工具]

node 内置的 vm 模块提供了“安全”运行 js 代码的沙箱环境。不过其本质也是有很多不安全的地方，社区的 vm2 解决了一些问题。

而这次推荐 safeify 是基于 vm2 继续封装的应用，支持更多特性并且理论更加安全。

地址：<https://github.com/Houfeng/safeify>

### 2022-03-22\[工具]

前一段时间写书的时候被标点符号，字符格式折磨地不行。

后来我使用了几个工具，一定程度上解决了我一些问题。

他们分别是：

* [pangu formater](https://github.com/vinta/pangu.js) 这个主要解决是排版，句法语法等问题
* [markdownlint](https://github.com/markdownlint/markdownlint) 它则主要是格式校验。比如一行最多多少字符，禁用裸 URL，禁用原生 HTML 标签 等等。

pangu 的话更多情况我使用 vscode 插件 [pangu-markdown-vscode](https://github.com/zhuyuanxiang/pangu-markdown-vscode)，markdownlint 则是集成到 ci 系统中。 [这个 yml 文件](https://github.com/azl397985856/leetcode/blob/master/.github/workflows/ci.yml#L26)给大家演示了如何在实际 ci 中使用 markdownlint。

### 2022-03-21\[技巧]

我的输入法是搜狗输入法，我使用这个输入法十几年了，一直都没有换。

它有很多小技巧，比如输入 sj 可以快速打出`当前系统时间`，也可以 rq 快速打出 `当前系统日期`等。今天再分享一个小技巧给大家。

那就是 U 模式 和 V 模式。

U 模式用于输入那些你读不出来的字。你有没有一些字可以写，但是就读不出来进而使用拼音输入法打不出来？这就是**拼音输入法的一个诟病**。不过使用 U 模式可以解决问题。比如犇(ben)字你不知道怎么读。就可以先输入 u，然后**依次输入偏旁部首**，这里我们依次输入牛牛牛。

![](https://p.ipic.vip/ci1nbe.jpg)

看见没？字出来了，还告诉你咋读。

另外还有一个类似的 V 模式。

V 模式用于快速打出阿拉伯数字的大写。比如 8765 的大写就是 `捌仟柒佰陆拾伍`

你只要输入 v 后再输入 8765 即可。

由于西法我是双拼选手，因此 u 其实是 **sh** 。因此 u 模式和 v 模式无法通过先输入 u 来开启。这个时候你可以使用 shift + u 和 shift + v 来开启。

* [U 模式笔画输入](https://pinyin.sogou.com/help.php?list=3)
* [V 模式](https://pinyin.sogou.com/help.php?list=3\&q=10)

### 2022-03-18\[仓库]

如果你在准备面试一家公司，那么最有效的面经一定是你想要面试的公司的最近的面经。

这个仓库就按照公司和岗位收录了国内大厂的 LeetCode 算法面试题（数据来源于社区网友分享），并且是免费的。

地址：<https://github.com/afatcoder/LeetcodeTop>

### 2022-03-17\[网站]

一个可视化数据结构与算法的网站。除了使用动画来演示数据结构与算法外，其还包含了对其进行详细讲解的 ppt 内容，是目前我见过的最好的动画数据结构与算法网站。

地址：<https://visualgo.net/en>

### 2022-03-15\[技巧]

Github 终于可以对 star 的项目进行分类了。

在 star 的旁边多了一个下拉，你可以点击下拉将其添加到合适的分类列表中。

![](https://p.ipic.vip/o2mzbm.jpg)

### 2022-03-11\[网站]

禁用 JS 也能追踪用户生成唯一指纹？简直太不要脸了 😁

地址：<https://noscriptfingerprint.com/>

### 2022-03-10\[工具]

mongodb 出品的 基于 bson （Binary JSON）序列化和反序列化的 JS 工具。

地址：<https://github.com/mongodb/js-bson>

### 2022-03-09\[好文]

软件调试是程序员的必修课，而前端使用的最多的自然是 chrome devtool 调试。这篇文章就讲了很多使用的调试方法，从简单到复杂，各个阶段的人都能获益。

这里提到的调试工具和技巧都用过，还是很常见的。另外一些针对特殊库的调试方法也很有用（前提是你需要调试到他们的时候）。

地址：<https://flaviocopes.com/debugging/>

### 2022-03-08\[好文]

如何读 ECMA 规范的好文，是我目前见过写的最好的版本。作者也是 Google 大牛，是很多开源社区的成员。这个系列可惜断更四年了，大概率也不会更新了。

地址：<https://timothygu.me/es-howto/>

### 2022-03-07\[仓库]

在 JS 中增加类型系统？这玩意难道不是 TypeScript 么？一起来看看！

地址：<https://github.com/giltayar/proposal-types-as-comments>

### 2022-03-04\[仓库]

如果你开发过 chrome 插件，会发现其实开发一个简单的插件很容易。你只需要随便找一个脚手架就行了。比如我的 [LeetCode-Cheatsheet](https://github.com/azl397985856/leetcode-cheat) 就是用的 Create React App 脚手架做的，build 后将文件夹发布到 chrome store 即可。

而如果你要开发复杂一点的插件，使用 background，定制 DevTools ，并且还要通信，那就稍微有点不方便了。

这个 cli 工具（脚手架）就是帮你做这个事情的。

地址：<https://github.com/dutiyesh/chrome-extension-cli>

### 2022-03-03\[好文]

文章对比了 Python 和 TypeScript 两种编程语言的类型系统中的**两个特性** 。

![](https://p.ipic.vip/ontk9s.jpg)

对深度理解两种编程语言的类型系统有很大的帮助。

地址：<https://medium.com/@Pilot-EPD-Blog/typescript-for-pythonistas-f90bbb297f0a>

### 2022-03-02\[网站]

作者是 iOS / macOS 的开发程序员，另外也是北航软院的一名非全硕士（在读）。曾在大学期间学习过算法知识，并参加过 3 年的 ACM 比赛。从 2021 年 03 月 30 日开始每日在 LeetCode 刷题，到 2021 年 11 月 26 日已经刷了 700+ 道题目，并且完成了 650+ 道题解。

这是他的经验总结《算法通关手册（LeetCode）》

大家可以搭配我的仓库 [leetcode 刷题秘籍](https://github.com/azl397985856/leetcode) 进行学习

地址：<https://algo.itcharge.cn>

### 2022-03-01\[好文]

微信团队写的《Web 内核微信小程序框架实践》，借鉴 PWA 的思路，将小程序底层进行了改造，不管是扩展性还是性能都得到了大幅度的提升。

里面的内容比较深奥，对于没有接触过引擎底层的东西的人来说相对难以理解。而且通篇并没有代码进行辅助理解，因此很可能造成理解偏差。因此我建议从借鉴思路的角度来读这篇文章。

另外如果你公司在搭建小程序引擎，那么就非常值得一读。

地址：<https://mp.weixin.qq.com/s/S3Fj3cbXurIlgopm6\\_cL0w>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2022-02

![](https://p.ipic.vip/2m7umy.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2022-02

### 2022-02-28\[工具]

伽马影迷插件是一个浏览器插件，安装好之后你就可以在某一个视频评分网站看到所有知名视频评分网站的评分。

如下图，当我打开豆瓣的时候，下面就显示了包括豆瓣在内的若干其他平台的评分。

![](https://p.ipic.vip/80gu22.jpg)

除了看评分，还可以找片源，甚至可以找解说视频。

地址：<https://ggt1024.com/#/productJwksExt>

### 2022-02-27\[工具]

testflight 是一个 apple 推出的工具，允许没有上架 apple store 的应用被用户安装。

如果你想做上线之前的测试，使用它会很有用。你只需要生成一个测试链接，用户点击链接就可以下载安装并使用了。

![](https://p.ipic.vip/lqc3zl.jpg)

地址：<http://testflight.apple.com>

### 2022-02-26\[工具]

在实体书中我们可以用高亮笔画重点，之后还可以**复习**。而看电子书呢？我们可以使用 readwise。 如果你是电子书的重度爱好者，那么可以试试这个软件。

地址：<https://readwise.io/>

### 2022-02-25\[技巧]

RSS 是我跟上社会节奏的一个重要工具。对于 bilibili，我们可以使用如下的地址来订阅 RSS。

<https://rsshub.app/bilibili/user/video/${userid}>

其中 userid 就是点击个人主页后的 url 中最后的那串数字。比如我的 bilibili RSS 地址就是：<https://rsshub.app/bilibili/user/video/36074883>

将其添加到 RSS 阅读器就可以”第一时间“收到更新了。

对应地，微信公众号可以使用这个工具生成 RSS 链接：<https://werss.app/>

比如我的公众号《力扣加加》的 RSS 就是 <https://cdn.werss.weapp.design/api/v1/feeds/b4cf5a3e-fbea-4cc1-b8e8-50a448c5e9bc.xml>

![](https://p.ipic.vip/bxzmuq.jpg)

### 2022-02-24\[好文]

《Zoom 会议摸鱼学》讲的是如何使用虚拟摄像头将一段视频投射到 zoom 的接收源上，从而实现其他人通过**摄像头看到的其实是一个实现录制好的视频**的效果。

你将会学到：

* 如何使用 OBS
* 如何使用虚拟摄像头
* zoom 更换背景，从而避免自己家被看到的尴尬

地址：<https://sspai.com/post/71404>

### 2022-02-23\[好文]

作者的 3-2-1 备份法则。

即主数据要有：

* 三个备份
* 两种媒介。比如磁盘一种，磁带一种
* 一个备份 offsite。就是让备份之间离得远一点，避免火灾地震等等因素导致备份全部挂掉。

我个人比较推荐的做法是使用`云同步 + nas`，如果你还有精力就可以使用磁带等其他媒介就真正做到了 `3-2-1` 法则。

### 2022-02-22\[工具]

小程序越来越火， 很多公司也逐步发力小程序。有的是开发对应平台的小程序（众多中小公司都有），有的是自建小程序引擎供租户开发和运行小程序（微信小程序，支付宝小程序，百度小程序，快手小程序等等就是例子）。

对于前者，大家可以通过跨平台开发工具，比如 tarojs 生成多种小程序代码。

对于后者，公司会组建团队开发小程序运行时，工具等。这些投入是巨大的，而 finclip 就是这样的一个工具，你可以直接部署到云服务器上，直接就拥有了自己的小程序运行时，工具等一整套小程序生态链。

> 即使你公司不打算使用 finclip 也不妨参考一下他的文档，工具以及部分原理实现。

地址：<https://www.finclip.com/>

### 2022-02-21\[好文]

一个典型的高可用系统一定有 load balance 的存在。用户的请求全部会经过 load balance 的代理转发到 service worker 集群。

如果 service worker 集群中删除或增加机器，如何保障尽可能少影响现有用户？一致性哈希是一种方法，本文详细讲述了一致性哈希算法的内容以及实际中的应用。

地址：<https://segmentfault.com/a/1190000021199728>

### 2022-02-18\[仓库]

超级迷你版的编译器实现，核心大概 **200 行左右**，代码基于 JS。即使不懂 JS 也没有关系，里面完全没有用到复杂语法特性。

麻雀虽小，五脏俱全。the-super-tiny-compiler 有完整的编译器模块，包括 parser 进行词法和语法分析，transformer 进行语法转化，generator 生成最终代码。

相信看完这 200 行左右的代码，你能对编译器做了什么事情有一个大致的认识，这对你学习更高深的内容有很大帮助（比如如何给语言添加一个新的语法）。

地址：<https://github.com/jamiebuilds/the-super-tiny-compiler>

### 2022-02-17\[类库]

`ci-info` 整理了市面上绝大多数的 ci 平台的信息。这样你可以通过 `ci-info` 获取到当前代码执行的环境。如果当前执行环境是在 ci ，那么其大概率还能获取到具体的 ci 平台信息。这在你需要在不同环境执行不同逻辑的时候很有用。

```js
var ci = require("ci-info");

if (ci.isCI) {
  console.log("The name of the CI server is:", ci.name);
} else {
  console.log("This program is not running on a CI server");
}
```

具体支持的 ci 平台列表可以在主页的 Supported CI tools 部分查到。

地址：<https://github.com/watson/ci-info>

### 2022-02-13\[仓库]

除了算法，面试另外一个大头是系统设计，这在国外尤其如此。

这个仓库从大的方向讲述了系统设计中的常见场景，比如如何设计高可用系统。这个仓库 star 非常多，从侧面反应项目质量还行，掘金官方也参与了仓库的翻译工作，大概看了下，翻译质量不错。

地址：<https://github.com/donnemartin/system-design-primer>

### 2022-02-12\[网站]

codetop 是微软员工整理的国内知名互联网公司的面试题，提供进度管理，按照频率排序，根据公司搜索等**其他网站需要会员才有的功能**。

> 不知道其他公司会不会起诉他们

地址：<https://codetop.cc/home>

### 2022-02-11\[网站]

nginx playground 是一个在线配置和运行 nginx 的网站，在这里你可以使用 curl 或者 http 实时看到配置的 nginx 的效果。和其他 playground 一样， 它可以将你的配置通过链接分享给其他人。

地址：<https://nginx-playground.wizardzines.com/>

### 2022-02-10\[网站]

这是一个在线学习和练习正则表达式（regex）的网站。

这个网站竟然提示我今天学的够多了，让我明天来？ 第一次见这样的提示，还能**根据你的错误率掌控你的学习进度**，如果你能力够强且足够细心的话应该可以一次不休息通关,必须推荐给大家。

附上我的通关截图：

![](https://p.ipic.vip/jgupt0.jpg)

地址：<https://www.executeprogram.com/courses/regexes>

### 2022-02-08\[好文]

文章标题《TypeScript Features to Avoid》，大概意思是那些 TypeScript 的特性应该避免使用。

其中第一个特性我在工作中也碰到过坑，公司甚至专门为这个定了一个 eslint 规则。其他倒没太大感觉。大家可以把这些作为一个最佳实践来做吧。

文章地址：<https://www.executeprogram.com/blog/typescript-features-to-avoid>

> 另外有一个小插曲，文章中提到的 private field ，我使用 TypeScript Playgound 测试发现 #filed 的方式表示 private field 的方式在 ts 中跑不通，各位知道哪里出问题了么？ 附上 playgound 地址：<https://www.typescriptlang.org/play?ts=4.6.0-dev.20220116#code/MYGwhgzhAECyCeBhcVoG8BQ1oAcBOAlgG5gAuAptAGYHkgAmAjAFzQSmEB2A5tALzQA5IIDcWaMAD2ndngCuwUpLwAKAJTpx2bFJmSQ5AHQhJ3FaQAWBCIZp0mAGmiXrt2gwBMa8QF9xAYjtPVlkCHn4hUQwfIA>

### 2022-02-07\[工具]

大家一定特别熟悉 **转到定义（Go To Definition）** 这个功能。不过可惜的是我们无法跳转到 css 的定义。

而 css-navigation 是一个可以支持直接跳转到 css 定义的 vscode 插件。

地址：<https://marketplace.visualstudio.com/items?itemName=pucelle.vscode-css-navigation>

### 2022-02-03\[视频]

一个非常好的关于 nx 科普的视频，尤其推荐 8:12 开始的那个分享。

地址：<https://www.youtube.com/watch?v=VKVTzVM0nVM\\&list=PLakNactNC1dG1CoyVWFppw3X8hnXRhFuy>

### 2022-02-02\[好文]

swc 作者打算使用 Go 重写 tsc，目的是为 tsc 提速，进而减少大家 CI/CD 的时间。 该项目目前正在进行中。

值得注意的是作者之前已经让 swc 支持 ts 的编译工作了，且速度比使用 ts 原生编译器快很多。后续它还会做一些其他工作，旨在全面提升前端编译速度。

如下是他的 roadmap

* ✅ Transpilation (replacing Babel)
* 🚧 Type Checking (replacing tsc)
* 🚧 Minification (replacing Terser)
* 🚧 Bundling (replacing webpack)

地址：<https://kdy1.dev/posts/2022/1/tsc-go>

### 2022-02-01\[好文]

你听说过 React Server Componnet 么？

React Server Component 是一种只运行在服务端的组件，它的主要目的是为了解决以下两个问题：

1. 如果一个组件的渲染依赖于一些请求，那么组件渲染速度会严重收到请求的时间（要知道网络 IO 速度是很慢的），让服务端渲染这些组件，并在客户端进行直接展示（就是不走 render 逻辑，直接服务端吐出一个 dom 字符串，客户端直接用就行）。
2. 如果某个组件依赖了一个很大的包（比如一些 markdown 解析包就很大），那么会导致客户端需要先加载一个很大的 js 然后运行并渲染。如果组件在服务端 render，那么客户端就不需要加载这个 JS，速度也就提升了。

总而言之，React Server Componnet 就是为了让“渲染”更快。

这个文章详细讲述了 React Server Componnet 是什么，以及其原理。

React Server Componnet 其中的序列化原理我觉得很有意思，大家如果需要做序列化可以参考一下他们的实现。

他们是根据 filename 做序列化的。由于服务端和客户端都可以拿到 filename 指定的组件内容，并且 filename 是字符串可直接序列化。核心代码：

```js
{
  // The ClientComponent element placeholder with "module reference"
  $$typeof: Symbol(react.element),
  type: {
    $$typeof: Symbol(react.module.reference),
    name: "default",
    filename: "./src/ClientComponent.client.js"
  },
  props: {
    // children passed to ClientComponent, which was <ServerComponent />.
    children: {
      // ServerComponent gets directly rendered into html tags;
      // notice that there's no reference at all to the
      // ServerComponent - we're directly rendering the `span`.
      $$typeof: Symbol(react.element),
      type: "span",
      props: {
        children: "Hello from server land"
      }
    }
  }
}

```

具体内容可以参考下原文。

地址：<https://blog.plasmic.app/posts/how-react-server-components-work/>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2022-01

![](https://p.ipic.vip/cjkump.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2022-01

### 2022-01-31\[好文]

一个制作非常精美，我个人非常喜欢的画风的网站。内容是关于 mono repo 工具的。

如果你还不知道什么是 mono repo，或者对 mono repo 管理工具感兴趣，那么请一定花一点时间看看这个文章。

我个人还是很推荐大家尝试一下 nx 的，看了下文章的对比更加加深了我的想法。

地址：<https://monorepo.tools>

### 2022-01-29\[随谈]

有人不知道 NFT 是什么。

其实我也不是很了解，但是 NFT 有一个重要作用值得大家注意。 NFT 将原本网络中很容易实现的复制功能，变得可识别。

比如用户 A 创作了一段代码，然后用户 B 可以将其复制。作为用户 C 很难知道 A 的代码是复制品还是 B 的代码是复制品。而如果 A 将代码发布到了 NFT，那么 C 就可以很容易知道 B 的代码是复制品。这也是为啥一些 NFT 作品被拍出了天价的重要原因。

### 2022-01-28\[工具]

前端经常碰到跨域安全问题。之前我的解决方式是通过本地代理（node 或 nginx 等服务）解决。

基本思路就是给请求响应头增加大概如下内容：

```
Access-Control-Allow-Origin: https://foo.example
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
Access-Control-Max-Age: 86400
```

后来我使用了更方便的工具： 浏览器扩展。刚开始的时候用的是一个专门给请求加跨域头的插件。后来发现有些头不会加上，比如 access-control-expose-headers 。

因此一个通用的给请求增加头信息的插件就有必要了。于是我选择了 `requestly`

![](https://p.ipic.vip/xidtqb.jpg)

美中不足是每个规则只能免费改**一个**头。不过好消息是你可以新建多个规则，每个规则改一个头就可以白嫖了。

地址：<https://app.requestly.io>

### 2022-01-27\[技巧]

Web 上传文件，我们可以使用 input 标签 + form 表单来做。而现在更多是使用 js + formData 实现。

参考代码：

```js
const formData = new FormData();
const file = new File([buffer], filename);
formData.append("file", file, filename);
```

这样会更加自由，我们可以控制上传的文件内容。 接下来， 浏览器会给我们添加 `multipart/form-data` 以及 `WebKitFormBoundary` 等，这样文件就可以上传了。

如果是在 Node 端，FormData 是不存在的。因此前面提到的 `multipart/form-data` 以及 `WebKitFormBoundary` 等 都需要自己来完成了。这样有点麻烦，不过大家可以使用 [form-data](https://github.com/form-data/form-data) 来完成。如果是浏览器，form-data 会使用浏览器原生的 FormData，否则会自己实现一个“几乎等价” 的 FormData。

### 2022-01-26\[类库]

Tauri 是一个让用户使用 JS 开发跨平台桌面程序的类库，核心是 Rust 写的（如今 web 基础工具很多都是 Rust 写的），是大名鼎鼎的 Electron 的竞品。

地址：<https://tauri.studio/docs/architecture>

### 2022-01-23\[工具]

fuite 是一个 cli 工具，帮助你一键检测网页是否可能有**潜在的内存泄漏**。

最简单的用法：

```bash
npx fuite https://example.com
```

地址：<https://github.com/nolanlawson/fuite>

### 2022-01-22\[仓库]

低代码已经发展了好多年了，也火了很多年。我本人也做了低代码好多年。我实在是不建议大家现在从零开始做低代码，很耗费时间，回报也不高。

目前社区有不少现成工具可以使用或者参考，比如 mometa。

地址：<https://github.com/imcuttle/mometa>

### 2022-01-21\[工具]

使用 mono repo 的其中一个挑战就是版本管理更加复杂。原先是仅控制其中一个 package 版本就 ok 了，而现在 mono 仓库有多少 package 就需要管理多少，复杂度就增大了。

于是使用高效的版本管理工具就有必要了，这次推荐两个工具给大家。

其中一个是 [changesets](https://github.com/changesets/changesets) ，这个比较推荐。还有一个是 lerna 工具集中的一个 [lerna-changelog](https://github.com/lerna/lerna-changelog)

这两个工作方式不太一样，大家可以看文档详细了解一下。另外推荐一篇文章，这个文章列举了很多 mono tool，地址：<https://turborepo.org/docs/guides/complimentary-tools>

### 2022-01-20\[好文]

feiker.js 作者故意添加无限死循环逻辑到代码中，这究竟是人性的扭曲还是道德的沦丧？欢迎收看本期的社会与法节目。

地址：

* [Dev corrupts NPM libs 'colors' and 'faker' breaking thousands of apps](https://www.bleepingcomputer.com/news/security/)dev-corrupts-npm-libs-colors-and-faker-breaking-thousands-of-apps/
* [下载量和 Vue 一样大的开源软件被作者恶意破坏，数千款应用受到牵连](https://mp.weixin.qq.com/s/TDh4BPeYTITjJIZ4KH-4Jw)
* [暴力拒绝白嫖，著名开源项目作者删库跑路，数千个应用程序无限输出乱码](https://www.jiqizhixin.com/articles/2022-01-10-2)

### 2022-01-19\[仓库]

Electron 的竞品，用来开发桌面客户端。

![](https://p.ipic.vip/vcxw34.jpg)

地址：<https://github.com/tauri-apps/tauri>

### 2022-01-18\[仓库]

一个自动生成中国山水画的仓库， 效果真的惊艳，可见作者的数学功底。 仓库就是一个 html，代码全部在 html 中。

地址：<https://github.com/LingDong-/shan-shui-inf>

### 2022-01-17\[工具]

monorepo 越来越流行，相应的工具也在不断发展。

> 如果大家还不清楚什么是 monorepo 的话，可以看下这篇文章：[Monorepo vs Polyrepo: 5 Things You Should Consider](https://blog.bitsrc.io/monorepo-vs-polyrepo-5-things-you-should-consider-897f3b588e70)

其中两个工具最近很是抢眼。这两个工具其实都算是构建工具（build tool）

![](https://p.ipic.vip/in2iiv.gif)

一个是 TurboRepo，另外一个是 nx。其中 TurboRepo 借鉴了 nx 了一些内容。二者其实各有优劣。这里有一个对于二者的比较文章 [Nx and Turborepo](https://nx.dev/guides/turbo-and-nx) ，这篇文章是 nx 官方写的。

另外推荐一篇侧重讲 TurboRepo 的文章，[Why TurboRepo Will Be The First Big Trend of 2022](https://dev.to/swyx/why-turborepo-will-be-the-first-big-trend-of-2022-4gfj)

### 2022-01-14\[好文]

作者用 [qwik](https://github.com/builderio/qwik) 对自己的网站进行了优化，减少了 99% 的 JS。优化后使用 PageSpeed Insights 测试为 100 分，并且是移动端和 PC 端全 100 。

地址：<https://www.builder.io/blog/how-we-cut-99-percent-js-with-qwik-and-partytown>

### 2022-01-13\[技巧]

CSS 出了一个新的媒体查询特性 prefers-color-scheme，它可用于检测用户是否有将系统的主题色设置为亮色或者暗色。

代码示例：

```css
@media (prefers-color-scheme: dark) {
  .day.dark-scheme {
    background: #333;
    color: white;
  }
  .night.dark-scheme {
    background: black;
    color: #ddd;
  }
}

@media (prefers-color-scheme: light) {
  .day.light-scheme {
    background: white;
    color: #555;
  }
  .night.light-scheme {
    background: #eee;
    color: black;
  }
}
```

如上:

* `prefers-color-scheme: dark` 内的样式代码会在用户的浏览器是暗黑主题下启用
* `prefers-color-scheme: light` 内的样式代码会在用户的浏览器是浅色主题下启用

基于此，我们可以给网站定制不同的主题样式以适配用户电脑上的主题设置（目前就是暗黑和浅色两种）。

### 2022-01-12\[技巧]

yarn 支持一个特性叫做 resolutions。它主要解决了用户不能指定依赖的依赖（嵌套依赖）的版本问题。

比如你依赖了 react，而 react 依赖了一个包 A，这个包有安全问题，但是 react 迟迟不更新，你就可以通过 resolutions 来强行升级 A （前提是升级满足 package 中的兼容性定义）

yarn 官方给的一个使用例子：

```json
{
  "name": "project",
  "version": "1.0.0",
  "dependencies": {
    "left-pad": "1.0.0",
    "c": "file:../c-1",
    "d2": "file:../d2-1"
  },
  "resolutions": {
    "d2/left-pad": "1.1.1",
    "c/**/left-pad": "^1.1.2"
  }
}
```

我们通过 resolutions 指定了 d2 的依赖 left-pad 升级到 1.1.1。

更多内容参考：<https://github.com/yarnpkg/rfcs/blob/master/implemented/0000-selective-versions-resolutions.md>

### 2022-01-11\[工具]

vm 是 node 原生提供的一个模块， 提供了一个沙箱环境。

 比如你想造一个测试框架的轮子，那么测试用例间的隔离如何做？比如一个测试用例修改了 Array.prototype.map，那么会不会因此影响其他测试用例呢？ 使用 vm 就可以解决这个问题。

参考代码：

```js
// replace this code in worker.js:
const context = { describe, it, expect, mock };
vm.createContext(context);

// with this:
const NodeEnvironment = require("jest-environment-node");
const environment = new NodeEnvironment({
  testEnvironmentOptions: { describe, it, expect, mock },
});
vm.runInContext(code, environment.getVmContext());
```

 如上代码的 jest-environment-node 是用来模拟 node 端的环境的（而不是浏览器），我们可以使用 testEnvironmentOptions 来定制一些全局变量。

### 2022-01-10\[技巧]

import map 是 ESM 中的一个特性，允许你自定义引入模块的解析逻辑。

如果不使用 import maps，直接在浏览器上执行类似下面这种绝对路径就会有问题：

```js
import moment from "moment";
import { partition } from "lodash";
```

我们可以使用 import maps 解决这个问题：

```html
<script type="importmap">
  {
    "imports": {
      "moment": "/node_modules/moment/src/moment.js",
      "lodash": "/node_modules/lodash-es/lodash.js"
    }
  }
</script>
```

这样 moment 和 lodash 就会从网站根路径的 node\_modules 查找模块了。

这些特性浏览器支持还不理想，如果需要使用的话可以考虑 [es-module-shims](https://github.com/guybedford/es-module-shims)

### 2022-01-07\[工具]

vue 的可视化模板编译工具 Template Explorer

如果你只是想看下 template 会被编译为怎么样的 ast 以及 render function，那么可以使用这个工具来帮你。

这个工具的源码在 Github 的 vue 仓库中，地址：<https://github.com/vuejs/vue-next/tree/master/packages/template-explorer> 如果你需要 debug 的话可以在仓库中启动运行，如果只是看下结果，使用在线版足够了。

地址：<https://vue-next-template-explorer.netlify.com/>

### 2022-01-06\[工具]

clinic.js 是一个诊断工具，可以帮助你发现潜在的性能和安全问题。

![](https://p.ipic.vip/keo2t6.jpg)

如上图， clinic 可以诊断包括 CPI，内存，事件循环延迟（卡顿）以及 handlers。

它还可以直接帮你定位到具体的可能存在的问题点。如下图：

![](https://p.ipic.vip/gq273v.jpg)

clinic.js 就诊断到了代码可能存在 IO 方面的问题。

地址：<https://clinicjs.org/>

### 2022-01-05\[工具]

类似于 apache 的 abtest， wrk 也是一个 http 压测工具，二者功能和用法都是类似的。你可以用它来测试你的代码能否满足业务要求的并发量。

地址：<https://github.com/wg/wrk>

### 2022-01-04\[技巧]

两个问题看你有没有高并发经验。

1. 如何避免项目的错误日志扎堆上报，导致服务器瞬间压力过大？
2. 如何保证后端突然接受大量请求而不至于挂？

其实这两个问题是一个是客户端问题，一个是服务端问题，还是很有代表性的。

答案其实不唯一， 我这里简单分享个**随机丢弃**思路。

1. 可以采取随机数舍弃的方法，比如随机舍弃 50% 的请求。
2. 可以采取随机数舍弃的方法，比如在 cpu 大于 80% 的时候，随机舍弃 50% 的请求。专业一点这个叫熔断。

当然除了这个思路还可以采用异步上报，引入队列等众多方法， 这里就不多做介绍。这个随机丢弃的方式简单粗暴且有效，但是对于重要的业务，比如支付还是谨慎使用。

### 2022-01-03\[工具]

如果你需要做增量更新的功能，可以考虑使用这个工具集。

其中 bsdiff 用来 diff 两个二进制包 bspatch 用来将 diff 信息 patch 过去。

参考代码：

```js
var assert = require("assert"),
  bsdiff = require("bsdiff"),
  crypto = require("crypto");

// cur 是当前的二进制包
// ref 是需要更新到的二进制包
var cur = crypto.randomBytes(1024),
  ref = crypto.randomBytes(1024);

bsdiff.diff(cur, ref, function (err, ctrl, diff, xtra) {
  if (err) throw err;
  bsdiff.patch(cur.length, ref, ctrl, diff, xtra, function (err, out) {
    if (err) throw err;
    // 将 out 信息更新到当前的二进制包 cur 上
    for (var i = 0; i < cur.length; i++) {
      if (cur[i] !== out[i]) throw "Patch did not work";
    }
    console.log("Patch worked!");
  });
});
```

地址：<https://github.com/mikepb/node-bsdiff>

### 2022-01-02\[技巧]

adb 全称 Android Debug Bridge，是安卓上的调试工具。我们可以用它做一些自动化的事情。

比如我们可以用 adb 自动录制屏幕，并获取录制的详细数据信息。

代码参考：

```bash
adb shell screenrecord --time-limit 5 --verbose /path/to/save/a.mp4
```

这比手工录制效率高很多。

小技巧：

我们可以利用上面录制的视频测量应用的首屏时间。比如我们可以使用一些工具将上面的视频帧逐个提取出来，然后利用图像识别工具反向逐个检测相邻两个图片的相似度，找出最后一张发生相似度明显变化的图片。这样首屏时间可以记为`最后一张发生相似度明显变化的图片的时间 t1 - 页面开始加载的时间 t2`

### 2022-01-01\[工具]

如果你有离线化的需求，那么可以试试这个 webpack 插件。它可以帮助你预渲染出静态 html， 使得用户在离线或者弱网情况下直接打开页面，提高用户体验。

基础用法：

```js
const path = require("path");
const PrerenderSPAPlugin = require("prerender-spa-plugin");

module.exports = {
  plugins: [
    ...new PrerenderSPAPlugin({
      // Required - The path to the webpack-outputted app to prerender.
      staticDir: path.join(__dirname, "dist"),
      // Required - Routes to render.
      routes: ["/", "/about", "/some/deep/nested/route"],
    }),
  ],
};
```

如上图，你告诉插件你的打包资源位置以及你需要离线化的几个路由，插件就会自动帮你生成离线化资源。更多用法参考仓库文档。

地址：<https://github.com/chrisvfritz/prerender-spa-plugin>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2021-12

![](https://p.ipic.vip/73g74n.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2021-12

### 2021-12-31\[技巧]

今天是我的生日，祝我生日快乐！🎂🎂🎂 我们明年见\~

随着 Webpack 逐步发展，其性能越来越强，用户接入成本也越来越低。但是我们仍然会有自定义打包配置的时候， 而 webpack 的配置实在是多，并且配置的格式以及可选项也很复杂。大多数我们只能通过查官方文档的方式来解决。

今天介绍一个小技巧，使用 vscode 的 ts 只能提示来提示你配置该怎么去写。众所周知，webpack 的配置文件一个 js 文件并且运行在 node 环境。那如何用 ts 实现智能提示呢？我们可以引入 webpack 对外暴露的 Configuration 对象，并使用 JS 注释告诉 vscode 我们的 config 是 Configuration 类型即可。

代码演示:

```js
// webpack.config.js
import { Configuration } from "webpack";

/**
 * @type {Configuration}
 */

const config = {
  entry: "./src/main.js",
  mode: "development",
  output: {
    filename: "bundle.js",
  },
};

module.exports = config;
```

我刚刚说了 webpack.config.js 是运行在 node 的，因此 node 低版本 import 是无法直接运行的，会报错。这个时候大家需要注释掉 import 代码，等到需要智能提示再加上即可。

## 2021-12-30\[工具]

ts-node 是一个可以直接执行 TypeScript 代码的工具。

它的原理很简单，就是先调用 tsc 生成 js，然后再执行生成后的 js 文件。对于开发者而言就是简化了一部操作。

地址：<https://github.com/TypeStrong/ts-node>

### 2021-12-28\[工具]

npm 和 yarn 的早期版本在处理依赖的时候，会将依赖安装 hoist 到顶层的 node\_modules。这意味着：源码可以访问 本不属于当前项目所设定的依赖包。

并且多个项目的依赖是不共享的。这意味着：当使用 npm 或 Yarn 时，如果你有 100 个项目，并且所有项目都有一个相同的依赖包，那么， 你在硬盘上就需要保存 100 份该相同依赖包的副本。

pnpm 很好地解决了这些问题。当你使用 Monorepo 管理代码的时候，这种优点会被放大。

地址：<https://github.com/pnpm/pnpm>

### 2021-12-27\[仓库]

Rust 在前端的基建发挥越来越重要的作用，很多新的流行构建工具都是 rust 写的，比如 [swc](https://github.com/swc-project/swc)。也有一些插件被 rust 重写用于提高性能，比如 [postcss-rs](https://github.com/postcss-rs/postcss-rs)。

这个仓库集合了这些前端使用的 Rust 项目以及前端领域的 rust 先导者。其实这个仓库就类似于 awesome-xxxx

地址：<https://github.com/i5ting/rust-fe>

### 2021-12-24\[好文]

cookie、session、token、jwt 傻傻分不清楚？这篇文章给你解惑。

地址：<https://zhuanlan.zhihu.com/p/446379414>

### 2021-12-20\[技巧]

相信大家都有过 copy 对象的经验，包括浅拷贝和深拷贝。

深拷贝一般都是使用 JSON.stringify, MessageChannel 或者 一些第三方库，比如 lodash。 而浏览器 HTML 规范增加了一个新的 api structuredClone，可以在浏览器层面上深拷贝对象，和内置的 JSON.stringify 不同的是，它支持的数据格式更多。

值得注意的是，structuredClone 目前浏览器的兼容性比较差，chrome 最新版也是不支持的，主流的差不多就 firefox 支持。

地址：<https://developer.mozilla.org/en-US/docs/Web/API/structuredClone>

### 2021-12-19\[工具]

如果你使用 jest 不做任何配置并使用 import 语句的话，很可能会得到一个报错。

不仅仅是 jest，其实大多数的 node 工具都不认识 import。 对于 jest 来说，我们可以使用 babel-jest，并配置一下 babel 环境为 node 即可。

babel jest 之前是一个独立的仓库，现在已经迁移到了 jest 的 mono repo 中，由 jest 项目统一维护了。

地址:<https://github.com/facebook/jest/tree/main/packages/babel-jest>

## 2021-12-17\[网站]

Github 年度统计，以下是我的 Github 年度统计，大家可以用下面的网站自己生成自己的 Github 年度统计。

> 统计数据不包括私有仓库，但包括你的所有个人账户和组织（比如下图的 leetcode-pp 就是组织）下的数据

![](https://p.ipic.vip/fgsa3z.jpg)

地址： <https://wrapped.run/>

### 2021-12-14\[好文]

jest 是一个非常流行的前端框架。jest 是如何 mock 模块的呢？ 官方文档给了详细的文档，比如 jest.mock('axios') 就可以 mock axios，然后:

```ts
const resp = { data: users };
axios.get.mockResolvedValue(resp);
```

就可以 mocj axios 的 get 方法。

具体参考：<https://jestjs.io/docs/mock-functions>

那么对于全局变量，比如 WebSocket，fetch 等，如果进行 mock 呢？

这篇文章从基础 mock 到 jest.spyOn 一步步教你如果 mock 全局变量。

文章地址：<https://benjaminjohnson.me/mocking-fetch>

### 2021-12-10\[工具]

firefox relay 是 firefox 官方出品的邮箱转发工具。

它可以帮助你解决很多问题。比如有一个网站每个邮箱可以免费试用一个月，那么到期后你可以选择换一个邮箱。但是毕竟注册不同邮箱毕竟麻烦，甚至有些网站对注册进行了各种各样的限制。这个时候 firefox relay 就派上用场了。

另外你不想泄漏你的邮箱信息，打算糊弄一下注册过去先试试也可以使用 firefox relay。

地址：<https://relay.firefox.com/>

### 2021-12-09\[工具]

该工具可以直接将 html 转化为 markdown(简称 md)，如果你想要 md 源码可以尝试使用它。

对于我来说，就可以将 html 转化为 md，然后再通过工具讲 md 转化为符合我风格的 html。关于如何将 md 转化为格式良好的 html， 可以使用我的工具 [Markdiwn Reader](https://leetcode-solution.cn/github)

原理是根据语义化标签来做的，比如 h1 标签就转义为 markdown 的 `#`。

地址：<https://devtool.tech/html-md>

### 2021-12-05\[技巧]

很多人把 @ts-expect-error 当然是 ignore 来用。比如我有一个 ts error，就加一个 @ts-expect-error 注解。

这是不对的，@ts-expect-error 不是这么用的。 @ts-expect-error 的其中一个用法是做类型单元测试。

代码演示：

```ts
it("number can't assign to string", () => {
  let a: string = "xx";
  // @ts-expect-error
  a = 3;
});
```

在这里 @ts-expect-error 被当做断言来使用了。

### 2021-12-04\[技巧]

sourcemap 可以帮助我们定位打包之前的代码。

如果不使用 sourcemap，比如我们的代码报错，则只能看到编译打包之后的，很难定位到源代码。这个时候 sourcemap 就有用了。

我个人使用 sourcemap 是在开发的时候使用 cheap-module-eval-source-map， 而在发布上线的时候使用 nosource-source-map。

代码参考：

```js
// webpack.config.js

module.exports = (env, args) => {
  // common config  正式使用的话更多的是 webpack.common.js
  const config = {
    // ...
  };

  // 正式使用的话更多的是  webpack.development.js
  if (env === "development") {
    config.mode = "development";
    config.devtool = "cheap-module-eval-source-map";
  } else {
    // 正式使用的话更多的是  webpack.production.js
    config.mode = "production";
    config.devtool = "nosource-source-map";
  }

  return config;
};
```

这里的 cheap 指的是只能定位到行，不能定位到列，对大多数人来说到行就够了，这样本地开发打包编译也快一点。module 指的是定位到源代码，而不是经过 loader 等处理后的代码。eval 指的是代码会包裹在 eval 函数执行。nosource 指的是仅显示出错的源代码位置，而无法定位到源代码，这对我们的生产环境起到了保护作用，避免被其他人拿到前端完整的源代码。

### 2021-12-04\[技巧]

TypeScript 中如何判断一个类型是否是 any 呢？

我们可以自定义一个泛型来实现。

由于**只有** any 和 1 交叉后的类型为 0 的父类型，因此可以这样写。

```ts
type isAny<T> = 0 extends 1 & T ? true : false;

type A = isAny<any>; // true   any 和 1 的交叉类型为 any
type B = isAny<number>; // false number 和 1 的交叉类型为 1
type C = isAny<3>; // false  3 和 1 的交叉类型为 never
```

当然你可以使用其他数字，甚至使用其他类型代替，思路是一样的。

### 2021-12-03\[技巧]

浏览器加载资源是有优先级的，他们分别是 high，medium 和 low。浏览器默认会给资源一个优先级，优先级高的会优先加载，相同优先级的按照出现顺序依次加载。

chrome 中 你可以给资源手动地指定优先级。如果浏览器目前还不支持，可以在 Experimental Web Platform Features 中 打开。

```
<!-- We don't want a high priority for this above-the-fold image -->
<img src="/images/in_viewport_but_not_important.svg" importance="low" alt="I'm an unimportant image!">

<!-- We want to initiate an early fetch for a resource, but also deprioritize it -->
<link rel="preload" href="/js/script.js" as="script" importance="low">

<script>
  fetch('https://example.com/', {importance: 'low'}).then(data => {
    // Trigger a low priority fetch
  });
</script>

<!-- The third-party contents of this iframe can load with a low priority -->
<iframe src="https://example.com" width="600" height="400" importance="low"></iframe>
```

如上，我们可以指定图片，js，uframe，甚至是 fetch 请求的优先级。这有时候在提高 LCP 等性能数据的时候很有用。

### 2021-12-02\[工具]

相信大家都或多或少有被无良商家贩卖信息的经历。这些数据大多就是访问网站的时候被窃取的。我们可以不暴露这些隐私吗？

答案是很难。不过我们可以通过一些手段，比如限制浏览器的某些获取信息的 api 而减少一些信息泄漏， JavaScript Restrictor 就是这样的工具。

友情提示：很多网站如果使用了这个工具可能就直接无法访问了。大家可以设置白名单或者给不同网站设置不同限制级别来完成。

我使用的是 chrome，因此点击这里就可以下载插件了。如果你是其他浏览器，那么就点击对应链接即可。

![](https://p.ipic.vip/ff2ezc.jpg)

地址：<https://polcak.github.io/jsrestrictor/>

### 2021-12-01\[好文]

如何制作一个 CPU？

这个标题是不是很吸引人？当我点进去的时候，我迅速翻了一下文章。第一张图片和最后一张图片的对比逗笑了我。

第一步，取一块石头：

![](https://p.ipic.vip/31fvxm.jpg)

最后一步（第 19 步），CPU 做好了。

![](https://p.ipic.vip/vtz31q.jpg)

地址：<https://blog.robertelder.org/how-to-make-a-cpu/>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2021-10

![](https://p.ipic.vip/q822bn.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2021-10

### 2021-10-29\[技巧]

chrome 的 `IdleDetector` 可以允许你检测用户是否**AFK**（Away from keyboard），即双手离开键盘一段时间。

和 requestIdleCallback 不同， 它是检测用户是否空闲，即是否有交互动作，比如鼠标，键盘等。而 requestIdleCallback 是检测浏览器本身是否空闲。

你可以用它做一些事情，比如官方提到的：

* 聊天应用看对方是否在线
* 用户不在的话减少一些大型计算

我之前在看斗鱼直播或者 youtube 视频也会有类型的检测，当你长时间离开的话，它会暂停并提示你是否继续。我觉得这个可以显著地减少用户忘记关闭窗口带来的带宽消耗，不要小看它。这或许可以为你的公司节省很大一笔钱。

更多关于这个 api 的使用请参考：<https://web.dev/idle-detection/>

### 2021-10-28\[技巧]

chrome 95 出了一个新的 api `EyeDropper` 蛮有意思的。 据说这个功能是微软大佬贡献的。

使用后会出来一个采集颜色的光标，当你确定后会在用户选择的颜色的 rgb 值返回你。

代码：

```js
const eyeDropper = new EyeDropper();
const result = await eyeDropper.open();
// result = {sRGBHex: '#160731'}
```

大家可以直接在 chrome 95 以上的浏览器上在 devtool 的 console 中输入上面的代码查看效果。

更多 chrome 95 新特性：<https://developer.chrome.com/blog/new-in-chrome-95/>

### 2021-10-27\[好文]

chrome 扩展想必大家都用过么？ 那你有想过开发一款 chrome 扩展么？

西法就开发了一款 chrome 扩展：《leetcode-cheatsheet》<https://leetcode-solution.cn/download>

chrome 扩展开发最最头疼的就是各种通信，比如 content-script 和 backgound 通信， background 如何和 popup 通信等等。这篇文章对这些常见的扩展开发问题进行了讲述，并有大量的代码和图片，使得内容通俗易懂。

比如如果在 devtool 新建一个 panel？怎么在 devtool 的 elements 面板新建一个侧边栏。

代码演示:

```js
// 创建自定义面板，同一个插件可以创建多个自定义面板
// 几个参数依次为：panel标题、图标（其实设置了也没地方显示）、要加载的页面、加载成功后的回调
chrome.devtools.panels.create(
  "MyPanel",
  "img/icon.png",
  "mypanel.html",
  function (panel) {
    console.log("自定义面板创建成功！"); // 注意这个log一般看不到
  }
);

// 创建自定义侧边栏
chrome.devtools.panels.elements.createSidebarPane("Images", function (sidebar) {
  // sidebar.setPage('../sidebar.html'); // 指定加载某个页面
  sidebar.setExpression('document.querySelectorAll("img")', "All Images"); // 通过表达式来指定
  //sidebar.setObject({aaa: 111, bbb: 'Hello World!'}); // 直接设置显示某个对象
});
```

图片演示：

![](https://p.ipic.vip/sse11l.jpg)

![](https://p.ipic.vip/nkswpa.jpg)

文章很长，有几万字，大家可以根据自己的需要挑重点看。

地址：<https://www.cnblogs.com/liuxianan/p/chrome-plugin-develop.html>

### 2021-10-26\[好文]

OAuth 是什么？你如果还不知道就太 out 了。我的《91 天学算法》官方网站就用了 OAuth 来链接 Github 登录，地址：<https://leetcode-solution.cn/91>

本文以 Github 为例，讲解如果从零接入 OAuth2，适合新手。

地址：<https://www.honeybadger.io/blog/oauth-nodejs-javascript/>

### 2021-10-25\[工具]

一个语法检查的工具，注意这里的语法是自然语言的语法，不是编程语言的语法，这同时也是该工具独特的地方。

地址：<https://caderek.github.io/gramma/>

### 2021-10-19\[工具]

上家公司一直想做一个前端工具链，其中一环就是在编辑器（我们是 vscode）中集成工作流。比如在编辑器中新建工程，提交代码，发布代码， code review ， 代码检查等等。

只不过这个还是需要很多时间投入的，截止到我离职也没有做的很完善。而这个开源产品做的已经相当完善了。如果你的公司有类似的需求，不妨直接尝试使用，或者 fork 一份修改，能够省去不少时间。

这个工具是直接集成到 vscode 中的，无需切换到其他窗口，对于程序来说方便许多。

![](https://p.ipic.vip/nm15vr.jpg)

地址：<https://github.com/apptools-lab/AppWorks>

### 2021-10-18\[好文]

最近在开发小程序的调试工具，类似微信的调试工具。参考了几篇文章，如果你也在做类似的事情，不妨参考下这几篇文章。

* [深入理解 Chrome DevTools](https://zhaomenghuan.js.org/blog/chrome-devtools.html#chrome-devtools-protocol)
* [devtools](http://quickapp.vivo.com.cn/tag/devtools/)

不过说实话这几篇文章的思路很值得借鉴，但是缺乏细节，并且部分细节由于版本原因已经缺乏参考性了（新版本 devtool api 发生了些变化），大家在阅读的时候注意一下。

### 2021-10-15\[资讯]

Github 中的 markdown 语法支持脚注（Footnotes）了。

你可以使用如下语法

```
Here is a simple footnote[^1].

[^1]: My reference.
```

这样就可以渲染出如下带有脚注的内容：

![](https://p.ipic.vip/u5evhq.jpg)

类似地，之前其他平台有类似如下的渲染脚注的语法，它通过扩展 markdown 链接语法的形式实现了脚注。

```
Here is a simple [footnote](http://xxx.com "My reference")
```

不过限制也很明显，那就是必须是链接才能生成脚注，Github 的这种脚注语法就很好地解决了这个问题。

更多关于 Github markdown 的语法可以参考这篇文章：<https://docs.github.com/en/github/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax>

### 2021-10-13\[工具]

Graphql 是 facebook 开源的一门查询语言（query language）。

如今在国内的普及程度还远远不够，主要原因就是上手难度高以及国内社区和大公司输出不够（很多大公司其实都在用）。它不仅仅是前端的一个 client，还需要后端 server 的配合。

而如果运用得到，甚至可以用来“替代” service worker，redux 等工具。另一方面和 ts 配合，可以大大完善后端接口类型，这个我在 9 月份的每日一荐推荐过相关的工具。今天推荐的是 Graphql 在社区非常有名的一个框架，它的估值也在随着它的流行越来越高。

地址：<https://www.apollographql.com/docs>

### 2021-10-12\[工具]

ES Module Lexer 是一个针对 ESM 的词法分析器，使用它可以对 ESM 文本进行分析，vite 中就使用了它分析文件依赖。由于使用了 wasm（默认情况下）， 它的速度很快。

地址：<https://github.com/guybedford/es-module-lexer>

### 2021-10-11\[好文]

vue 中可以用 v-html 直接动态注入 html，类似地，React 则可以通过 dangerouslySetInnerHTML 设置 html。

但是如果不加以处理，很可能会遭遇 xss 攻击。 一种简单的方法就是 html entity 转义。社区也有类似的解决方案，比如 DomPurify。而这次官方标准出来了，它就是 Sanitizer API。这篇文章就详细讲述了 sanitizer 是什么，有什么用，兼容性如何，demo 程序，如何开启等等一系列问题。

地址：<https://web.dev/sanitizer/>

### 2021-10-10\[组件库]

Webview UI Toolkit for Visual Studio Code 是一个针对 vscode 开发的组件库，由微软官方开发。

相比于其他组件库，它有如下特点：

1. 针对 vscode 定制，不仅 UI 更加一致，并且还能根据 vscode 主题变换样式
2. 使用 web components，因此理论上可以应用于任何前端框架
3. 注重可访问性。这点是国内的很多组件库都不注重的，但是这点却很重要，不仅仅是针对障碍人士，对待一些正常人这也是必要的。比如我习惯使用 ESC 来关闭弹窗，但是很多网站却关不掉，这让我想起了垃圾广告横行的年代。
4. 官方出品，必数精品。

地址：<https://microsoft.github.io/vscode-webview-ui-toolkit/>

### 2021-10-09\[网站]

很多人会问这样的问题：**xx 语言的 yy 特性在 zz 语言中怎么写啊？** 比如 Python 语言的 reverse 在 C++ 中怎么实现？

我其实刚刚在用新语言的时候脑子也潜意识的有这种疑问，今天介绍的网站就整理了**很多常见操作的不同语言对比实现**

仍然以 C++ 的 reverse 为例:

![](https://p.ipic.vip/w3ryuq.jpg)

你可以点击上面的编程语言查看其他语言的 reverse 是如何实现的，目前该网站已经提供了 277 个语言特性，这个工具网站对那些刚开始学习新语言的人非常有用。

我们甚至可以直接开启对比模式，以 Python 和 C++ 对比为例：

![](https://p.ipic.vip/h8ntg5.jpg)

地址：<https://programming-idioms.org/idiom/19/reverse-a-list>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2021-09

![](https://p.ipic.vip/8vq2ak.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2021-09

### 2021-09-30\[工具]

GraphQL Code Generator 是一个 GraphQl 生态的一个很有名的代码生成工具。基本上有一些 GraphQL 工程经验的人都知道它。

 简单来说你可以将它看成是一个黑盒：

* 输入是 graphql 的 schema（查询语句以及类型定义等），yml （配置文件）和 operation（操作，这个是可选的）。
* 输出是代码文件

 比如你在 yml 中配置了 ts 插件，那么输出就是一个 ts 文件。其整体是插件化的，因此功能也会随着插件的完善而变得多样。比如实际工程中你可以在启动项目的时候生成 ts 代码，帮助你在获得更好的 ts 智能提示。

地址：<https://www.graphql-code-generator.com/>

### 2021-09-29\[好文]

copilot 是一个基于 AI 的编程辅助工具。目前已经集成在了 vscode 中，后续可能集成到更多平台和工具，目前还是测试阶段。

地址：<https://mp.weixin.qq.com/s?\\_\\_biz=MzA3MjU5NjU2NA==\\&mid=2455508654\\&idx=1\\&sn=8f5e4c94a10d683cc4e2d15193c620c7>

### 2021-09-28\[好文]

阿里巴巴淘系的 graphql 解决方案，他们是如何在工具集成 graphql 的？遇到了哪些问题？又是如何解决的？

另外很有意思的点是，他们利用 cdn 的分布式能力，将 graphql 缓存写入 cdn 从而有效降低了 QPS。

地址：<https://mp.weixin.qq.com/s/ZO1Vpslk3-17YxUVt9Vhrw>

### 2021-09-21\[工具]

apollographql 是很有名的 graphql 工具。它提供了服务端和客户端全套解决方案。

当然这不意味着你必须使用一个客户端框架才可以用，你完全可以使用原生的 http 去集成 graphql。不过客户端框架可以帮助我们解决很多问题，比如缓存策略，样板代码等等。比如 apollo 就集成了 React Hooks，使得你可在 React 应用中非常舒适地使用 graphql。

地址：<https://www.apollographql.com/docs/react/data/queries/>

### 2021-09-18\[好文]

ESM 可以借助浏览器的模块化能力从而实现”无打包“，这样前端也不需要安装 node\_modules，而仅仅是 import cdn 上的文件即可了。借助包的分发服务，甚至能将本地安装依赖的速度提升 10 倍。

不过现有的许多 npm 包是 cjs 的，那么将 CJS 转化为 ESM 如何进行？有哪些坑？这篇文章告诉你。

地址：<https://mp.weixin.qq.com/s?\\_\\_biz=MzA3MjU5NjU2NA==\\&mid=2455508622\\&idx=1\\&sn=10f0d16a4becb945e849e49d3af478f3>

### 2021-09-17\[工具]

这个工具可以让你将一个网页版的 vscode 部署在你的云端服务。

你可以将其部署到一些免费的平台，比如 heroku 的 free plan。这样你就可以拥有一个自己独有的云端 vscode 了。

![](https://p.ipic.vip/atufq5.jpg)

地址：<https://github.com/cdr/deploy-code-server>

### 2021-09-16\[工具]

MDVideo 是一个可以将 markdown 转为视频的插件。其支持：

* 自动”剪辑“
* 添加字幕
* 语言合成
* 。。。

不过目前仍然不支持 mac 平台且语言实现相对简单，期待功能更加完善。

地址：<http://mdvideo.gshll.com/>

### 2021-09-15\[工具]

gron 是一个使得**grep 可以处理格式化 json 结构的文本的工具**。

比如你有这样一个 json：

```json
[
  {
    "commit": {
      "author": {
        "date": "2016-07-02T10:51:21Z",
        "email": "mail@tomnomnom.com",
        "name": "Tom Hudson"
      }
    }
  }
]
```

你可以 `gron test.json | fgrep "commit.author"` 就可以获得这样的结果(获取到 json 中的 author 字段的信息)：

```js
json[0].commit.author = {};
json[0].commit.author.date = "2016-07-02T10:51:21Z";
json[0].commit.author.email = "mail@tomnomnom.com";
json[0].commit.author.name = "Tom Hudson";
```

地址：<https://github.com/tomnomnom/gron>

### 2021-09-14\[类库]

lit 是一个我关注了蛮长时间的库。这个库目前完善了很多功能，这里推荐给大家。

它可以用声明式的方式去写前端应用。并且非常小巧，只有 几 kb。

![](https://p.ipic.vip/ftuzc8.jpg)

地址：<https://lit.dev/>

### 2021-09-13\[类库]

webpack 是很优秀，全面，生态完好的前端构建工具。而 vite 是最近流行的基于 esm **无打包** 的前端构建工具。

而很多公司和个人都在使用 webpack，他们也想获得 vite 的开发体验。大多数人的做法是按照一些教程手动替换，而今天介绍的工具 Webpack to Vite 可以自动完成这一任务。

地址：<https://github.com/originjs/webpack-to-vite>

### 2021-09-10\[库]

教师节快乐 ✿✿ ヽ(°▽°)ノ ✿

mafs 是一个基于 React 的可视化数学公式的库。其不仅提供了公式的可视化，还可以完成一些交互动作。

地址：<https://mafs.dev/guides/examples/projectile/>

### 2021-09-09\[好文]

Postman 是一个非常著名的接口调试工具，开发者可以使用它来完成接口的功能测试。

新版本的 postman 增加了很多有用的功能，比如环境变量，接口预处理等等。这篇文章带你了解它。

地址：<https://mp.weixin.qq.com/s/WYGjvmsGG3D8sJ9j5i-d7w>

### 2021-09-08\[小技巧]

GUI 的优点就是入门比较快，操作简单。但很多时候却给我带来困扰，比如死活找不到某个功能的入口在哪，更可气的是好不容易记清楚了软件的功能入口，软件升级某一个功能的入口会发生变化，你又要摸索。使用命令行就没有这个问题。

命令行可以使用一些约定好的命令展示软件的所有功能，比如 -h。

好在有一些工具可以查看当前软件的信息，比如查看当前软件的所有快捷键，这个之前我们介绍过了。

而 GUI 程序毕竟是主流，因此我们也必须要要适应。这次介绍的是另外一个**无需安装任何软件**就可以使用的技巧。这里介绍一个小技巧：在 mac 下按 `cmd + ,` 可以直接打开当前应用程序的设置页面。并且几乎所有主流的应用程序都遵守这个约定。

### 2021-09-07\[工具]

API Extractor 是一个帮你更好地管理 ts 声明文件的工具。API Extractor 和 TypeScript 都是微软的开源安排，第一方工具用起来肯定放心。

它可以帮你：

* 生成 md 后缀的报告文件
* 打包 .d.ts 声明文件
* 生成 api 文档

![](https://p.ipic.vip/u0nh73.jpg)

如果你是一个库的开发者，不妨尝试一下这个工具。如果你的仓库是 mono repo，那就更推荐使用了。

地址：<https://api-extractor.com/>

### 2021-09-06\[新闻]

近日 Github 推出 Github 全球大学（Introducing GitHub Global Campus）功能。

你可以在这里申请：<https://education.github.com/discount\\_requests/student\\_application>

![](https://p.ipic.vip/r6d43k.jpg)

地址：<https://education.github.com/>

### 2021-09-03\[工具]

最近 Github 更新了凭证（credential）认证机制，因此很多人碰到了这样的报错：

```
refusing to allow a Personal Access Token to create or update ....
```

这就是 Git 凭证没有配置正确的结果。解决的方式很多，不过我强烈推荐你使用 Git-Credential-Manager-Core，这个是微软自己出的工具。众所周知微软收购了 Github。因此这个工具可谓是为 Github 量身打造，并可以扩展到其他基于 git 的平台上。

mac 用户可以安装 pkg 文件，windows 用户可以安装 exe 文件。之后第一次 push 的时候会提示你认证，你只需按照提示操作就行。

地址：<https://github.com/microsoft/Git-Credential-Manager-Core>

### 2021-09-02\[趣闻]

一个可以摆在桌子上的**监控服务器的小摆件**。

![](https://p.ipic.vip/sn9ujy.jpg)

它可以可以实现通用服务器或计算机的数据监控，包括 CPU 占用、RAM 占用、两个硬盘的可用空间、硬盘读写速度、网络 IO 速率。

> 这动手能力还不错嘛

地址：<https://www.v2ex.com/t/799177>?

### 2021-09-01\[工具]

前端越来越卷很大程度上取决于前端工具迭代太快，同类工具太多。比如打包工具就有很多，比如 webpack，rollup，vite，esbuild，swc 等等。

这不仅让我们疲于学习各种框架和库，而且还疲于应付编写各个端插件。比如我写了一个 webpack 的插件，如果想让 rollup 用，那不得不重新开始写。类似的问题是编写微信小程序，如果想编写一个支付宝小程序也要做一些改变。 由于 taro 等跨端工具就产生了。

unplugin （是 universal plugin 的缩写，中文为通用插件）也是一样的，只不过它的目标是打包插件，而不是小程序罢了。

使用它，你可以同时编写 rollup，vote 以及 webpack 三端的插件。和 taro 等跨端工具一样，它也只能无缝转化**多端交叉的功能**。如果某一端特有的功能，可以使用特殊的 api 来定制。

地址：<https://github.com/unjs/unplugin>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2021-08

![](https://p.ipic.vip/hdy3j2.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2021-08

### 2021-08-31\[工具]

wavesurfer.js 是一个可视化声波的 js 库。

它可以将一个音频（比如 mp3）的声波以可视化的方式渲染到浏览器上。不仅如此，你也可以通过组合多种参数，响应事件，调用方法等实现更多的效果，具体可参考官方文档。

![](https://p.ipic.vip/fhxewr.jpg)

地址：<https://wavesurfer-js.org/>

### 2021-08-30\[资讯]

91 天学算法是我和几个算法大佬一起组建的一个算法提高班。通过 91 天的集中化的学习，让你**遇见更好的自己**。

如果你想提高算法能力进击大厂，不妨试一下。

地址：<https://lucifer.ren/blog/2021/08/21/91algo-5/>

官网：<https://leetcode-solution.cn/91>

### 2021-08-27\[工具]

marked 是又一个将 markdown 转为 html 工具。这其实是我很早就 star 的一个仓库。

之前我一直用的是 markdown-it，原因很简单，就是因为它老牌用的人多，插件生态丰富。而 marked 主打的是性能。因此如果你对性能有要求，不妨可以调研一下 marked 是否更合适。

地址：<https://github.com/markedjs/marked>

### 2021-08-26\[教程]

这算是我见过的唯一一个通俗易懂的 haskell 教程。目前已经更新了三篇：

![](https://p.ipic.vip/6jffxu.jpg)

如果你对函数式编程感兴趣，不妨学习一下 haskell，一定不会让你失望。几年前我在学习 fp（函数式编程）的时候，就借用了一些 haskell 的思想。比如使用 fn :: a -> a 的方式给函数添加签名。

地址：<https://blog.kalvad.com/tag/haskell/>

### 2021-08-25\[工具]

有没有想象过：当你入职一家新公司，只需要下载一个 app 或者登录一个网站，然后所有软件都可以通过它来安装更新，包括常见的开发工具，编辑器插件，浏览器插件等等。

AppWorks Toolkit 就是这样一个工具。

![](https://p.ipic.vip/q8q3e0.jpg)

可惜的是，现在功能还没有图上那么多。目前似乎只有可怜 node 管理，并且迟迟不更新，因此我的建议是不妨**再等等，等个一年半载等它完善或者参考这个思路自己开发一款类似的工具**。

仓库地址：<https://github.com/appworks-lab/toolkit>

### 2021-08-24\[仓库]

如果你想开发 vscode 插件，并且想用 webview 承载 vscode 插件的内容。不妨可以参考下这个 demo 程序。

使用 webview 开发好处是可以使用 web 技术栈，这使得将以往 web 内容无缝迁移到 vscode 插件变得可能。比如公司内部已经有一套基于 web 的系统，使用 webview 几乎可以不用多大改动就可以做成一个运行在 vscode 的插件。

上面说不用多大改动，其实这里的改动主要就是**vscode 插件和 webview 的通信**。比如 webview 不能发送网络请求，而需要 vscode 进行转发等等。因此**如果你的应用又很多网络或者需要借助于 vscode 核心 api 的功能，而展示内容不多，就不适合用 webview 来做 vscode 插件**。

仓库地址：<https://github.com/youngjuning/juejin-me>

### 2021-08-23\[技巧]

测试驱动开发（TDD）要求大家先写测试用例。很多时候，我们第一时间想到的是功能点，即我要测试的几个功能是什么，但具体如何断言还没想好。

这个时候，我们可以先写下一个空的测试用例。类似这样：

```js
describe("#1 do something", () => {
  test("#1.1  should work when ..."); //
  test("#1.2  should work when ...");
  test("#1.3  should work when ...);
  ...
});
```

而这样的话通常会报错（比如使用著名的 jest 测试框架）。

那为什么 jest 要设计成空的测试用例要报错呢？不报错不好么？这里有一个回答很中肯：

![](https://p.ipic.vip/53iiaz.jpg)

那既然空的测试用例报错是合理的，我们写空的测试用例这个事情也是合理的，那如何调节这个矛盾呢？

* 一种方式是使用 test.skip 跳过测试用例。这个和使用 jest -t 'test case name' 有点像。都是跳过部分用例，仅执行一部分用例。

![](https://p.ipic.vip/30903m.jpg)

* 另外一种方式是使用 test.todo。这个是新增的一个方法，功能类似。不过显示的方式有点变化，起到了前面那位小哥提到的**提示用户有空的测试用例没有写**的效果。

![](https://p.ipic.vip/17td7j.jpg)

### 2021-08-20\[工具]

bibi 是一个在线 epub 阅读器。

主要特点：

* 符合 EPUB 3。除了日语竖写和 ruby 外，还显示了各种语言和布局。
* 基于 MIT 许可开源软件。请放心使用。
* 它由 100% JavaScript 制成，适用于各种设备浏览 ​ 器。支持的环境： Chrome / Safari / Opera / Firefox / Microsoft Edge / Internet Explorer 11

地址：<https://bibi.epub.link/#demo>

### 2021-08-19\[工具]

txiki 是一个 JS Runtime，它的特点就是一个字：**小**。

什么是 JS Runtime？顾名思义，就是 JS 的运行环境。它和 JS 引擎是不一样的，JS 引擎对接的是 ECMA 规范。而运行时则可能会增加一些符合其他规范的内容。比如浏览器就是 JS Runtime，Node 也是 JS Runtime。

比如 DOM API，再比如 BOM API 都是运行时提供的，和 JS 引擎没有关系。node 的话还有一些系统 api，比如 fs 等，这些也是运行时提供的。

而 txiki 则对接的是浏览器 api。底层 JS 引擎用的是 quickjs，使用 libuv 跨平台（与 node 一样）。

地址：<https://github.com/saghul/txiki.js>

### 2021-08-18\[技巧]

如果你想重命名一个项目中的某个变量，你会怎么做呢？

难道是 ctrl + f 搜索，然后 replace 么？这样不仅效率低，而且容易出错。

更聪明的做法是使用 rename symbol 功能，主流编辑器都有这个功能。比如 vscode 直接点击某个变量，选择 rename symbol，然后你就可以输出新的名字点确定，之后这个项目（可能有多个文件）都会被替换为新名字。由于其实基于 ast 去做的，因此准确率很高。使用这种方法几秒就可以替换完成这个项目。

### 2021-08-17\[仓库]

本文介绍的是利用学生身份可以享受到的相关学生优惠权益，但也希望各位享受权利的同时不要忘记自己的义务，不要售卖、转手自己的学生优惠资格，使得其他同学无法受益。

<https://github.com/ivmm/Student-resources>

### 2021-08-14\[新闻]

Github 出了一个新的功能，用来方便地在论文中引用 Github 资料。

如果你想让其他人正确引用你的仓库，你需要：

1. Github 中的内容发表过论文，这样你会得到一个 [doi](https://zh.wikipedia.org/zh-hans/DOI)
2. 在 Github 仓库的根目录新建文件 `CITATION.cff`。文件类似：

```
cff-version: 1.2.0
message: "If you use this software, please cite it as below."
authors:
- family-names: "Lisa"
  given-names: "Mona"
  orcid: "https://orcid.org/0000-0000-0000-0000"
- family-names: "Bot"
  given-names: "Hew"
  orcid: "https://orcid.org/0000-0000-0000-0000"
title: "My Research Software"
version: 2.0.4
doi: 10.5281/zenodo.1234
date-released: 2017-12-18
url: "https://github.com/github/linguist"
```

这样你的 Github 主页就有这样一个按钮。其他人想要引用你的 Github 论文，就可以直接点击这里进行复制粘贴。

![](https://p.ipic.vip/xzap3o.jpg)

关于这个功能的详细介绍请参考：<https://github.blog/2021-08-19-enhanced-support-citations-github/>

### 2021-08-13\[好文]

SSR（Server Side Rendering)，CSR（Client Side Rendering），SSG（Static Site Generation），ISR（Incremental Static Regeneration） 分别是什么，基本原理如何你知道么？

next.js 支持这几种渲染模式。不仅如此， next.js 还支持这几种模式的混合模式，比如 SSR + CSR 模式 和 SSG + SSR 模式。这篇文章就详细介绍了 next.js 中的几种渲染模式。

地址：<https://mp.weixin.qq.com/s/tDPkTwrR031CjsWbiVTVGw>

### 2021-08-12\[仓库]

mitosis 是一个遵循 **write once，run everywhere** 哲学的前端框架。你可以使用 mitosis 写代码，并最终编译为其他平台，比如 Vue, React, Solid, Angular, Svelte 等等。

如下是其目前对各个框架的支持情况：

![](https://p.ipic.vip/0p6sr2.jpg)

它的基本原理很简单，就是将 mitosis 代码转义为 JSON，接下来 mitosis 通过解析这份 JSON 文件生成其他不同平台的代码。

个人认为想法很不错，但是**学习价值大于实用价值**。因为这种方案坑可能会有很多，不太建议大家直接在商业项目使用。如果非要使用，请做好详细的调研 ⚠️。

地址：<https://github.com/BuilderIO/mitosis>

### 2021-08-11\[技巧]

有人好奇：逗号表达式有什么用？看下下面的代码就知道了。

```js
// Input
"World" |> `Hello, ${#}!` |> alert(#);

// output
var _ref, _ref2;
(_ref2 = ((_ref = "World"), `Hello, ${_ref}!`)), alert(_ref2);
```

### 2021-08-05\[类库]

在上一家公司工作的时候，我负责开发公司的 ab test 系统。说实话，我们的功能极其简单。尽管如此，这个功能也花费了我们大量的时间去设计，实现，调试，发布。

easy-abtest 正如它的名字一样，是一个使用极为简单的 abtest 框架。

有多简单呢？我们来看下。

首先是定义变量，以及权重等配置。

```js
const abtest = require("easy-abtest");
let options = {
  enabled: true,
  name: "experiment-ID-here",
  buckets: [
    { variant: 0, weight: 0.4 },
    { variant: 1, weight: 0.6 },
  ],
};
app.use(abtest(options));
```

> 字段含义参考官方文档

接下来就是使用了。经过上面的配置，你就可以在业务代码拿到之前定义的变量。比如上面的配置，你就有 40% 的请求拿到 variant 为 1，60% 请求拿到 variant 为 2。

这个数据默认是挂在 req.session.test 上的。

```js
if (req.session.test.bucket == 0) {
  return res.render("index"); // 40%
} else if (req.session.test.bucket == 1) {
  return res.render("index-new"); // 60%
}
```

这是一个刚刚发布不到一个月的产品，代码只有 100 行左右（加上测试用例代码差不多 200 行），不太建议直接在生产环境使用。

地址：<https://github.com/darshanbib/easy-abtest>

### 2021-08-04\[技巧]

已知一个环，比如环的长度为 n，环的编号是 \[0,n-1]，那么 n - 1 的下一个位置 0。

给定起始位置 pos 和环长度 n，让你求走 x 步之后， pos 的位置。x 为正数表示编号增加，x 为负数，表示编号减少。

我们可以分情况讨论：

* 如果 x 大于 0，那么下个坐标 `nxt = (pos+x)%n`
* 如果 x 小于 0，那么下个坐标 `nxt = pos+x+n*((pos+x)/n)`

组合起来就是 nxt = ((pos + x)%n+n)%n。

### 2021-08-03\[好文]

RPC 是什么？自己如何实现 RPC？实现 RPC 需要考虑什么内容？听字节跳动 web infra 团队大佬娓娓道来。

![](https://p.ipic.vip/7oh4md.jpg) （RPC 流程图，包含通信和加解码两大部分）

<https://mp.weixin.qq.com/s/Ky6SoWJv85orqYioihTRqg>

### 2021-08-02\[类库]

folio 是微软出品的测试框架。它的 fixture 设计我很喜欢，通过这个功能可以实现很多其他测试框架不那么容易实现的功能，值得大家尝试。

比如测试的时候我依赖了 express 服务器，并且我想启动多个进程并发地进行测试。

大家知道 express 服务需要绑定端口提供服务，那么端口号怎么填呢？

基于 folio 的 fixture 设计，我们可以这面使用：

```js
// express.spec.ts
import test from "./express-test";
import fetch from "node-fetch";

test("fetch 1", async ({ port }) => {
  const result = await fetch(`http://localhost:${port}/1`);
  test.expect(await result.text()).toBe("Hello World 1!");
});

test("fetch 2", async ({ port }) => {
  const result = await fetch(`http://localhost:${port}/2`);
  test.expect(await result.text()).toBe("Hello World 2!");
});
```

> port 需要实现注册，关于如何注册可以查看官方文档。

地址：<https://github.com/microsoft/folio>

### 2021-08-01\[仓库]

当你试图对一个 npm 库做修改，一个常见的方法是

1. 新建一个不同的名字的库，在这个新的库里你复制原有的代码并做修改。
2. 修改依赖，引用新的被修改的库的名字。

这很不方便，且不利于追踪（比如如何查看改了什么功能？）。

patch-package 就解决了这个问题。使用方式也非常简单：

```bash
# fix a bug in one of your dependencies
vim node_modules/some-package/brokenFile.js

# run patch-package to create a .patch file
npx patch-package some-package

# commit the patch file to share the fix with your team
git add patches/some-package+3.14.15.patch
git commit -m "fix brokenFile.js in some-package"

```

地址：<https://github.com/ds300/patch-package#readme>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2021-06

![](https://p.ipic.vip/8nz0hv.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2021-06

### 2021-06-23\[仓库]

这个仓库是 JavaScript 的知识图谱，目前更新了 JavaScript 基础，HTML & CSS 以及 JavaScript 数据结构与算法。

我看了一下，内容很简单，干货不多，更适合初学者或者是查缺补漏，不适合拿来**修炼**。不过这种将知识点浓缩到一张超级大的图片中的做法还是很震撼的。尤其是我第一次打开的时候。

![](https://p.ipic.vip/o9udce.jpg)

地址：<https://github.com/mechaniac/Map-of-Javascript>

### 2021-06-22\[网站]

我们很多时候都需要找一些相对权威的资料。比如一个 JS 特性不清楚的话（比如多个浏览器对同一个特性实现不同，谁对？），可以翻阅 ECMA 规范。

这次分享的是一个查阅 RFC 规范的网站。RFC 的内容很多，比如大家常常听到的 DNS，TCP 等等。如果你有什么拿不准的，可以过来查查看。

> 这个网站相应速度很快

地址：<https://rfc.fyi/>

### 2021-06-21\[好文]

HMR 是大家都在用的一个特性，webpack 内置 HRM。那么 HMR 的原理你知道吗？

地址：<https://mp.weixin.qq.com/s?\\_\\_biz=Mzg2ODQ1OTExOA==\\&mid=2247491058\\&idx=1\\&sn=05b0ddcc20627c46931bafce4d4a745f>

### 2021-06-19\[仓库]

Mock Servic Worker （简称 MSW）是一个通过 ServiceWoker 拦截请求实现**无需更改代码实现 mock** 的库，支持 fetch，xhr，graphql。

如果你在为单元测试 mock 接口烦恼，不妨试一下。

地址：<https://github.com/mswjs/msw>

### 2021-06-18\[仓库]

很多人都知道 react 有 next.js 这样的前后端同构框架，用于快速开发同构项目。相应地，vue 有 nuxt.js。

不过它们都是基于 node.js 的，那基于 deno 的前后端同构框架呢？aleph.js 就是一个基于 react 的前后端同构框架，并且是基于 deno 运行时的。

地址：<https://github.com/alephjs/aleph.js>

### 2021-06-16\[仓库]

越来越多的人用性能更好的语言写一些基础工具并转为 wasm 给 JS 调用。 wasm-bindgen 就是一个可以支持 rust 和 JS 互操作的 rust 库。

<https://github.com/rustwasm/wasm-bindgen>

### 2021-06-14\[好文]

大多数时候，当公司发生故障的时候，我们总是倾向于找负责人（背锅侠），这本身没有什么错误，可以这却可能导致一些人由于怕担责任而故意掩盖甚至扭曲一些东西，这是很可怕的。 那么如何做事故的复盘？这篇文章提供了一个思路。

文章地址：<https://mp.weixin.qq.com/s/\\_q0n-gK7tSQCIiE7d8GJCw>

### 2021-06-09\[好文]

以前我做过很多技术调研或者出一些技术方案。这个过程免不了对各种方案进行对比。如果我让你对比一下 react 和 preact 你会如何对比呢？从几个方向？

这里推荐一篇关于《react 升级调研 - react or preact》技术调研文章。大家可以看看大佬是如何做技术调研的，提供一些思路。

地址：<https://github.com/mq2thez/blog/blob/main/upgrade-react-etsy/preact-vs-react.md>

### 2021-06-08\[仓库]

很多时候，我们会做一些 checklist，方便我们最后做一些校验。 比如火箭发射前，会对着清单逐一检查完毕才最终发射。

我接触比较多的是发布清单，每次发布前都会对着清单检查一遍。有的是自动检查，有的是手动检查。

这里给出了一个腾讯的安全清单，供你对自己的代码安全性进行自检。

> 安全无小事！

地址：<https://github.com/Tencent/secguide/blob/main/JavaScript%E5%AE%89%E5%85%A8%E6%8C%87%E5%8D%97.md#1>

除了 JS，提供了其他语言的，参考：

* <https://github.com/Tencent/secguide>

### 2021-06-07\[好文]

原文标题：《居然有比 npm link 更好的调试？》

讲述了如何使用 yalc 来提高本地开发 npm 包的调试效率。

地址： <https://mp.weixin.qq.com/s/kG5cXpohvQBFVigaQk2a7w>

### 2021-06-06\[小知识]

nodejs 中异步信息很难跟踪，比如如下代码：

```js
fs.open("hello.txt", (err, res) => {
  // something
  console.log("cb");
});
```

如果回调函数失败了，那么调用堆栈就消失了，也就自然无法复现完整的操作路径，这在大项目中是致命的。

Node.js v8.x 增加了 async hooks 模块很好地解决了这个问题，并且异步资源还可以使用 async storage 共享一些数据。

### 2021-06-05\[框架]

eggjs 是一个很火的阿里出品的 nodejs 框架。不过我一直认为 ta 做的还不够，尽管 ta 自己宣称的是**企业级 nodejs 框架**。

相比之下，Nestjs 更接近我心目中的**企业级框架**，并且 Nestjs 还提供完成的学习教程（文字和视频都有，不过视频只有几个是免费的）。

地址：<https://docs.nestjs.com/>

### 2021-06-04\[网站]

一个可视化 TypeScript AST 节点的网站。与其他 AST 可视化网站不同的是其专门用于 TS 的可视化，有 Node，Symbol 这种 TS 专用的节点显示。如果你要了解 TypeScript 的原理或者准备基于其进行改造，那么这个东西一定不要错过了。

![](https://p.ipic.vip/8pwlux.jpg)

地址：<https://ts-ast-viewer.com/#code/DYUwLgBAhgXAzmATgSwHYHMIF4BEBGHAKEKmwhwCYcg>

### 2021-06-03\[框架]

astro 是 snowpack 团队开发的项目。由于之前看过一个关于 astro 的演示视频，因此对它影响还蛮深的。

它的定位其实不是框架，只不过我找不到很好的词去形容。 astro 本身可以和其他框架（react，vue， svelte 等）进行集成。另外它本身也提供了一些特有语法，也有自己的文件后缀 .astro 解析（类似于 vue 提供了模板语法，并可解析自己的 vue 文件）。

除此之外，它还有一些很有意思的特性。比如：

* 默认 0 JS。
* 原生支持 md 文件的解析，并渲染成 html。

所以我认为 astro 是一个优雅降级的前端框架。

地址：<https://github.com/snowpackjs/astro>

### 2021-06-02\[好文]

简单使用 esbuild-loader 替换 babel-loader 就把项目构建速度提升了一倍以上？

![](https://p.ipic.vip/gxsupj.jpg)

文章地址：[webpack or esbuild: Why not both?](https://blog.logrocket.com/webpack-or-esbuild-why-not-both/)

### 2021-06-01\[工具]

synthesia 是一个 AI 工具，允许你通过**上传一个带人物的视频并录入一段文字**，从而上视频中的人“说”出你写好的文字的工具。

地址：<https://www.synthesia.io/>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2021-05

![](https://p.ipic.vip/4m3kvb.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2021-05

### 2021-05-28\[好文]

一个教你如何写 AST 插件的教程，真的是图文并茂，并且可交互，做的很用心了。

虽然这个文章是基于 Babel 插件讲的，但是看完之后基本可以写任意一个 AST 插件。

![](https://p.ipic.vip/ieplbx.jpg)

![](https://p.ipic.vip/17zhrs.jpg)

地址：<https://nan.fyi/debugger>

### 2021-05-27\[网站]

一个可爱风的**前端事件可视化**网站。 它可以模拟事件的触发过程并通过可视化的方式展示出来， 支持用户自定义一些修改。如果你是新手，这绝对是一个不可多得的前端事件系统知识学习工具。

![](https://p.ipic.vip/qbc6dt.jpg)

地址： <https://domevents.dev/>

### 2021-05-26\[工具]

我一直想做又一直没有时间做的东西终于有人做了，而且开源出来了。

这是一个 vscode 工具，可以根据运行时数据自动生成 TypeScript 类型。

目前项目还是比较初级的阶段，建议大家先观望一段时间后使用。

![](https://p.ipic.vip/pk1gkt.gif)

地址：<https://github.com/rikukissa/typehole>

### 2021-05-21\[好文]

git 合并大家都用过。那 git 合并有几种模式？它们之间有什么区别你知道么？

简单来说有四种：

* fast-forward。如果从 A 拉取新分支并合并回 A，在此期间 A 没有变化，则默认执行 fast forward，git 历史看不到分支合并的过程，这是默认行为，你可是适用 no-ff 在合并后创建一个新的提交。
* no-ff(no fast-forward)
* recursive 如果从 A 拉取新分支合并回 A，在此期间 A 发生了变化，则只能使用 recursive 和 sqush，两者区别在于 recursive 会保留 A 的所有 commit，而 squash 则会仅生成一个 commit，因此使用 squash 的历史记录会更干净。
* squash

相信内容请看文章。

地址：<https://blog.dnsimple.com/2019/01/two-years-of-squash-merge/>

### 2021-05-17\[好文]

前端如何监听静态资源的加载错误？

如果静态资源加载错误，前端该如何处理？重新加载页面？按需加载出错的资源？

这篇文章告诉你答案。

地址：<http://www.alloyteam.com/2021/01/15358/>

### 2021-05-13\[工具]

这个工具还蛮有意思的，它是一个 react 高阶组件，可以帮助你可视化组件的盒模型。

![](https://p.ipic.vip/i9g00z.jpg)

仓库地址：<https://github.com/raunofreiberg/inspx>

### 2021-05-12\[教程]

微软出品的一个 Rust 基本教程，基本内容就是一些基础语法，语言特性， 以及一个 TODOList 的 demo。除了最后一部分 TODOList 比较复杂外，其他模块还是相当容易的。

<https://docs.microsoft.com/zh-cn/learn/paths/rust-first-steps/>

### 2021-05-11\[好文]

原文标题《探秘神奇的运动路径动画 Motion Path 》。

众所周知，使用 CSS 写动画很难对路径等做特别精细的处理，这也是大多数动画库都是 JS 的原因之一。 这篇文章详细讲述了 CSS Motion 是如何解决这个问题的。

文章地址：<https://github.com/chokcoco/iCSS/issues/113>

### 2021-05-10\[库]

之前我写过一篇文章 [你不知道的前端异常处理（万字长文，建议收藏）](https://lucifer.ren/blog/2020/10/02/error-catch/)，里面就详细了异常就是一个数据结构，异常处理就是对应这种数据结构的算法而已。

异常有很多最佳实现，比如 error chain，这在许多语言其实都已经有了，而 JS 是没有的，只能通过类似 node-verror 这样的库来实现。

而 error chain 目前已经 stage 3 了，提案链接：<https://github.com/tc39/proposal-error-cause。后期可能会被各大浏览器和> node 等 JS 执行环境所实现。

地址：<https://github.com/joyent/node-verror>

### 2021-05-09\[工具]

一款通过模拟真实用户操作来白嫖 tinypng 的 gulp 插件。源码很简单，你可以将其轻易地移植到其他工具，比如 webpack，vite，esbuild 等。

<https://github.com/fulme/tinypng-free>

### 2021-05-08\[工具]

微信浏览器调试工具（目前仅支持安卓）

地址：<https://debugx5.qq.com/>

### 2021-05-07\[工具]

如何观察你的电脑上的 DNS 请求呢？

由于 DNS 查询同时使用了 TCP 和 UDP，因此我们可以考虑使用 tcpdump 来进行查看。这虽然可以达到目标，但是 tcpdump 信息比较繁琐。

于是有人制作了一个 DNS 工具 dnspeep（需下载安装），帮助你查看本机发送的所有 DNS 查询。地址：<https://github.com/jvns/dnspeep>

另外它还搞了两个 DNS 小工具（在线版，无需下载）：

* <https://dns-lookup.jvns.ca> 一个发送 DNS 请求的工具。
* <https://dns-lookup.jvns.ca/trace.html> 一个可以查询 DNS 详细工具过程的工具

### 2021-05-06\[工具]

![](https://p.ipic.vip/r9vqzm.jpg)

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2021-04

![](https://p.ipic.vip/stk75m.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2021-04

### 2021-04-30\[网站]

一个可视化正则的网站。类似的网站我之前推荐过一个，之所以再次推荐这个是因为**它是基于 JS 的正则引擎**，因此如果你使用 JS 的正则，使用它可能会更精确。

> 由于不可描述的原因，不同语言正则的标准都不太一样。

地址：<https://jex.im/regulex>

### 2021-04-29\[工具]

今天推荐的是一个 mac 端的 app 《Dropover》。通过它可以使得拖拽如丝般柔顺，实现一些很**有趣**的功能。

地址：<https://dropoverapp.com/>

### 2021-04-28\[工具]

markdown-preview-enhanced 是一个增强版的 markdown 预览工具，目前支持 atom 和 vscode。

说它是增强版一点都不过分，它是我见过的最强的 markdown 预览插件。支持 ppt 模式，主题定制，公式显示等等诸多功能。

![markdown-preview-enhanced](https://p.ipic.vip/x962gy.jpg)

![导出的 ppt 效果](https://p.ipic.vip/4m5xxs.jpg)

地址：<https://github.com/shd101wyy/markdown-preview-enhanced>

此外也有一款工具也可以将 md 转化为 ppt，效果比较一般。 都是他自带了一个服务端，你可以实现云端投屏（air play）的效果。

![air play](https://p.ipic.vip/ddmbsb.jpg)

地址：<https://github.com/aiyanbo/md-ppt>

### 2021-04-27\[言论]

我建议大家多学习几门编程语言。 这样不仅在必要的时候可以用到，而且可以扩展你的视野。 比如 JS 中有一个 import 语法。

```js
import { useState } from "react";
```

这种语法我个人觉得设计地并不好。相反，我觉得 Python 的设计就很好。Python 的话是这样导入的：

```py
from bisect import bisect_left
```

可以看出是 from 在前，这有什么好处？ 这样就可以输入 from 就有智能提示， 输入 from bisect import 会得到进一步的智能提示。而 JS 呢？

类似的例子还有很多，所以我建议大家多学习几门编程语言。 我推荐几门语言给大家吧。 **Python， Scala（或者 Elm），C++**，这几个各有特色。

### 2021-04-26\[仓库]

所谓**talk is cheap， show me code**。平时我们参加面试，有时候会有一些笔试环节，让你手写代码。而现在很多都是线上的视频面试，因此很多公司开始使用云端编辑器，使得面试官和求职者贡献一个页面，实时进行”友好“交流。

大公司可能会直接自研（比如阿里的伯乐系统），也会直接买商用的（比如牛客系统）。这方面的开源工具不多，今天给大家介绍的就是一个开源的在线笔试平台 **show me the code**。

仓库地址：<https://github.com/youzan/show-me-the-code>

### 2021-04-23\[好文]

一个非常详细的 vscode 插件编写指南。通过它你可以实现一个最简单的插件。万事开头难，等你开了头之后，后面就可以自己摸索了。

地址：<https://mp.weixin.qq.com/s/OhHe1kyHzh90Utdtf2E-iw>

### 2021-04-22\[好文]

awk 是一个**简单，好用的**基于列的文本处理工具。如果你需要处理一些列分割的文本，那么一定考虑它。功能非常强大，很多语法和 Python 比较像，学习成本不高（一个小时就够了）。

最近看了一篇文章**使用 awk 生成二维数组，并基于此处理文本**。由于以前都没这么用过，感觉还是蛮有意思的。文章地址：<https://www.lujun9972.win/blog/2021/04/15/%E4%BD%BF%E7%94%A8awk%E6%9F%A5%E6%89%BE%E5%B9%B6%E4%BF%AE%E5%A4%8D%E6%95%B0%E6%8D%AE%E4%B8%AD%E4%B8%80%E5%AF%B9%E5%A4%9A%E7%9A%84%E4%B8%8D%E4%B8%80%E8%87%B4%E9%97%AE%E9%A2%98/index.html>

虽然学习 awk 不难，但是网上资料良莠不齐，我推荐一个快速入门，十分钟左右就能看完。看完掌握 80% awk 内容不成问题。

文章地址：<http://www.hcs.harvard.edu/\\~dholland/computers/awk.html>

### 2021-04-21\[好文]

如何写一个 vscode 插件？这篇文章告诉你。

这篇文章的特色有：

* 提供代码，更具有实战价值。
* 系统讲解了 vscode 插件的整体结构。虽然不够详细，但是知识系统化，你需要什么更精细的内容，可以阅读官方文档或者其他细粒度的资料。
* vscode 的插件需要用到的常见 api 都进行了讲解。除此之外还讲了如何调试和测试插件，可以说相当全面了。

如果你正准备开发 vscode 插件，或者将来有开发 vscode 插件的打算，那么这篇入门文章会很适合你。

地址：<https://blog.logrocket.com/writing-vs-code-extensions-in-javascript/>

### 2021-04-20\[好文]

vim 是一门语言。掌握 vim 的人对其爱不释手，不懂得人对其望而生畏。

> 你有过使用 vim ，却不知道如何退出的窘境么？

我的浏览器和 vscode 都装了 vim。 （如果可能的话，想给自己操作系统也装一个 vim 插件）。

文章提到了学习 vim 的几种境界：

* Level 0: not knowing about Vim
* Level 1: knows Vim basics
* Level 2: knows visual mode
* Level 3: knows various motions
* Level 4: not needing visual mode

我感觉自己在 2 和 3 之间，如果能达到 4，你肯定会对 vim 爱不释手的。

这篇文章是我见过的 vim 讲的比较不错的之一，推荐给大家。

文章地址：<https://danielmiessler.com/study/vim/>

#### 2021-04-19\[类库]

* language: JS

你或许听说过使用 gpu 加速动画。你听过使用 gpu 运行 js 代码么？就像 web worker 一样？

gpu.js 就是这样的一个工具库，可以帮助你使用 gpu 的能力加速你的应用。不过不建议在一些简单的项目中使用，因为那样做不仅增加了项目复杂度还有可能造成性能不升反降。

地址：<https://github.com/gpujs/gpu.js>

#### 2021-04-16\[好文]

Git Submodule 大家使用过么？ submodule 其实不难理解，它就像是一个指向另外一个远程仓库的远程指针。

我其实早就知道这个概念了，但是一直没有机会使用，直到最近在做公司的一个项目的时候。这让我感受到了”纸上得来终觉浅“。这篇文章从作者自身的角度出发，一步一步讲述了为啥使用 submodule 以及如何做的，解决了什么问题。每一个问题都讲解地很清楚。读完之后自己试下，效果更好哦\~

地址：<https://blog.bitsrc.io/how-to-utilize-submodules-within-git-repos-5dfdd1c62d09>

#### 2021-04-15\[好文]

正如文章所说，做一个打包工具其实不难的，我之前就自己徒手撸了一个小的打包器，核心代码不到 100 行，仓库地址：[从零开始开发一个 Webpack](https://github.com/azl397985856/mono-webpack)。打包器难的地方在于如何设计插件系统。以及如何支持更多其他功能（比如**虚拟模块**）。

文章标题《基于 esbuild 的 universal bundler 设计》，详细讲述了打包器是什么，以及设计一个通用的打包器需要考虑什么。

地址：<https://juejin.cn/post/6940218189921910797#heading-28>

#### 2021-04-14\[类库]

eslint-plugin-clean-regex 是一个帮助你写出干净正则表达式的 eslint 插件。

比如如下的正则就是”不干净“的。

* /(?:\w|\d)+/
* /(?:a|(b)|c|(?:d)|(?:ee)){0,}/
* /(?\<!\w)a+(?=$)/mi
* /\[\s\S]#\[\0-\uFFFF]/ysi
* /\d\*\w(?:\[a-z\_]|\d+)\*/im

这个插件会提示你改成下面这样（和上面一一对应）：

* /\w+/
* /(?:\[acd]|(b)|ee)\*/
* /\ba+$/im
* /.#./sy
* /\w+/

地址：<https://github.com/RunDevelopment/eslint-plugin-clean-regex>

#### 2021-04-13\[好文]

不少前端 npm script 太过依赖。将所有的命令都写到 package.json 的 script 中，然后通过 npm run xxx 的形式执行。

这在一些小项目没啥问题，甚至 react 和 vue 的脚手架生产的项目工程都是这样的。但是当你的项目规模增长，脚本增多。npm script 的问题就暴露出来了，比如依赖管理比较复杂，再比如每次构建都是全量构建（不考虑优化），即使你根本没有改变代码。相比于 npm script， 老牌的 makefile 可以很好地解决这些问题。

如果你参与的是大型项目，不妨考虑使用 makefile 来管理你的项目。

文章地址：<https://spin.atomicobject.com/2021/03/22/makefiles-vs-package-json-scripts/>

### 2021-04-12\[好文]

美团技术团队出的优质 Flutter Web 实践文章，文章标题《Flutter Web 在美团外卖的实践》。

文章从基础架构，性能优化，流程等多方面对问题进行了分析，值得大家学习。如果你正好在学习和使用 Flutter，那么就更应该看一下啦\~

文章地址：<https://mp.weixin.qq.com/s/GjFC5\\_85pIk9EbKPJXZsXg>

### 2021-04-09\[类库]

bytemd 字节跳动团队开发的一个基于 svelte（一个 JS 框架）的 Markdown 编辑器。功能非常多，符合了代码高亮，流程图，主题等方方面面，掘金就是基于它开发的。你可以基于它做一些扩展，给你的网站增加 markdown 编辑的能力。

![bytemd 使用效果](https://p.ipic.vip/hg5von.jpg)

地址：<https://github.com/bytedance/bytemd>

### 2021-04-08\[仓库]

为了学习 html 的解析过程，手写的一个 html 解析器，用于将 html 字符串解析为树形结构。

![](https://p.ipic.vip/my8nu7.jpg)

地址：<https://github.com/azl397985856/html-parser>

### 2021-04-07\[类库]

sql.js 是一个在 web 端运行的 SQLite 库。 通过它，你就可以直接在 web 端操作”SQLite“ 了。之所以加了引号，是因为它并不是真正的 sqlite，而是符合 sqlite 规范的内存型数据库。它将所有的数据统一放到内存中进行管理。

它允许你导入已有的 sqlite 数据库，并支持导出符合 sqlite 规范的格式，很神奇吧？

下面是官方提供的演示代码：

```js
const initSqlJs = require("sql.js");

const SQL = await initSqlJs({
  locateFile: (file) => `https://sql.js.org/dist/${file}`,
});

// Create a database
var db = new SQL.Database();

// Prepare an sql statement
var stmt = db.prepare("SELECT * FROM hello WHERE a=:aval AND b=:bval");

// Bind values to the parameters and fetch the results of the query
var result = stmt.getAsObject({ ":aval": 1, ":bval": "world" });
console.log(result); // Will print {a:1, b:'world'}
```

地址：<https://github.com/sql-js/sql.js>

### 2021-04-06\[工具]

今天介绍的 spectacle 并不是 mac 上的窗口管理工具，而是一个 JS 库。 功能和 revealjs 一样，都是用来做精美的 PPT 的。

地址：<https://github.com/FormidableLabs/spectacle>

### 2021-04-05\[好文]

网上讲 https 文章很多。但是大多数是讲原理的，本文直接使用 openssl 通过代码（严格来说是命令行）让你理解 https，毕竟纸上得来终觉浅，绝知此事要躬行。

地址：<https://cjting.me/2021/03/02/how-to-validate-tls-certificate/>

### 2021-04-02\[类库]

之前我关注 lit-html，现在我开始关注 linkeddom。两者都是没有编译时，在运行时解决字符串为 DOM 的类库。

一个简单的用法：

```js
const {
  // note, these are *not* globals
  window, document, customElements,
  HTMLElement,
  Event, CustomEvent
  // other exports ..
} = parseHTML(`
  <!doctype html>
  <html lang="en">
    <head>
      <title>Hello SSR</title>
    </head>
    <body>
      <form>
        <input name="user">
        <button>
          Submit
        </button>
      </form>
    </body>
  </html>
```

linkdom 功能更加丰富，而且对标准的支持更加好一点。不过两者也不是替代关系，这两个大家都可以关注一下。

### 2021-04-01\[Github Action]

Issues Translator 是一个可以自动将 Github 的中文 issue 翻译为英文的 Github Action。如果你的项目是面向全世界开发者的，那么就可以考虑使用 ta 。

地址：<https://github.com/marketplace/actions/issues-translator>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2021-03

![](https://p.ipic.vip/r2m9p0.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2021-03

### 2021-03-31\[工具]

一个可以实时翻译不同语言，以支持不同语言的人一起开会。这或许就是跨国远程办公党的胜利？

> 更容易赚美刀 ^\_^ 啦？

<https://business-review.eu/tech/cisco-webex-breaks-through-language-barriers-and-launches-real-time-translation-217869>

### 2021-03-30\[类库]

prisma 是一个 Nodejs 端的 ORM 框架。和 [waterline](https://github.com/balderdashy/waterline) 类似，也提供了多种主流数据库的接入，以及统一的便捷的封装函数。

从使用体验上来看，prisma 更加舒服。 prisma 通过自己定义一套 DSL（prisma 文件中使用的语法），并自己解析，使得开发体验更加友好。另外从 Github 的 star 数以及 npm 上的下载量来看，prisma 都表现地不错。

使用示例(Create a new User and a new Post record in the same query)：

```js
// Run inside `async` function
const user = await prisma.user.create({
  data: {
    name: "Alice",
    email: "alice@prisma.io",
    posts: {
      create: { title: "Join us for Prisma Day 2021" },
    },
  },
});
```

Update an existing Post record

```js
// Run inside `async` function
const post = await prisma.post.update({
  where: { id: 42 },
  data: { published: true },
});
```

地址：<https://github.com/prisma/prisma>

### 2021-03-29\[工具]

一个可以运行在多端(window, linux 和 mac)的 switch 模拟器。从此畅玩 switch？

地址：<https://ryujinx.org/download>

### 2021-03-26\[工具]

<https://github.com/azl397985856/UnicomTask>

### 2021-03-25\[好文]

OpenSSH 是使用 SSH 透过计算机网络加密通信的开源免费实现。大多数程序员都或多或少和它打过交道。

OpenSSH 实践手册详细讲解了如何使用 ssh，比如 sshpass 实现无密码登录，做 Socks 代理，端口转发等。我想**大多数人都没有彻底利用好 ta**。

地址：<https://engr-z.com/326.html>

### 2021-03-24\[类库]

vue-use-gesture 是一个 vue 的 hooks 库，用于手势控制。可以使得任意的元素可拖动。你还可以配合 `vue-use-spring` 实现更多动画效果。

![](https://p.ipic.vip/vm4m8x.gif)

地址：<https://vue-use-gesture.netlify.app/docs>

### 2021-03-23\[工具]

今天介绍的是一个打包工具 snowpack。它借助了现代浏览器支持 ESM 的特性，使得开发的时候不进行打包，而是每次修改文件只修改改变部分的 ESM 模块，使得热更新的时间复杂度从 $O(n)$,降低到 $O(1)# 其中 n 为模块数目。

推荐的做法是开发中用 snowpack 的 ESM 构建使得构建速度不会随着项目变大而增长，发布的时候根据自己项目的需要支持的浏览器进行打包。

snowpack 也提供了类似 React 的 create-react-app。使用方式很简单，敲以下命令就可以了:

```bash
npx create-snowpack-app react-snowpack --template @snowpack/app-template-react
```

地址：<https://www.snowpack.dev/>

### 2021-03-22\[类库]

console-ban 是一个脑洞很大的库。其可以让你的前端代码免于被人打开控制台查看，减少了前端代码被分析，盗取的风险。

![](https://p.ipic.vip/5hwhh5.jpg)

地址：<https://github.com/fz6m/console-ban>

### 2021-03-19\[类库]

nolimits4web（一个俄国程序员） 写的 swiper 或许是最好的 swiper 插件了。唯一的缺点就是太大了，不过你可以懒加载它。如果你的需求比较轻量，不想引入那么大的文件可考虑使用 tiny-swiper，地址：<https://github.com/joe223/tiny-swiper>

swiper 地址：<https://github.com/nolimits4web/swiper>

### 2021-03-18\[仓库]

波兰的的一个牛人用 JS 实现了一个非常火爆的像素风游戏 《我的世界》。服务端和客户端代码全部开源。

地址：<https://github.com/michaljaz/web-minecraft>

### 2021-03-17\[网站]

OrbitDB 一个去中心化的 p2p 数据库，非常有意思。相对于传统的集中式， OrbitDB 将数据分布在我们每个人的机器上。你可以通过他们的网站来感受一下。

地址：<https://orbitdb.org/>

### 2021-03-16\[类库]

一些网站会有一些新手导航，就是下一步上一步的那个蒙层，用来帮助用户快速了解网站的使用方式。

之前刚毕业的时候用过一个这种类库，是基于 React 的 reactour。 类似的还有 react-wizard-tour 等。

今天给大家介绍的是一个原生 JS 写的类库 - shepherd，其不仅支持原生，还提供了所有主流框架的集成版本，比如 react，vue，angular 等等。此外其 api 设计比较好，star 也比较多。

地址：<https://github.com/shipshapecode/shepherd>

### 2021-03-15\[好文]

广告无处不在，它是支撑互联网高速发展的经济基石。互联网广告对互联网公司意味着什么？互联网的产业组成有哪些？CPC/CPM/CPS/CPI，这些术语意味着什么？各种 Vlog 博主能赚多少钱？普通人如何利用互联网广告赚钱？这篇文章告诉你答案。

地址：<https://www.bmpi.dev/dev/what-is-internet-advertising/>

### 2021-03-12\[好文]

很多技术人员到了一定的阶段（年纪）都会转到管理岗。而技术转管理很多人一开始是不适应的，毕竟工作内容以及责任发生了很大的变化。从对自己负责变成了对整个团队负责。

人的习惯是难以改变的，这需要大家不断地有意识地提醒自己并纠正才可以。除此之外一个指导准则也很重要，这几篇文章是我整理的适合技术转管理看的文章列表。

> 列表后续也会持续更新

* [如何做好技术 Team Leader？](https://mp.weixin.qq.com/s/U-hqectN-fes7Td6Osut7Q)
* [想要做大事，就要有高效的协作机制](https://mp.weixin.qq.com/s/2o5Ib23SaOSqs5yW71W-Eg)

### 2021-03-11\[好文]

很多公司都在讲 OKR。但说实话落地起来都效果不好，各种走偏。这其实也和当前的发展阶段有关。相关的 OKR 文章我也看过一些， 而这篇文章是字节飞书团队写的，是我见过**实操性最强的文章**。不仅有大量的例子还有工具（飞书 OKR 模块）配合。如果你正在用 OKR 或者即将使用 OKR，一定不要错过\~

文章列表：

* [5 分钟快速掌握 OKR 管理法 - OKR 理论篇](https://bytedance.feishu.cn/docs/doccnASRymC3YRjobicaOacpLFc)
* [5 分钟快速掌握 OKR 管理法 - OKR 实施篇](https://bytedance.feishu.cn/docs/doccnzkPxGyukUNZWr9sgJgouVf)
* [制定与撰写 OKR | 两种思路与七类方法](https://bytedance.feishu.cn/docs/doccnF0yzGWKvRomAw0Ely9CJhg)

### 2021-03-10\[好文]

文章名《如何构建一款超级玛丽》。虽然说是教你构建超级玛丽，其实就是一个简单的小人运动，并没有什么吃蘑菇的场景。不过基于它的代码再去实现也不是难事，毕竟入门是最难的。作者写了好几篇博客来讲构建超级玛丽的细节。

![](https://p.ipic.vip/bpqcws.gif)

文章地址：<http://www.wopaige.cn/views/JS%E5%9F%BA%E7%A1%80/Super.html>

### 2021-03-09\[仓库]

随着 vue3.0 的发布 elementui 也开始跟进，推出了 elementui-plus。如果你对 element-ui 比较熟悉，那么使用它的话过渡也会比较自然。

![](https://p.ipic.vip/bmcu5z.jpg)

地址：<https://github.com/element-plus/element-plus>

### 2021-03-08\[仓库]

一个关于 JS 统计的仓库，收集一些比较流行的框架，工具等，并按照多个维度进行整合，帮助大家**快速了解最近有哪些 JS 技术值得关注**。

地址：<https://github.com/bestofjs/javascript-risingstars>

### 2021-03-05\[好文]

有道前端团队出品的《有道云笔记新版编辑器架构设计 》，分为上下两篇。详细讲述了**富文本编辑器**的采坑之路。如果你对**富文本编辑器** 感兴趣，千万不要错过。

文章地址：

* 上篇：<https://zhuanlan.zhihu.com/p/345895871>
* 下篇：<https://zhuanlan.zhihu.com/p/347415991>

### 2021-03-04\[仓库]

![](https://p.ipic.vip/ipwo1a.jpg)

类似于 Rust，deno 等，rome 是对 JS,TS, JSON, HTML, CSS 等资源进行管理的一体化工具。之所以说是一体化，指的是其提供 lint，编译，打包，测试等全生命周期。

它的出现就是位了取代 babel，eslint，webpack，prettier，jest 等等，可以看出其野心之大。这或许也是没有被大家广泛使用的原因之一吧。现在项目已经 14.8 star，值得大家关注一波。

地址：<https://github.com/rome/tools>

### 2021-03-03\[好文]

一个关于 Ryan Dahl （nodejs 和 deno 的作者）的采访。来看看，大佬是如何看待当前大环境的，以及大佬有哪些良好的习惯可以借鉴吧！

地址：<https://evrone.com/ryan-dahl-interview>

### 2021-03-02\[网站]

有时候你想快速运行一个代码片段，而不想繁琐地准备一大堆环境。JS 有类似的工具浏览器控制台或者 runjs，而其他语言呢？

其实很多语言都有在线运行网站，这里推荐一个在线运行各种语言的网站（现在支持语言有十余种）。免去了你准备环境的烦恼，直接打开浏览器输入代码就可运行看效果。

![网站效果](https://p.ipic.vip/pny9qi.jpg)

地址： <https://www.onlinegdb.com/online\\_python\\_compiler>

### 2021-03-01\[好文]

91 天学算法是我和几个算法大佬一起组建的一个算法提高班。通过 91 天的集中化的学习，让你**遇见更好的自己**。

这是 91 天学算法第三期视频会议的一个文字版总结。

地址：<https://lucifer.ren/blog/2021/03/01/91meeting-season-3-1/>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2021-02

![](https://p.ipic.vip/78bpi0.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2021-02

### 2021-02-28\[好文]

是不是有许多小伙伴在刷力扣的时候感觉无从下手？从头按顺序开始刷的童鞋们可能会比较有感触，为什么才第四题就感觉很难了?没关系，本文将对力扣的 1-700 题中不需要会员的数据结构与算法题目(数据库与 shell 除外)进行分类，并推荐一个刷题的顺序。

![](https://p.ipic.vip/i9c9hc.gif)

（部分题目）

文章地址：<https://leetcode-cn.com/circle/article/48kq9d/>

### 2021-02-27\[好文]

A\* 算法是一种比较复杂的启发式算法，在面试中考察的次数不多。但是其本身覆盖的知识很广，也可以解决很多实际问题，比如游戏路径指引（我承认很多算法没有用）。因此我建议学有余力的同学可以尝试学习一下。 而今天这篇文章是我见过的 A\* 算法讲的最好的文章之一。

![](https://p.ipic.vip/0vyjmh.jpg)

（部分目录）

文章地址：<http://theory.stanford.edu/\\~amitp/GameProgramming/AStarComparison.html#the-a-star-algorithm>

### 2021-02-26\[仓库]

这是一个关于 Domain-Driven Design（领域驱动设计），简称 DDD 的一个聚合型仓库。里面包含了基本概念，六边形理论，原则方法，例子，最佳实践等。**是我见过最全的 DDD 知识仓库**。最近这个仓库也登上了 Github Trending。

![](https://p.ipic.vip/8onwfi.jpg)

（仓库部分目录）

仓库地址：<https://github.com/Sairyss/domain-driven-hexagon#Architecture>

### 2021-02-25\[框架]

rest\_rpc 是一款由 C++ 编写的，使用简单，高性能跨平台，支持 callback 和 future 两种风格的 rpc 框架。

用官方的话来说就是：

> rest\_rpc 是一个高性能、易用、跨平台、header only 的 c++11 rpc 库，它的目标是让 tcp 通信变得非常简单易用，即使不懂网络通信的人也可以直接使用它。 可以快速上手，使用者只需要关注自己的业务逻辑即可。

由于它的实现足够简单， 你可以通过 ta 来学习 rpc 的原理。

### 2021-02-24\[好文]

默认情况下，React 采用的更新方式是自顶向下全局更新的，而不像 vue 一样“局部”更新。如果想实现局部更新的效果，则需要我们手动实现。

目前常用的方式有：

* 拆分组件
* 使用 children
* 采用 useMemo 或者 重写 shouldComponentUpdate 生命周期

这篇文章通过一个具体的例子，演示了如何通过一些技巧实现“局部更新”以优化性能的。

> 不管使用的是什么框架，也不管你再做什么应用，务必记住“仅更新确实需要更新的部分”。

地址：<https://overreacted.io/before-you-memo/>

### 2021-02-23\[工具]

pipcook 是阿里开源的人工智能在前端领域的一个工具。使用它，你可以在不借助后端的情况下直接使用人工智能算法，这得益于著名框架 tensorflow 出的 tensorflow\.js。将运算转移到客户端，无疑缓解了 AI 对算力的要求。

pipcook 目前主要的功能是图片和文字识别创造等传统的功能，如果你有类似的需求，而不打算投入服务器算力资源，那么可以考虑使用。

有的人担心直接使用 JS  玩 AI 是不是不太靠谱，还是觉得 Python 比较稳。没有关系， pipcook 也考虑到了这一点， 它提供了一个包 **boa**，从而允许你在 js 中直接使用 Python 中的函数。比如：

```js
const boa = require("@pipcook/boa");
const os = boa.import("os");
console.log(os.getpid()); // prints the pid from python.

// using keyword arguments namely `kwargs`
os.makedirs(
  "..",
  boa.kwargs({
    mode: 0x777,
    exist_ok: false,
  })
);

// using bult-in functions
const { range, len } = boa.builtins();
const list = range(0, 10); // create a range array
console.log(len(list)); // 10
console.log(list[2]); // 2
```

地址：<https://alibaba.github.io/pipcook>

### 2021-02-22\[网站]

type-challenges 是一批 ts 爱好者搞出来的一个网站，它提供了大量的 ts 练习题，现在已经有 70 道题了，而且还在不断增加。

这个网站最大的特点是不仅按照难度对问题进行了归类，而且难度非常大，比我在市面上看到的题目难度高出不少，适合想挑战自己的人。当然如果你觉得自己能力还不够，可以尝试从简单难度开始。

![](https://p.ipic.vip/6uz2fy.jpg)

地址：<https://github.com/type-challenges/type-challenges/blob/master/README.zh-CN.md>

### 2021-02-20\[工具]

midwayjs 是阿里淘宝前端团队在 serverless 领域开源的一个行业标杆级产品。除了提供”完善的 serverless 生命周期管理，不绑定某一家云服务厂商，提供方便的从其他框架迁移功能“等核心功能之外。其还提供了一些通用组件，hooks 能力，丰富的装饰器等辅助功能。更加令人欣慰的是，它还提供了 vscode 的良好支持，使得我们可以在 vscode 中方便地进行调试，以及查看接口信息。

![](https://p.ipic.vip/0nb9w9.jpg)

地址：<https://www.yuque.com/midwayjs/faas/what\\_to\\_do>

### 2021-02-19\[网站]

Github 老是挂。但是最近 Github 在这方面做得努力真的令人佩服，不仅有事故报告，值班制度，工单系统等，还提供了 github status，方便你查看现在 github 的状况。通过它，你可以知道 Github Action 是挂的。

![](https://p.ipic.vip/sylmw4.jpg)

它精确地告诉了你事故发生的时间以及具体影响的业务，真的是很贴心了，我希望更多的产品都能提供这样的功能。

地址：<https://www.githubstatus.com/>

### 2021-02-18\[好文]

文章标题：《Serverless 如何让前端程序员没有后端也能完成项目?》，文章脑洞比较大，前端直接调用后端的数据库等组件。这在技术上很容易实现，但是业务上肯定有很多的问题需要解决，比如安全性以及性能问题，这篇文章提供了一些不错的思路。

文章地址：<https://www.codingstyle.cn/topics/75>

### 2021-02-12\[好文]

pnpm 是什么？相比于 npm 和 yarn ，它的优势在哪里？本文带你解密。

文章地址：<https://juejin.cn/post/6932046455733485575>

### 2021-02-11\[好文]

如何给自己的 Github 主页增加**自动更新博客文章**的功能？

### 2021-02-10\[好文]

掘金点赞超 1000 的文章。详细列举了各种 web 前端设计技巧。注意有如下内容：

* 各种布局方式
* 页面设计优化
* 字体优化
* 可访问性

文章地址：<https://juejin.cn/post/6932647134944886797>

### 2021-02-09\[仓库]

良好的命名是好的代码的基本条件。不过要想写出通俗易懂，一致性的命名可不简单。这供仓库列举了关于命名的原则和最佳实践，帮助你写出良好的命名。

仓库地址：<https://github.com/kettanaito/naming-cheatsheet>

### 2021-02-08\[工具]

骨架图是一种又爱又恨的东西，虽然它都提升性能没有任何帮助。但是有时候却可以缓解用户等待的焦急情绪。

生成骨架图方式有很多。一种简单的实现方式就是使用无头浏览器渲染页面，并加页面中的**关键位置**做灰色背景处理，最后使用无头浏览器的截图功能生成图片即可。

今天给大家推荐的这个工具是网易考拉团队开源的一个生成骨架图的工具。使用方式很简单：

安装：

```bash
npm i awesome-skeleton -g
```

使用：

```bash
skeleton -c ./skeleton.config.json
```

仓库地址：<https://github.com/kaola-fed/awesome-skeleton>

## 2021-02-05\[工具]

mkcert 是一个允许你在本机（localhost）允许 https 的工具。这在你需要在本地调试 https 的时候极为有用。

地址：<https://github.com/FiloSottile/mkcert>

### 2021-02-04\[网站]

skypack 允许你直接**在浏览器引入 npm 库**，而不需要在本地 npm 安装。

类似如下方式：

```js
import confetti from "https://cdn.skypack.dev/canvas-confetti";
confetti();
```

<https://www.skypack.dev/>

### 2021-02-03\[工具]

功能强大的 Kafka 集群监控和运维管理平台

![](https://p.ipic.vip/7wht8x.jpg)

地址：<https://github.com/didi/Logi-KafkaManager>

### 2021-02-02\[网站]

如果你想要学习 Python，可以先看下入门书籍或者官方的文档，之后可以做一些练习来巩固。今天就给大家推荐一个在线练习 Python 的网站。

该网站目前提供了 36 道练习题，覆盖了 Python 中绝大数知识点，每一道题都提供了答案，方便你卡壳的时候参考。

![](https://p.ipic.vip/bnig4w.jpg)

地址： <http://www.practicepython.org/>

### 2021-02-01\[工具]

transform 是一个提供在线**数据格式转换**服务的网站。它提供了众多数据结构的互相转换功能。

从大的层面上，其输入支持 SVG，HTML，JSON，CSS，JS，TS ,GraphQL 等。输出也非常丰富，不同输入对应的也导出输出种类也不相同。

比如你可以将 JSON 转为 MYSQl。

![](https://p.ipic.vip/p5kryz.jpg)

再比如你可以将 JSON 转换为 TS 的 interface。

![](https://p.ipic.vip/2jo30u.jpg)

总之你如果需要数据格式转换，请务必考虑一下。值得注意的是，其不仅提供在线网站，还提供 API 供开发者调用，以更灵活的方式集成到自己的业务中。

地址：<https://transform.tools/json-to-mysql>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2021-01

![](https://p.ipic.vip/t13gz9.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2021-01

### 2021-01-29\[网站]

上次（2020-12）给大家推荐了一个可视化算法的网站。今天给大家介绍一个 功能更全面的网站，不仅可以可视化算法，还提供了大量数据结构的可视化。

![网站截图](https://p.ipic.vip/oftble.jpg)

![二叉堆的可视化](https://p.ipic.vip/exgli1.jpg)

地址：<https://visualgo.net/>

### 2021-01-28\[仓库]

厌恶了 996 的“安逸”生活？想进体制内？ 程序员如何考取公务员？这个仓库或许能帮助你。

仓库内容：

* 程序员成功上岸经历
* 程序员备考的最佳实践
* 程序员备考过程中会遇到哪些问题？
* 公考公平吗，35 岁再去考可以么？
* 资料、工具推荐和扩展阅读
* 。。。

地址：<https://github.com/azl397985856/coder2gwy>

### 2021-01-27\[好文]

不使用 vuex， 我们可以如何集中化管理应用状态（如何自己实现）？

使用 vue3 提供的 api，比如 react ，watch 等可以很容易的实现这个功能。

文章地址：<https://zhuanlan.zhihu.com/p/309371894>

### 2021-01-26\[仓库]

React 在前一段时间提出了一个新的特性**服务端组件（server-components）**。不同于服务端渲染（SSR），它只是一个运行在服务端的组件而已。

当你使用服务端组件的时候， 只需要在后缀中进行区分，用 .server.js 即可。相对的，客户端组件需要使用 .client.js。如果没有这两种后缀的文件会被认为在两种环境都可以跑，为了避免出现问题，如果不写后缀，只能用服务端组件和客户端组件的交集。

服务端组件目前只是 alpha 阶段，到真正生产可用还有一段路要走，比如构建工具和 lint 工具的支持等。

这里有一个官方提供的服务端组件 demo 仓库，供大家学习，仓库主页还提供了一个**演讲视频**的链接。如果你第一次听说这个概念，不妨先看下视频了解一下。

仓库地址：<https://github.com/reactjs/server-components-demo>

### 2021-01-25\[好文]

文章内容我**部分认同**，但是结尾有一句话我非常认同。那就是：

```
用领域驱动解决高层级问题，用函数式解决低层级问题，才是最佳开发范式

也就是说，函数式和面向对象，没有好坏，他们只是两个关注点不同的思想方法而已

你要是被这种思想方法影响，眼里只有对错 ——

实际上是被忽悠了
```

文章地址：<https://zhuanlan.zhihu.com/p/342774974>

### 2021-01-22\[工具]

vite 是尤雨溪写的一个代替 webpack 的工具，它包含了本地开发服务器和打包模块。除了支持 vue，其还拓展支持了 react 和 preact 等流行框架。

> vite 在法语中是快的意思，尤雨溪这货还真是喜欢法语啊。

地址：<https://vitejs.dev/guide/introduction.html>

### 2021-01-21\[视频教程]

vue 作者尤雨溪本身亲自下海讲课，手把手教你实现一个 mini-vue，来看下作者本人的思路吧。

地址：<https://www.vuemastery.com/courses/vue3-deep-dive-with-evan-you/vue3-overview>

### 2021-01-20\[工具]

一个在线展示 latex 效果的网站， 你输入 latex，它可以实时展示效果，并支持多种格式的导出。

<https://www.codecogs.com/latex/eqneditor.php?lang=zh-cn>

### 2021-01-19\[工具]

给不同的网站和应用不同的密码以防止密码泄露带来的大规模问题已经是一个公认的方法。可是密码设置地太过简单很容易被破解，设置太复杂自己又很难记住。

试想你能记住以下 3 个不同的复杂密码么？

* Y\~u(pX'}>an<>d'\<bQAq
* \X$^\<e\~>m#-;MfbTf&,.
* n(P7^VwLf3`OdJur`uZJ

一种方法是自己只记住一个主密码，让密码管理器帮你生成以及记住**其他所有密码**。

只要你上网，那么密码管理都是每个人不得不面对的一件事。当初我在郑州的一个公司面试的时候，就有这样一个面试题“如何管理你的各种密码”。我当时就给了一种解决方案**密码管理器**，即记住主密码，让主密码帮你管理剩下的密码。

KeePassXC 以及 1 password 就是这样的密码管理工具。

* KeePassXC 是开源免费的，不过没有浏览器插件等辅助工具，因此使用上不方便，需要自己手动保存各种密码。<https://keepassxc.org/>
* 1 password 体验很好，很多人都推荐。不过它是一个付费软件。 <https://1password.com/>

![](https://p.ipic.vip/bi10b6.jpg)

### 2021-01-18\[技巧]

App 在 macOS Catalina 下**提示已损坏，无法打开**解决办法。

1. 打开终端；
2. 输入以下命令，回车；

```bash
sudo xattr -d com.apple.quarantine /Applications/xxxx.app
```

> 注意：/Applications/xxxx.app 换成你的 App 路径（推荐直接将.app 文件拖入终端中自动生成路径，以防空格等转义字符手动复制或输入出现错误）

1. 重启 App 即可。

### 2021-01-15\[好文]

NodeJS 中的流和 Buffer 是两个很重要的概念，几乎所有的内容都与他们有关。如果你想精通 NodeJS ，这肯定是绕不开的坎。Buffer 是流的基础，这篇文章算是 Buffer 的入门文章了，详细讲解了各个 Buffer 的 API 的用法。

地址：<https://blog.logrocket.com/node-js-buffer-a-complete-guide/>

### 2021-01-14\[工具]

有时候你需要进行性能分析，那么使用火焰图绝对是一个不错的选择。

FlameGraph 是一个对操作系统的性能制作火焰图的工具。

![FlameGraph](https://p.ipic.vip/smb4xl.jpg)

我们知道火焰图横轴表示的是时间长短，越宽表示运行的时间越长。纵轴表示的是调用栈，可以看出代码的执行顺序。

Chrome 的 Performance 面板就使用了火焰图。

![Chrome Performance 的火焰图](https://p.ipic.vip/2yyo42.jpg)

你可以用它分析应用的性能瓶颈，除此之外，Chrome 还提供了饼图，智能诊断等其他工具，帮助你更好的发现潜在的性能问题。

地址：<https://github.com/brendangregg/FlameGraph>

### 2021-01-13\[经验分享]

source script.sh 和 ./script.sh 有什么区别?

这两种情况 script.sh 都会在 bash 会话中被读取和执行，不同点在于哪个会话执行这个命令。 对于 source 命令来说，命令是在当前的 bash 会话中执行的，因此当 source 执行完毕，对当前环境的任何更改（例如更改目录或是定义函数）都会留存在当前会话中。 单独运行 ./script.sh 时，当前的 bash 会话将启动新的 bash 会话（实例），并在新实例中运行命令 script.sh。 因此，如果 script.sh 更改目录，新的 bash 会话（实例）会更改目录，但是一旦退出并将控制权返回给父 bash 会话，父会话仍然留在先前的位置（不会有目录的更改）。 同样，如果 script.sh 定义了要在终端中访问的函数，需要用 source 命令在当前 bash 会话中定义这个函数。否则，如果你运行 ./script.sh，只有新的 bash 会话（进程）才能执行定义的函数，而当前的 shell 不能。

### 2021-01-12\[工具]

lnav 是一个日志查看工具。使用方式超级简单，直接打开就行。

它会帮助你自动分析当前目录下所有的日志，并根据时间戳自动排序。如果来自不同的文件，他也会进行分组，并使用不同的颜色加以区分。

![不同颜色区分的日志](https://p.ipic.vip/2tlkkx.jpg)

只要你的日志是以时间戳开始，都可以被 Lnav 捕获到。另外它还提供了常见的过滤功能，更有意思的是它竟然内置了 sqlLite 数据库，使得你可以使用 sql 语言来对日志进行查询。

![使用 SQL 查询](https://p.ipic.vip/xribrx.jpg)

地址：<http://lnav.org/features>

### 2021-01-11\[经验分享]

一般来说，特定种类的文件存储有一定的规范，文件系统，层次结构标准（Filesystem, Hierarchy Standard）可以查到我们讨论内容的详细列表。

* /bin - 基本命令二进制文件
* /sbin - 基本的系统二进制文件，通常是 root 运行的
* /dev - 设备文件，通常是硬件设备接口文件
* /etc - 主机特定的系统配置文件
* /home - 系统用户的家目录
* /lib - 系统软件通用库
* /opt - 可选的应用软件
* /sys - 包含系统的信息和配置(第一堂课介绍的)
* /tmp - 临时文件( /var/tmp ) 通常在重启之间删除
* /usr/ - 只读的用户数据
* /usr/bin - 非必须的命令二进制文件
* /usr/sbin - 非必须的系统二进制文件，通常是由 root 运行的
* /usr/local/bin - 用户编译程序的二进制文件
* /var -变量文件 像日志或缓存

### 2021-01-08\[工具]

[交互式记事本](https://en.wikipedia.org/wiki/Notebook_interface)可以帮助开发者进行与运行结果交互等探索性的编程。现在最受欢迎的交互式记事本环境大概是 [Jupyter](https://jupyter.org/)。它的名字来源于所支持的三种核心语言：Julia、Python、R。[Wolfram Mathematica](https://www.wolfram.com/mathematica/) 是另外一个常用于科学计算的优秀环境。

### 2021-01-07\[工具]

[Hammerspoon](https://www.hammerspoon.org/) 是面向 macOS 的一个桌面自动化框架。它允许用户编写和操作系统功能挂钩的 Lua 脚本，从而与键盘、鼠标、窗口、文件系统等交互。

下面是 Hammerspoon 的一些示例应用：

* 绑定移动窗口到的特定位置的快捷键
* 创建可以自动将窗口整理成特定布局的菜单栏按钮
* 在你到实验室以后，通过检测所连接的 WiFi 网络自动静音扬声器
* 在你不小心拿了朋友的充电器时弹出警告

从用户的角度，Hammerspoon 可以运行任意 Lua 代码，绑定菜单栏按钮、按键、或者事件。Hammerspoon 提供了一个全面的用于和系统交互的库，因此它能没有限制地实现任何功能。你可以从头编写自己的 Hammerspoon 配置，也可以结合别人公布的配置来满足自己的需求。

### 2021-01-06\[经验分享]

大多数工具中，使用 - 代替输入或者输出文件名意味着工具将从标准输入（standard input）获取所需内容，或者向标准输出（standard output）输出结果。

### 2021-01-05\[好文]

如何做一个换肤的功能？主要的思路有两个，一个是基于运行时，一个是基于编译时，各有优缺点，当然你也可以将二者结合。

这篇文章讲的是如何使用 react + style-component 实现网站换肤功能，结合实例，一步步教你怎么做。

地址：<https://css-tricks.com/theming-and-theme-switching-with-react-and-styled-components/#top-of-site>

### 2021-01-04\[工具]

pdb，即 Python Debugger 是 Python 的官方内置调试器，也就是说你可以直接使用如下命令加载：

```py
python3 -m pdb a.py
```

个人感觉它的设计哲学还是很不错的，上到 API 设计，下到代码实现都透露出满满的优雅。如果我下次需要做调试器的话，恐怕会参考它 和 vscode debugger 的实现。

地址：<https://docs.python.org/3/library/pdb.html#module-pdb>

### 2021-01-03\[类库]

React hooks 毫无疑问改变了传统的写代码方式。带来便利性的同时，也会有一些困扰。不过这丝毫不影响其受欢迎程度。

今天给大家介绍一个 React Hooks 的库 `react-hooks-lib`。

其功能覆盖了：

* 生命周期
* 状态
* 副作用(useShallowEqualEffect 和 useDeepEqualEffect)
* 网络(useFeth 和 useOnlineStatus)
* 用户反馈（比如 useFocus, useHover）

你可以用它简化你的”双向绑定“代码。比如如下代码：

> 注意并不是真正的双向绑定

```js
import React from "react";
import { useField } from "react-hooks-lib";

export default function App() {
  const { value, bind } = useField("text");

  return (
    <div>
      <input type="text" {...bind} />
      <p>{value}</p>
    </div>
  );
}
```

仓库地址：<https://github.com/beizhedenglong/react-hooks-lib>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2020-12

![](https://p.ipic.vip/qcm31p.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2020-12

### 2020-12-31\[好文]

啊哈！今天是我的生日 🎂

**管道和重定向**是 shell 中两个非常重要的概念，搞不懂它那么就无法精通 shell，很多高阶操作都依赖于 ta。

这篇文章讲解地非常细致，且例子很丰富，排版也很棒，让你有学习的欲望。

<https://ryanstutorials.net/linuxtutorial/piping.php>

### 2020-12-30\[教程]

《The Missing Semester of Your CS Education》，中文是《计算机教育中缺失的一课》。其实之前就已经听说过了，也看了看。内容比较少，但是却都很实用。刚看到了中文翻译，就立马推荐给大家了。

> 翻译的质量不高，我读了几章，发现了很多错别字，并提交了 pr。

其中部分章节讲的非常精简，但是讲解角度很奇妙，比市面上大多数的文章要好，比如 [版本控制(Git)](https://missing-semester-cn.github.io/2020/version-control/) 这一节。

* 英文版：<https://missing.csail.mit.edu/>
* 中文版： <https://missing-semester-cn.github.io/>

### 2020-12-28\[好文]

到年底了，很多平台都开始了一年一度的年度总结。Github 在这一年都做了什么大事呢？这篇文章告诉你\~

<https://www.toutiao.com/i6909426764825494028>

### 2020-12-25\[好文]

圣诞节快乐 🎄

bash 大家可能在工作中都用过。不过很多人写的 bash 都比较粗糙，没有错误处理，打印不友好，没有帮助文档等等。

这其中的主要原因在于 bash 比较难，还有一个原因是 bash 不是我们工作的主要内容。但其实用好 bash 能很大提高工作的质量和效率，并且 bash 中的很多知识（比如管道）也可以迁移到其他地方。

而这篇文章不是教你 bash 的，而是告诉你一个合格的 bash 脚本应该有什么，并直接给出了模板，大家之后直接“套”即可。

文章地址：<https://betterdev.blog/minimal-safe-bash-script-template/>

另外我将其中的模板提取到了 gist，大家可以直接访问 <https://gist.github.com/azl397985856/40cd0d80f5cb3e011ebc62bf98246f77。>

### 2020-12-23\[仓库]

fuse.js 是一个前端模糊搜索的库，帮助你在不依赖后端的情况下实现模糊搜索。

<https://github.com/krisk/fuse>

### 2020-12-22\[工具]

可视化递归过程的网站。

![](https://p.ipic.vip/e22cl9.jpg)

<https://recursion.now.sh/>

### 2020-12-18\[工具]

pycallgraph 是一个可以可视化代码执行过程的 Python 工具，底层基于大名鼎鼎的图形库 graphviz 实现。

使用效果：

![](https://p.ipic.vip/tujt9c.jpg)

一个更复杂的例子：

![](https://p.ipic.vip/cxa4js.jpg)

<http://pycallgraph.slowchop.com/en/master/index.html>

### 2020-12-17\[工具]

大家可能用过 top 和 iotop 查看机器的负载情况。而 htop 是一个功能更强大的替代工具，UI 更美观，且支持功能更多，用户自定义的选项有很多。

mac 用户可直接使用 brew 安装：

```bash
brew install htop
```

使用效果：

![](https://p.ipic.vip/f8m3rz.jpg)

地址：<https://htop.dev/>

### 2020-12-16\[工具]

你可能对自己写的代码进行过基准测试，那你对命令行程序进行过基准测试么？hyperfine 就是一个对命令行进行基准测试的工具。

使用方式非常简单， 最简单的用法是直接 hyperfine + command 即可 比如：

```bash
hyperfine 'sleep 0.3'
```

ta 还支持很多选项，可以说是一个合格的基准测试工具了。

地址：<https://github.com/sharkdp/hyperfine>

### 2020-12-15\[杂谈]

Python 是一门动态语言，但是它却同 Java，C++等一样是强类型的，这体现在其不会发生隐式类型转换。而弱类型语言，比如 JS 和 PHP 则会发生隐式类型转换。

Python 可以选择性地给变量加类型签名。在 Python 3.x 之前，只能使用注释的方式增加类型注解：

```py
def is_palindrome(s):
    # type: (str) -> bool
    return s == s[::-1]
```

在 Python 3.x 中，我们可以使用如下的方式添加类型定义:

```py
from typing import Iterator

def fib(n: int) -> Iterator[int]:
    a, b = 0, 1
    while a < n:
        yield a
        a, b = b, a + b
```

这样你就可以对代码进行静态检查，并且其也不会对代码运行时产生影响，你如果不需要检查了，也可以选择性去除，这在重构遗留系统是一样的。如果你懂 JS 和 TS，那么一定能够感同身受。更详细的介绍大家可以参考官方文档： <http://www.mypy-lang.org/>

除了静态类型分析，有时候我们也需要对代码风格和语法逻辑等进行检查，这在大型项目中尤为重要，尤其是一堆不太熟悉 Python 的人，比如从 Java 转来的开发。

如果大家需要对**代码风格**进行校验，那么推荐使用 Pylint，默认是 PEP-8 风格。

如果大家需要对**语法或者逻辑**进行校验，那么推荐使用 PyFlakes，其并不会检查上面的代码风格问题。

> PEP-8 是 Python 的官方编码风格指导

### 2020-12-14\[视频教程]

**网络，操作系统，数据结构与算法**都是程序员的内功，学好这些内功可使你的学习效率大增，之后学习其他知识就会得心应手。相信我，各位程序员一定先打好基础，练好内功，不可着急去学语言框架这种东西。

这是一个北京大学的操作系统原理课，一共 82 集，每集大概十几分钟的样子。如果正想要学习操作系统，并且偏好视频的方式学习，那么不妨试试这个。

<https://www.bilibili.com/video/BV1Gx411Q7ro?p=1>

### 2020-12-11\[工具]

一个可以帮助你可视化递归过程的工具，我在[几乎刷完了力扣所有的树题，我发现了这些东西。。。](https://lucifer.ren/blog/2020/11/23/tree/)中提到过 ta。

![递归计算 fib 的过程图](https://p.ipic.vip/yo6ys2.jpg)

<https://recursion.now.sh/>

### 2020-12-10\[工具]

很多人问我使用的画图工具是什么。这里就介绍一个我经常使用的一个画图工具 - **excalidraw**。它可以快速画出一些基本图形，并且支持手写风（目前仅支持英文手写风，中文是不行的）。

![](https://p.ipic.vip/11cn3q.jpg)

> 不过这对于写题解的我来说还是不够方便，于是我有了自己做一个画图工具的打算，主要功能就是根据数据结构直接生成图片，省去了手绘的过程。

地址：<https://excalidraw.com/>

### 2020-12-09\[工具]

我写的一个刷题插件，帮助你高效刷题，不仅内置各种常见算法模板，时间复杂度估算表，学习路线，题解等学习资源。更重要的是，提供了**一键复制所有用例**，**禅定模式**等实用功能以增强刷 leetcode 的体验。欢迎多题意见哦\~

<https://chrome.google.com/webstore/detail/leetcode-cheatsheet/fniccleejlofifaakbgppmbbcdfjonle/related?hl=zh-CN\\&authuser=0>

> 打不开的朋友可使用离线版，离线版可关注我的公众号《力扣加加》回复插件获取。 不过还是建议有条件的使用在线版，毕竟咱的更新还是蛮快的。

### 2020-12-08\[cheatsheet]

如果你使用 markdown 写东西，需要用到数学公式等特殊符号，那么掌握 latex 就很有必要了。

这里有一份 latex 语法手册，需要用的时候看一下，多用几次就熟练了。

<https://assets.ctfassets.net/nrgyaltdicpt/4e825etqMUW8vTF8drfRbw/d4f3d9adcb2980b80818f788e36316b2/A\\_quick\\_guide\\_to\\_LaTeX\\_\\_Overleaf\\_version.pdf>

### 2020-12-07\[好文]

ShellCheck 是一个帮助你检查 shell 错误的工具，本质就是一个 lint 工具，和 eslint 等工具的功能是类似的。

![](https://p.ipic.vip/zxuq37.jpg)

<https://github.com/koalaman/shellcheck>

### 2020-12-04\[好文]

NPM 7 发布了，新增重要功能 **workspace**，这不是一个无感升级，需要用户手动配合。这项功能可以在你的多个项目有很多公共依赖的时候发挥重大作用，使得你可以不必安装重复依赖。

详情：<https://blog.bitsrc.io/npm-7-this-is-what-i-call-an-update-de17a34ab787>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2020-11

![](https://p.ipic.vip/sf3jlo.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2020-11

### 2020-11-30\[好文]

任何一个 Git 仓库，都包含一个相同的对象（哈希为 4b82...4904），指向一个空树（empty tree），这是为什么？

地址：<https://floatingoctothorpe.uk/2017/empty-trees-in-git.html>

### 2020-11-29\[技巧]

Chrome 浏览器引入了一项试验性功能，在开发者工具里面提供 CSS 样式表的概况统计。

![](https://p.ipic.vip/fen5j3.jpg)

地址：<https://umaar.com/dev-tips/240-css-overview-improved/>

### 2020-11-28\[仓库]

作者刷了 200 多道题顺利拿到了满意的 offer 之后写的一个电子书，将自己的心路历程记录了下来，本书一共精选了 101 道题目。

简单评价一下内容，**排版不错，内容丰富，几乎囊括了所有常见考点，致命伤是讲解很少，不适合小白**。

项目地址：<https://github.com/changgyhub/leetcode\\_101>

### 2020-11-27\[好文]

一文带你看遍 Java 8 到 Java 15 的更新。

文章地址：<https://advancedweb.hu/new-language-features-since-java-8-to-15/>

### 2020-11-26\[合集]

又一个 awesome 系列的仓库。这个仓库是 sorrycc 写的，sorrycc 是 antd，umijs，qiankun 等优秀前端开源框架的核心开发人员。

这个仓库的内容相当多，我大概看了几个，质量还可以。大家可以收藏一下，等有需要的话去翻翻看，说不定有你需要的呢\~

部分仓库内容：

![](https://p.ipic.vip/w1lb95.jpg)

仓库地址：<https://github.com/sorrycc/awesome-javascript#testing-frameworks>

### 2020-11-25\[仓库]

这里有一个测试你 JS 基础能力的系列试题。我做了一下，难度偏简单，更多的还是科普。如果你基础比较差建议看一下。目前有五大块内容：

![](https://p.ipic.vip/b1tclf.jpg)

仓库地址：<https://github.com/sadanandpai/javascript-code-challenges>

### 2020-11-20\[好文]

Rust 最近随着 deno 以及其他前端工具的崛起进入了大家的视野。这里有一份 Rust 的教学博客，内容会持续更新，目前有一篇已经翻译成了中文。

地址：<https://github.com/pretzelhammer/rust-blog>

### 2020-11-19\[工具]

fd 是一个可以代替 find 命令的工具命令，使用起来非常简单，而且速度很快。比如:

```
#  查找隐藏文件
fd --hidden
# 查找包括 x 的文件和文件夹
fd x
# 查找 md 后缀的文件
fd -e md
```

等等。。。

mac 用户可以直接 `brew install fd` 安装，其他系统参考下方链接的 install 部分。

地址：<https://github.com/sharkdp/fd>

### 2020-11-18\[技能]

一些 emoji 点缀会使得页面焕发生机。这里列举了 Github 支持的 Markdown emoji 标记，也就是说你可以编辑 markdown 在 Github 看效果。

![](https://p.ipic.vip/ngo2ju.jpg)

上图是我给我的 [leetcode 仓库](https://github.com/azl397985856/leetcode)增加的 emoji。

地址：<https://gist.github.com/rxaviers/7360908>

### 2020-11-16\[工具]

如果你做一个网站，那么首先要考虑的是用户注册登录这些东西。一个公司都会有自己的账户系统，各个系统进行对接，也就是我们常说的单点登录（SSO）。

这里推荐一个集成账户系统，认证模块，第三方登录，SSO 等的一体化解决方案 Authing。

地址：<https://docs.authing.cn/quickstart/best-practise.html>

### 2020-11-10\[好文]

文章标题《底层原理：垃圾回收算法是如何设计的？》。这是一篇阿里技术出品的 JVM 的垃圾回收算法的底层解析，讲的还是不错的。目前比较流行的算法是标记清除，即从根部可达节点做一次深度优先遍历，将不可达的节点回收。除此之外，垃圾回收还有很多其他细节，比如垃圾回收算法和业务代码是串行，并行，还是并发等，标记和清除是分开的两个步骤么等等。这篇文章会给你答案。

> 其实其他编程语言的 GC 原理都大差不大， 比如 V8 的 GC 就和 JVM 有很多的相似性。

原文链接：<https://mp.weixin.qq.com/s/iklfWLmSD4XMAKmFcffp9g>

### 2020-11-09\[技巧]

以前都不知道 markdown 还可以支持 diff 效果。

以前我只知道可以写代码块，比如：

\`\`\`java

// 你的代码

\`\`\`

可以高亮 java 代码。

而实际上，我们不仅可以写编程语言， 还可以写 diff 实现 diff 效果。

比如：

![](https://p.ipic.vip/3htsp3.jpg)

会被渲染为：

```diff
function addTwoNumbers (num1, num2) {
-  return 1 + 2
+  return num1 + num2
}
```

### 2020-11-06\[工具]

lighthouse 大家应该都比较熟悉了。 由于不可抗力，国内很多公司都使用 puppeteer + lighthouse 来搭建公司内部的性能评估平台。

一些公司甚至将 lighthouse 的魔改版加入到了公司的构建流程中来了，而 Chrome 官方开源的 lighthouse + ci 来了，不用自己搭建啦\~

![](https://p.ipic.vip/hqfout.jpg)

你如果用 github ，那么集成 lighthouse ci 简直不要太简单，真的是福音啊\~

```yml
name: CI
on: [push]
jobs:
  lighthouseci:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v1
      - run: npm install && npm install -g @lhci/cli@0.6.x
      - run: npm run build
      - run: lhci autorun
```

地址：<https://github.com/GoogleChrome/lighthouse-ci>

### 2020-11-05(好文)

一个面向初级前端的好文，图文并茂，甚至配了动画，生动形象，基本上属于看了就会系列了。

文章讲了什么是垃圾回收以及垃圾回收的两种算法：引用计数和标记清除。还讲了内存泄漏相关的实践内容。

![](https://p.ipic.vip/ujeyh2.jpg)

文章地址：<https://felixgerschau.com/javascript-memory-management/>

### 2020-11-04\[技巧]

很多国人碰到过 node-saas 按照失败的情况，今天介绍一个方法给大家。这个方法其实很简单，使用中国镜像按照即可，比如你用的是 npm，执行以下命令即可：

```bash
npm install -g mirror-config-china --registry=http://registry.npm.taobao.org
npm install node-sass
```

### 2020-11-03\[组件库]

当你想使用一些偏门的组件，比如水印，高德地图，音视频等，那么可以考虑使用这个组件库。它是由阿里内部维护开源的，质量应该不错の。

![](https://p.ipic.vip/z772wz.jpg) （直播组件）

![](https://p.ipic.vip/oahx02.jpg) （地图组件）

仓库地址：<https://github.com/pansyjs/react-components>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2020-10

![](https://p.ipic.vip/vx25of.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2020-10

### 2020-10-30\[好文]

如何在 linux 记录用户的操作日志？这篇文章告诉你。

文章地址：<https://blog.arstercz.com/how-to-audit-linux-system-operation/?hmsr=toutiao.io\\&utm\\_medium=toutiao.io\\&utm\\_source=toutiao.io>

### 2020-10-29\[框架]

fastify 是一个 nodejs 框架，和 express，koa 类似。使用起来区别也不大：

```js
// Require the framework and instantiate it
const fastify = require("fastify")({
  logger: true,
});

// Declare a route
fastify.get("/", (request, reply) => {
  reply.send({ hello: "world" });
});

// Run the server!
fastify.listen(3000, (err, address) => {
  if (err) throw err;
  fastify.log.info(`server listening on ${address}`);
});
```

如果你会 express 或者 koa， 那么学习 fastify 也会很快。

它的特点正如他的名字那样，速度快。快到不需要怎么优化就可以处理 76 k 的 qps。另外值得一提的是， 它有中文文档。

仓库地址：<https://github.com/fastify/fastify>

### 2020-10-28\[框架]

我们知道， 虚拟 DOM 是一个简单的 JS 对象。用来表示真实 DOM 的。框架（典型的是 React 或者 Vue）会在运行时生成虚拟 DOM，并在应用状态更新的时候进行组件更新的时候进行 DOM diff，以使用最小的代价更新 DOM。这里涉及到一个树的最小编辑距离算法， 不过 React 做了一定的取舍，使得复杂度可以降低到线性。

这看起来不错， 以至于很长时间被认为是标配和主流，直到 Svelte 的出现，用他们自己的话来说就是 **It's important to understand that virtual DOM isn't a feature. It's a means to an end**。Svelte 是一个不算新的 UI 框架。 和 React， Vue 不同的是，其没有采用虚拟 DOM，而是编译时确定。 如果你还没有用过， 可以尝试一下。

![](https://p.ipic.vip/cnchiq.jpg)

地址：<https://svelte.dev/>

### 2020-10-26\[工具]

输入你的用户名，这个工具帮你全网搜索所有网站，哪些网站有这个用户名的用户。

使用效果：

![](https://p.ipic.vip/9x2drp.jpg)

地址：<https://github.com/sherlock-project/sherlock#usage>

### 2020-10-22\[库]

Playwright 是由一群在谷歌开发 Puppeteer 的家伙跑路到微软开发的一个同类型但是功能更强大的工具，不仅支持 Chromium，还支持 Firefox 和 webkit。

什么？你问我为啥微软自己开发的却不支持 IE？难道你不知道微软已经放弃 IE 内核了，转向 Chromium 内核了么？

如果你需要用到无头浏览器做一些自动化的事情不妨考虑一下它。

![](https://p.ipic.vip/be59pv.jpg)

地址：<https://playwright.dev/>

### 2020-10-21\[库]

一个可以在 Python 中执行 JS 的库，这个库在你做爬虫相关内容的时候很有用。

使用示例：

```py
>>> import execjs
>>> execjs.eval("'red yellow blue'.split(' ')")
['red', 'yellow', 'blue']
>>> ctx = execjs.compile("""
...     function add(x, y) {
...         return x + y;
...     }
... """)
>>> ctx.call("add", 1, 2)
3
```

ta 底层用的是 PyV8 实现的，也就是一个封装 V8 引擎的 Python 容器。

地址：<https://github.com/doloopwhile/PyExecJS>

### 2020-10-20\[好文]

相信你在工作中一定用过堡垒机， 大中型公司都会有堡垒机。有的是自建，也有的是用的开源系统。它究竟是什么？做了什么事呢？

[「系统架构」什么是堡垒机？为什么需要堡垒机？](https://mp.weixin.qq.com/s/ptzcIjRePFd_K8_8IiqXfg) 是一个介绍堡垒机的科普文，看我你或许就有答案了。

地址：<https://www.toutiao.com/i6881462700229329421/>

### 2020-10-17\[工具]

不知道你有没有碰到过这样的问题： 你同是开发多个项目，每个项目依赖的 node 和 npm 版本都不一样， 他们彼此不兼容。 你需要在切换项目前修改你的 node 和 npm 版本（当然也可能是其他包管理器，比如 yarn）。你可以使用 nvm 等工具来帮助你，同是在项目的 package.json 中定义一个 engineer 字段，用于指定项目依赖的 node 版本。

这虽然可以解决问题， 但是每次都切换也很浪费时间。 没有使用 volta 时，我的方式是开启多个 tty，每个 tty 的 node 版本不同， 当你切换项目使用对应的 tty 即可。

不过当你使用了 volta，一切会变得不同。volta 可以帮助你管理项目的引擎依赖， 支持 npm， yarn 等宝管理工具。 快来用 volata 管理你的项目包管理器吧。

地址：<https://docs.volta.sh/guide/understanding#managing-your-toolchain>

### 2020-10-16\[工具]

一个可以将 TypeScript 转换为 webassembly 的工具。这意味着你可以用 JS 写 webassembly，获得更好的性能。

地址：<https://github.com/AssemblyScript/assemblyscript>

### 2020-10-15\[工具]

RSLint 是一个用 Rust 写的 lint 工具。 规则挺有意思的， 最关键的是性能好， 其比用 JS 写的 linter 快很多，比如 eslint。

地址：<https://rdambrosio016.github.io/RSLint/index.html>

### 2020-10-14\[行业人物]

在一个圈子中混，怎么能不知道这个行业的领军人物呢？ 今天给大家推荐的是 20 个前端领域的领军人物。

> 你关注了几个？

地址：<https://blog.newrelic.com/technology/javascript-nodejs-developers/?utm\\_campaign=FY21-Q3-DEV-OBSV-AMER-JSW-NL-SL-B\\_JN\\&utm\\_medium=NL\\&utm\\_source=JSW\\&utm\\_content=B\\_JN>

### 2020-10-13\[好文]

我在 [数据结构与算法在前端领域的应用 - 第三篇](https://lucifer.ren/blog/2019/09/20/algorthimn-fe-3/) 中的`重新思考我们的前端应用`小节提到了**假如流行的前端框架比如 React 内置了这种线程分离的功能，即将调和算法交给 WebWorker 来处理，会给前端带来怎么样的变化？**。 这绝对不是异想天开，比如今天给大家分享的这一个文章的观点就很好地印证了这一点。

地址：<https://blog.asayer.io/redux-in-web-workers-off-main-thread-redux-reducers-and-middleware>

### 2020-10-12\[资料]

vue3 出来了，大家都开始学了起来。这里有一份 vue3 学习资料的集合，或者可以帮助你。

![](https://p.ipic.vip/6z0m47.jpg)

地址：<https://github.com/gautemo/vue-3-playground>

### 2020-10-10\[书籍]

给大家安利一本书现代操作系统（第 4 版），豆瓣评分 9.1。很多人推荐的一本书， 读完绝对有巨大的收获。

如果实在觉得读起来吃力，可以关注一下小林和 cxuan，这两个人对操作系统的理解还是蛮深刻的，文章通俗易懂。

### 2020-10-09\[工具]

figlet.js 是一个用于生产 FIGfont 规范的一个 JS 库。效果图：

![](https://p.ipic.vip/u106ub.jpg)

地址：<https://github.com/patorjk/figlet.js>

### 2020-10-08\[工具]

我们平常使用 vue 或者 react 脚手架生产的项目的时候， 启动项目会自动打开浏览器， 你可以借助这款工具实现这个效果。

用法：

```js
const open = require("open");

(async () => {
  // Opens the image in the default image viewer and waits for the opened app to quit.
  await open("unicorn.png", { wait: true });
  console.log("The image viewer app quit");

  // Opens the URL in the default browser.
  await open("https://sindresorhus.com");

  // Opens the URL in a specified browser.
  await open("https://sindresorhus.com", { app: "firefox" });

  // Specify app arguments.
  await open("https://sindresorhus.com", {
    app: ["google chrome", "--incognito"],
  });
})();
```

地址：<https://github.com/sindresorhus/open>

### 2020-10-08\[教程]

一个 30 天免费学习的网站，适合基础薄弱的前端。

![](https://p.ipic.vip/aymizr.jpg)

<https://javascript30.com/>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2020-09

![](https://p.ipic.vip/875iym.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2020-09

### 2020-09-30\[网站]

Google 有一个服务 automl， 旨在降低人工智能的学习和使用成本，可以在运动训练数据，使用简单。

![](https://p.ipic.vip/x7txop.jpg)

地址：<https://cloud.google.com/automl>

### 2020-09-29\[技能]

shell 是程序员的标配技能之一。掌握基础的 shell 是每个程序员必备的， 除此之外， 也有一些复杂的 shell 。 比如这个：

![](https://p.ipic.vip/4a5lhr.jpg)

这是一个中高难度的 shell 题目，地址：<https://github.com/azl397985856/fe-interview/issues/151。>

如果你对 shell 感兴趣，可以去 leetcode shell 专区找几个题做（截止目前， 一共四道题，真希望他们多出一点）。

![](https://p.ipic.vip/v7vgb5.jpg)

地址： <https://leetcode-cn.com/problemset/shell/>

### 2020-09-28\[组件]

antd pro 新增了图形编辑器。如果你有类似流程编辑器，脑图编辑器的需求可以试试。

![](https://p.ipic.vip/4fphg4.jpg)

<https://preview.pro.ant.design/editor/flow>

### 2020-09-27\[网站]

Service Worker Cookbook 是 Mozilla 发起的一个网站，该网站包含了一系列实用的 Service Worker 例子，并从功能维度进行了划分。

如果你想用 Service Worker 增强你的应用， 基本都可以在这个网站找到对应的 Demo。网站还贴心地按照难度进行了区分，有 `Beginner`， `Intermediate` 和 `Advanced` 难度。

![](https://p.ipic.vip/0bnbex.jpg)

地址：<https://serviceworke.rs/>

### 2020-09-18\[工具]

大家写 ts 的时候是不是写了 好多 any。你可以通过 typeof 利用 ts 的类型推导来自动生成类型。不过还是有点麻烦。 大家可以试试 `JSON To TS` ， 复制你的 JSON 自动生成 interface。

![](https://p.ipic.vip/685q9h.jpg)

地址:<http://www.jsontots.com/>

### 2020-09-17\[类库]

React Hooks library for remote data fetching。一个专注于请求的 hooks 库， 有缓存管理的功能，在某些时候可以显著地帮助你减少请求量。当然功能远不止这个，还有：

* Transport and protocol agnostic data fetching
* Revalidation on focus
* Interval polling
* Request deduplication
* Local mutation
* Pagination
* SSR support
* Suspense mode

等等。

地址：<https://github.com/vercel/swr>

### 2020-09-16\[好文]

这是一份 ES decorators 的提案。 如果你不懂 ES decorators，那么这是一个很好的学习资料， 如果你懂 ES decorators， 那么看完之后你可能会觉得你不懂。

地址：<https://github.com/tc39/proposal-decorators/blob/simplified/README.md>

### 2020-09-15\[类库]

有一个网络抓包工具 lightproxy。这是由阿里巴巴出品的扩展了 whitsle 的抓包工具，跨平台。目前已经支持 Mac 和 window，linux 正在开发中。

界面都是直接用的 whistle：

![](https://p.ipic.vip/thhmkc.jpg)

支持 ES6 模板字符串， 语法上来说更爽了?(Maybe) 我的态度是观望。

地址：<https://github.com/alibaba/lightproxy>

### 2020-09-14\[库]

vuedraggable 是一个支持拖拽的高阶组件，可用于实现拖拽排序的功能。start 数比较高， 且更新稳定，很多项目都在用。

![](https://p.ipic.vip/2uzbtg.jpg)

地址：<https://github.com/SortableJS/Vue.Draggable>

### 2020-09-13\[技巧]

VSCode 有一个快捷键，非常好用，就是返回上一个光标 (上一个浏览位置)，你知道么？

* Windows: Alt + ←
* Linux: Ctrl + Alt + -
* Mac: Ctrl + -

VSCode 的 Keyboard Shortcuts” 中搜索 “前进 / Go Forward 或 后退 / Go Back”，可以对其定制。

### 2020-09-11\[经验分享]

会正则真的可以为所欲为。

![](https://p.ipic.vip/8eh2kl.jpg)

（力扣真题 <https://leetcode-cn.com/problems/check-if-word-is-valid-after-substitutions/）>

![](https://p.ipic.vip/jgpkkq.jpg)

（牛客真题）<https://github.com/azl397985856/leetcode/issues/424>

### 2020-09-10\[工具]

[ngrok](https://ngrok.com/) 是一个可以允许你暴露内网服务的简单快捷的方法， 有时候还是很有用的。而今天介绍的工具是一个在 VSCODE 中控制 ngrok 的扩展程序，使用起来异常简单。

地址： <https://github.com/philnash/ngrok-for-vscode>

### 2020-09-09\[小技巧]

如何检测是否打开了 chrome 控制台？下面代码可以帮你:

```js
var devtools = function () {};
devtools.toString = function () {
  if (!this.opened) {
    alert("Opened");
  }
  this.opened = true;
};

console.log("%c", devtools);
```

你知道原理么？

### 2020-09-08\[工具]

一个适合程序员的，充满极客风的，非常硬核的 PPT 制作工具。

![](https://p.ipic.vip/pz4170.gif)

地址： <https://github.com/vinayak-mehta/present>

### 2020-09-07\[好文]

在 Vue 中，我们可以使用 keep-alive 包裹一个动态组件，从而缓存不活跃的实例，而不是直接销毁他们：

```jsx
<keep-alive>
  <component :is="view"></component>
</keep-alive>
```

这对于某些路由切换等场景非常好用，例如，如果我们需要实现一个列表页和详情页，但在用户从详情页返回列表的时候，我们不希望重新请求接口获取，也不希望重置列表的过滤、排序等条件，那这时就可以对列表页的组件用 keep-alive 包裹一下，这样，当路由切换时，Vue 会将这个组件“失活”并缓存起来，而不是直接卸载

原文标题《在 React 中实现 keep alive》，脑洞很大，值得一看，文章也很短，地址：<https://zhuanlan.zhihu.com/p/214166951>

### 2020-09-01\[工具]

np - A better npm publish。 如果大家在 npm 上发过包，一定知道什么是 npm publish，不管你是私有包还是公开包。可是这个命令的功能仅仅是发布一个包，该包的版本需要在 package.json 中声明。而这个工具可以帮助你 bump version，并发布到包管理平台。

仓库地址：<https://github.com/sindresorhus/np>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2020-08

![](https://p.ipic.vip/pxb3vn.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2020-08

### 2020-08-26\[好文]

原文标题：《Under the hood of React’s hooks system》，这是一个讲 React Hook 的底层实现原理的文章，能够帮你更好的理解 hooks，写出更好的 hooks 代码。

比如 React 对各种 effect 做了位的标识，用于简化判断，文章也进行了讲解。以及 useState 实际上调用的就是 useReducer 等。

![](https://p.ipic.vip/mi7wkq.jpg)

原文链接：<https://medium.com/the-guild/under-the-hood-of-reacts-hooks-system-eb59638c9dba>

### 2020-08-25\[工具]

有时候大家会碰到网页不能复制（比如禁止转载）的情况，我们可以使用开发者工具来解决。而这个有点复杂。

这里推荐一个插件 Simple Allow Copy，只需轻轻一点即可随意复制网页内容。插件地址： <https://chrome.google.com/webstore/detail/simple-allow-copy/aefehdhdciieocakfobpaaolhipkcpgc>

![](https://p.ipic.vip/zdjccy.jpg)

没有科学的同学可以去我的公众号《力扣加加》 回复 Allow Copy 即可获取。

另外我打算之后再这里维护科学资料， 需要的自取 <https://github.com/azl397985856/cdn/blob/master/README.md>

### 2020-08-24\[好文]

这是一个讲 V8 内部实现原理的深度好文，主要讲了 V8 在对象访问方面做的优化，比如用到了 shape， IC（inline cache） 等，并且难得的是有大量图片，内容也层层递进，即使你没有基础也可以听懂一部分。

文章地址： <https://mathiasbynens.be/notes/shapes-ics>

### 2020-08-19\[工具]

我们可以将 TypeScript 编译成 JavaScript，我们也可以将 JavaScript + .d.ts 反编译成 TypeScript。 于是我一直思考， 有没有一种方法能够不依赖 .d.ts 直接将 JavaScript 转换为 TypeScript 项目呢？ 我觉得是可行的。 我们要做的无非就是动态类型推导，即根据值的分布情况（有可能值的分布满足正太分布？^\_^）推导变量的类型。 实际上这是个理想的情况。

不过八天前 Airbnb 发布的一个仓库 ts-migrate 则和我的想法类似，大家可以关注一下。

仓库主页：<https://github.com/airbnb/ts-migrate>

相关文章： <https://medium.com/airbnb-engineering/ts-migrate-a-tool-for-migrating-to-typescript-at-scale-cd23bfeb5cc>

### 2020-08-18\[好文]

你或许已经熟悉了 ESM 了，那 importmap 呢？

```js
// index.html

<script type="importmap">
{
  "imports": {
    "lodash": "/node_modules/lodash-es/lodash.js"
  }
}
</script>
```

如上代码什么意思？如果你还不知道，可以看下这个文章。还是一如既往的循序渐进的风格， 很适合新手阅读。

文章地址：<https://blog.logrocket.com/es-modules-in-browsers-with-import-maps/>

### 2020-08-17\[工具]

我们知道 deno 是基于 ESM 的，并且没有统一的包管理平台的。那如果你在使用 deno，并且想要用 npm 上的包怎么办？如果你想要用的 node 上的包是 ESM 格式的，可以通过一些 CDN 工具，比如 unpkg，比如：

```js
import throttle from https://unpkg.com/lodash@4.17.19/throttle.js
```

如果源码是 ESM，但是最终被编译成了别的模块语法。你可以直接用 URL 引用源码，比如：

```js
import throttle from "https://raw.githubusercontent.com/lodash/lodash/master/throttle.js";
```

而如果源码也是 commonjs 写的，那么你可以使用这个在线服务，可以帮助你无感知转换格式。使用方法：

```js
import lodash from "https://dev.jspm.io/lodash";
```

工具地址： <https://jspm.org/>

### 2020-08-10\[好文]

手把手教你自建图床。

文章地址： <https://sspai.com/post/61624>

> 除了使用 OSS+ CDN 的方式，我们也可以选择白嫖 Github。使用全免费方案：用 github 做图床，jsDelivr 做 cdn 加速。在 GitHub 上开一个 public 的仓库，然后把图片传上去，访问的时候用 <https://cdn.jsdelivr.net/gh/\\>\<user\_name>/>repo\_name>/\<file\_name> 来访问就行。

### 2020-08-09\[好文]

这个是个将 Git Workflow 的文章，特点是讲解了多种 workflow 方式，包括主干式，feature 分支式等，并每一种都给了非常好看的配图。

![](https://p.ipic.vip/hlgy3g.jpg)

文章地址：<https://zepel.io/blog/5-git-workflows-to-improve-development/>

### 2020-08-08\[网站]

想学 Go 却不想装环境？或者装了环境，不想每次都新建文件，然后执行？这个在线 Go 执行网站或许可以帮到你。

地址：<https://play.studygolang.com/>

### 2020-08-07\[工具]

Tooling.Report 是一个帮助你从多个维度分析 web 打包工具的平台，包括 browserify，parcel，rollup，webpack。这个网站给的比较非常的直观，测试用例（每个比较维度都有很多测试用例）也很多。

![](https://p.ipic.vip/yto4jq.jpg)

地址：<https://bundlers.tooling.report/>

### 2020-08-06\[好文]

一个适合 JavaScript 程序员看的 Rust 系列教程，目前更新了三篇。

地址： <http://www.sheshbabu.com/posts/rust-for-javascript-developers-functions-and-control-flow/>

### 2020-08-05\[工具]

alinode 技术负责人开发的一个 高度模仿 alinode 的开源产品。和 alinode 的定位一样，也是企业级 Node.js 应用性能监控与线上故障定位解决方案。

![](https://p.ipic.vip/87ng0z.jpg)

Github 地址： <https://github.com/hyj1991/easy-monitor>

### 2020-08-04\[工具]

如果你需要给被人发一个消息，为了安全，你可以选择加密解密，也可以选择阅后即焚，这个工具就是做这个事情的。 不过这确实是一个尝鲜属性大于实用属性的一个工具。

地址：<https://pasteme.cn/>

### 2020-08-03\[工具]

bubblewrap 是 GoogleChromeLab 在 Google web 大会上推出的一个 CLI 工具，帮助开发者一键将 PWA 应用转化为可以上架的安卓应用，前提是你需要安卓他们的标准开发。

Github 地址： <https://github.com/GoogleChromeLabs/bubblewrap>

### 2020-08-02\[类库]

esbuild 是一个 JavaScript 和 TypeScript 打包和压缩器，采用 Go 语言编写，以速度快著称。著名的打包工具 snowpack 和 vite 底层就是用的它。

![](https://p.ipic.vip/jcztr0.jpg)

（esbuild 和 主流打包器的速度对比）

项目地址：<https://github.com/evanw/esbuild>

### 2020-08-01\[好文]

我们平时做单元测试都会将请求给 mock 掉，这本身没有问题，但是 mock 请求做的太简单的话会起不到测试的效果。比如，我请求 body 少传递一个属性， 单元测试是不会报错的，但是我们的想法肯定是能够检测到这种潜在的问题，报错给我们。这篇文章详细介绍了如何解决这个问题。

文章地址：<https://kentcdodds.com/blog/stop-mocking-fetch>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2020-05

![](https://p.ipic.vip/l6pj9m.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2020-05

### 2020-05-30\[好文]

前端有 ES3 规范，有 ES5 规范。。。 为什么没有 ES4 呢？

实际上 ES4 是有的，只不过改动太大，导致浏览器厂商纷纷不干（这需求做不来）。比如 ES4 增加了 TS 中的类型，范型，增加了 Java 中的包，增加了很多年后的 JSX，还增加了至今没有规范化的尾递归等。

这篇文章告诉你 ES4 到底有什么，为什么没有被规范化。

文章地址：<https://evertpot.com/ecmascript-4-the-missing-version/>

### 2020-05-29\[工具]

2020 京东 618 叠蛋糕活动，类似于天猫的盖楼活动。这个工具可以帮助你自动完成每日任务，实现自动盖楼，除了战队和邀请任务之外都可以自动完成。

其基本原理是：

* 调用一个获取所有任务的接口，所有的任务会在返回的 JSON 中包含。
* 遍历这个任务对象，依次发送接口完成任务。

这里京东有几个防范措施：

* 它会判断你的 ua，如果没有 jdapp，则认为不合法。
* 它会校验 cookie
* 它会校验接口请求间隔，如果太短则会报错“请稍后再试”之类。

因此一个简单的想法是：

* 设置浏览器 UA 为 jdapp。
* 打开京东网页版，并登陆，在该网页的控制台执行我们的 hack 脚本（即上面的基本原理部分）。
* 每个接口之间适当增加间隔。

这个工具的原理正是如此， 具体使用方法在[这里](https://github.com/zarkin404/sweater/tree/master/jingdong/2020_cake_baker)。

![](https://p.ipic.vip/9cref5.jpg)

提前祝大家 618 快乐？😂😂😂

### 2020-05-28\[好文]

很多人说编译原理很重要。 但是也有很多前端觉得用不到这些知识，真的是这样么？先不说编译原理中大量的数据结构和算法对你编程思路上的扩展。单单说编译原理在前端的应用就有很多。

比如早期的 Taro 以及很多多端框架就是将一套代码编译成多端。再比如小程序严格的代码审核机制，导致发布不能随着自己的节奏走，那么我们其实可以利用编译的知识自己动态更新小程序的内容，从而绕开小程序内部的审核机制。

今天给大家分享的是一个系列教程，讲述的是`如何用JS写一个JS解释器`，你给它一段 JS 代码，它能帮你执行出来，原文标题《Build a JS Interpreter in JavaScript Using Acorn as a Parser》。

原文地址：<https://blog.bitsrc.io/build-a-js-interpreter-in-javascript-using-acorn-as-a-parser-5487bb53390c>

另外有一个`JS实现JS解释器`的仓库也一并推荐给大家，地址：<https://github.com/zuluoaaa/makeJs。>

### 2020-05-26\[随笔]

HTML5 中竟然还有为视频定制的字幕标签 track。而在 Chrome 中，这个功能由 webCore 模块支持。

```html
<vedio>
  <source src="video.mp4" type="video/mp4" />
  <track src="captions.vtt" kind="subtitle" srclang="en" label="English" />
</vedio>
```

更多关于 track 的介绍，参考：<https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/track>

### 2020-05-22\[仓库]

小公司经常会使用一些业界口碑好的开源产品。比如我们公司就用都了开源的堡垒机，开源的 NPM 仓库。今天给大家介绍的是一个开源的运维平台 `spug`，定位是面向中小型企业设计的轻量级无 Agent 的自动化运维平台，整合了主机管理、主机批量执行、主机在线终端、应用发布部署、在线任务计划、配置中心、监控、报警等一系列功能。。

如果你是一家创业公司，前期不妨考虑直接使用开源的产品，等到确实有必要的时候再自研哦。

地址：<https://github.com/openspug/spug>

### 2020-05-21\[仓库]

如果你想写一门高级语言，那么除了设计语法，另外一个很重要的事情是写编译器，将你的高级语言的源代码转化为相应的汇编语言。

对于编译器部分，你可以使用`手动方式`，它的好处是你可以对底层有更多的控制，因此性能一般而言会更好，比如 GCC 编译器，而相应的就是开发难度比较大。

另一个选择是`自动方式`， 该工具的功能是，你给的一个`上下文无关的语法`，其帮你生成对应的`parser`。

Bison 做的就是这样的事情（准确的说是完成这个需求中的一环）， 它是 GBU 托管的一个开源项目（Yacc 的 GNU 版）。 对 Bison 不熟悉的朋友推荐看一下这个[新手教程](http://dinosaur.compilertools.net/bison/bison_4.html)

而今天介绍给大家的是 Bison 的 JS 版本， 名字是 Jison，也就是 JS + Bison 的意思，简单来说和 Bison 很像，不同的是他是利用 JS 去解析产生式子（JS 驱动），并且 Jison 也扩展了一些新的功能，感兴趣的赶紧下载下来试试吧。

项目地址： <https://github.com/zaach/jison>

### 2020-05-15\[仓库]

blitz 是一个类似 CRA 和 vue-cli 的脚手架工具，只不过其提供的内容更加丰富，包括后端数据库，后端定时任务，utils 等。

最终产生出的脚手架是基于 React 的单体应用，想比 CRA 的好处就是更加完善，初始化之后做的工作更小。当然如果你的应用是纯前端应用，使用 CRA 配合 CRA 提供的模板就足够了。

项目地址： <https://github.com/blitz-js/blitz>

### 2020-05-14\[好文]

原文标题《OpenCV directly in the browser (webassembly + webworker)》， 讲述的是如何在浏览器使用 OpenCV。

基本思路是将 opencv 编译成 webassembly，然后通过 web worker 加载 webassembly 脚本实现。大家有做计算机视觉，且想让其在浏览器端发光发热的可以看下。

![](https://p.ipic.vip/cqns0w.jpg)

文章地址：<https://aralroca.com/blog/opencv-in-the-web>

### 2020-05-12\[仓库]

和 webpack，pacel 类似，esbuild 是一个 JS 的打包和压缩工具。不同的是，其采用 Go 语言编写，且编译环节采用并行的方式，用作者的话来说就是“设计之初，就想着怎么提高性能”。

从 Benchmark 上来看， 其性能有着明显的优势，从实际使用上来说也是如此。但是目前其还不是很稳定，大家可以先关注一下。

![](https://p.ipic.vip/onfrqc.jpg)

地址：<https://github.com/evanw/esbuild>

### 2020-05-11\[仓库]

webpack 是最流行的打包工具之一，尤其是对于业务类型的应用来说。虽然很多工具，比如 vue-cli 或者 create-react-app 等已经帮我们进行了一波封装， 但是我们仍然常常不可避免的需要对其进行配置。

很多人的选择是复制粘贴的模式。 这本身无可厚非，因为 webpack 的语法很多，并且还是经常变化的。这个仓库提供了一种新的方式，你可以将所有的 webpack 配置封装到一个个函数中，然后通过函数实现复用。 这样业务内的 webpack 配置就可以很方便的共享， 因为函数更容易被定制。

![](https://p.ipic.vip/7ub9ms.jpg)

项目地址：<https://github.com/andywer/webpack-blocks>

### 2020-05-09\[工具]

如果你在做 graphql 方面的开发， 那么应该听说过 Facebook 的 relay 和 Apollo 的 ApolloGraphql。 而这两个我更推荐你使用后者。

如果你用到了 ApolloGraphql， 那么一个调试工具肯定能让你事半功倍，这个 Chrome 调试工具请收好。

Chrome 商店地址：<https://chrome.google.com/webstore/detail/apollo-client-developer-t/jdkknkkbebbapilgoeccciglkfbmbnfm/related>

### 2020-05-08\[教程]

课程内容与赫尔辛基大学计算机科学系的 2020 春季课程【全栈课程】相同，含金量比较高。 我大概看了下，内容写的还不错。相信看完之后， 简单的全栈开发已经难不倒你了。

![](https://p.ipic.vip/691lfl.jpg) （部分课程）

这门课程`从基本的 web 开发到 react，redux，typescript，graphql 一应俱全，一共是 10 章内容`。该课的合作伙伴和友情机构包括 Houston Inc, Terveystalo, Elisa, K-ryhmä, Unity Technologies 以及 Konecranes。这里可以观看由我们的合作伙伴和友情机构的多为专家提供的与本门课程主题相关的客座讲座。

地址：<https://github.com/fullstack-hy2020/fullstack-hy2020.github.io>

### 2020-05-07\[网站]

今天给大家推荐的是一个薪资职级统计网站。这里可以看到各大公司（包括金融公司和科技公司）的薪水情况，以及职级对比情况。

这个网站有两个特点：

* 数据相对真实，这个是听朋友说的。
* 数据比较全。 除了基础薪资（Base）还有签字费（Sign-On），股票等信息。
* 可以很方便对比各个公司的职级。

![](https://p.ipic.vip/3sy4l8.jpg) （薪资数据经常会更新，实时性好）

![](https://p.ipic.vip/f5td66.jpg) （收录了很多大公司，国内国外都有）

![](https://p.ipic.vip/p3o68v.jpg) （公司职级对比）

地址：<https://www.salarytics.com/>

### 2020-05-06\[工具]

今天给大家分享的是 mac 上的一款截图工具，这是我目前见过的最好用的截图工具。 官方的话说“其不仅是一个截图工具，而是一个工作流”。

主要功能有截图（包含滚动截长图），标注，录屏，截图置顶，一键分享，云端存储等。

唯一的“缺点”就是，这个软件是收费的。

官网： <https://getcleanshot.com/>

### 2020-05-04\[仓库]

今天给大家分享的是一个“换脸”工具。其基于著名的人工智能框架 tensorflow 生成。 可以将照片，影片中中的人物头像发生变化，变成别人的头像。甚至可以实时处理，这就非常可怕了。图谋不轨的人可以用来发展色情产业，敲诈勒索等等。当然运用得当的话，会产生意想不到的效果，比如给电影人物换脸，每个人可以在看电影的时候将影片中的人物实时换算成任意人物（比如自己）。

![](https://p.ipic.vip/zxi451.jpg)

<https://github.com/deepfakes/faceswap>

### 2020-05-03\[技巧]

今天发现 Github 更新了一个很有意思的功能，据说是为了有时差远程办公的人设计的。

如果用户设置了地理位置，那么将鼠标悬浮到头像上，会显示其当地时间。

![](https://p.ipic.vip/t123aw.jpg)

### 2020-05-02\[技巧]

今天给大家介绍两个 Github 技巧，应该用的人不多。

1. 快捷回复

你可以在 Github 回复他人的时候使用快捷回复的功能，从而更快的进行回复。

![](https://p.ipic.vip/qqoqb8.jpg)

默认只有一条回复， 快捷键是`ctrl + 1` - 插入回复`Duplicate of #`，这个快捷键只有在点击上图红色部分的时候才管用。

1. suggestion

![](https://p.ipic.vip/epia2h.jpg)

如上图在进行 pull request 的 review 的时候，可以点击加号位置，使用类似评论的功能。注意这里多了一个项目，点击可以添加修复建议。

![](https://p.ipic.vip/s39r2i.jpg)

效果如下：

![](https://p.ipic.vip/ed4kqj.jpg)

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2020-04

![](https://p.ipic.vip/oydz5z.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2020-04

### 2020-04-30\[观点]

Web 应用（包括 PC 和移动）变得越来越流行，相对于传统的客户端程序，Web 更加轻量，传播性更强。如今大家可以直接[使用 CodePen 写 Flutter 程序](https://codepen.io/pen?template=LYpGWBx)，在网页上看效果。还有比如实验楼帮我们构建交互式学习环境。 支付宝小程序 IDE 如今也可以在[Web 浏览器端](https://minicode.alipay.com/ide/wVYQPjr71)直接运行。 相信之后，Web 端肯定会发展地越来越好。期待更多标准规范的推出，以及各个厂商的积极合作，推动标准化落地。

### 2020-04-29\[网站]

对于前端安全，量化构成“良好开发实践”的内容可能比较困难，但是可以相当准确地度量安全头的强度。就像我们使用 Lighthouse 获取性能，SEO 和可访问性分数一样，我们可以使用工具，这个工具可以根据当前响应头获取安全分数。

![](https://p.ipic.vip/ds83v6.jpg)

网址： <https://securityheaders.com>

### 2020-04-28\[仓库]

这个是一个基于 Chrome Develop Protocl（简称 CDP）的工具， 可以帮你管理多种服务，包括 NetWork，Page（功能类似 Chrome 开发者工具）。

业界很多工具，比如 Puppeteer 也是基于 CDP 完成的。 值得注意的是，其有多种实现，可以作用在不同的浏览器，只要浏览器实现了 CDP 规定的接口即可。如果没有实现，那么你需要做一个代理进行格式转换。

![](https://p.ipic.vip/yi2idd.jpg) （不同实现）

![](https://p.ipic.vip/rfnuqc.jpg) （API 种类）

<https://github.com/cyrus-and/chrome-remote-interface>

### 2020-04-27\[好文]

这篇文章是 Puppeteer 的实战文章。 从十个具体的例子入手，带你了解 Puppeteer 应该如何使用。包括：

* 网页截图或者生成 PDF
* 爬取 SPA 或 SSR 网站
* UI 自动化测试，模拟表单提交，键盘输入，点击等行为
* 捕获网站的时间线，帮助诊断性能问题
* 创建一个最新的自动化测试环境，使用最新的 js 和最新的 Chrome 浏览器运行测试用例
* 测试 Chrome 扩展程序

<https://zhuanlan.zhihu.com/p/76237595>

### 2020-04-26\[仓库]

之前面试过一些人，问过一个问题“如何在 React 应用中使用 Vue 组件？”，“类似 Remaxjs 这种运行时跨端的原理是什么？”。

大家也可以思考下这几个问题。当然这个问题的答案相对比较宽泛，并且需要自己来做一些权衡。其中针对 API 进行一些定制是一个思路。拿 React 来说，它有一个渲染器的包，用户可以通过这个包定制端的概念，从而理论上让 React 可以运行在任何端。 不过这个包，目前还在实验阶段，如果要使用的话，需要冒一定的风险，因此不建议生产环境直接使用。

![](https://p.ipic.vip/ip80xm.jpg)

![](https://p.ipic.vip/ybmn6y.jpg)

仓库地址： <https://github.com/facebook/react/tree/master/packages/react-reconciler>

这里还有一份介绍的视频演讲资料。 [Building a Custom React Renderer | Sophie Alpert - YouTube](https://www.youtube.com/watch?v=CGpMlWVcHok) 。是在 React Conf 上进行的一个分享。作者带你现场手撸一个 custom renderer。

### 2020-04-23\[研究]

原文标题《Audio samples from "Transfer Learning from Speaker Verification to Multispeaker Text-To-Speech Synthesis"》。

研究人员搭建了一个系统，该系统只需要你提供几秒的语音信息，就能通过神经网络的训练，从而在在许多不同的说话者的声音中生成语音音频。

这是一个划时代的技术。试想，你可以拥有任何人的声音，那么你就可以将某些人作为虚拟人物永远存在这个世界上，比如已故的人，明星等。当然用的不好，也可能会被用到不好的地方。

![](https://p.ipic.vip/lqhp84.jpg)

<https://google.github.io/tacotron/publications/speaker\\_adaptation/>

### 2020-04-21\[仓库]

来了一个挑战 TS 的货？JSMonk/hegel 号称是没有`运行时的类型错误`，上次看到 No Runtime Error 还是在看 Elm，不过 ELM 更牛逼的地方在于， 其是真正的 No Runtime Error。

![](https://p.ipic.vip/wkc0db.jpg)

<https://github.com/JSMonk/hegel>

### 2020-04-20\[好文]

如果你被考察过一些 JS 诡异行为知识，比如让你猜测输出，会不会报错等，那么你很可能有很多疑问“为什么？为什么这么诡异？为什么不同浏览器执行结果还不一样？为什么相同浏览器不同版本执行结果也不一样？”。

要回答这些问题，恐怕仅靠查阅 MDN，是很难查到的。比如 `String.prototype.substring.call(undefined, 2, 4)`会输出什么？ `String.prototype.substring.call(window, 2, 4)`又会输出什么？ 要回答这个问题，最根本的就是查 ECMA 文档，比如上面这个问题， 我就会查到[ecma262/#sec-string.prototype.substring](https://tc39.es/ecma262/#sec-string.prototype.substring)，可以看出 ECMA 给出了我们答案：

![](https://p.ipic.vip/7sm549.jpg)

但是这些符号 - `?`，`!`代表什么？ `RequireObjectCoercible` 和 `ToString()` 是什么？ 很多人是懵逼的，即使你是很熟悉 JS 的各种特性，但是阅读标准或许不是一件容易的事情。 为了方便描述，它掺杂了很多其他内容，比如一些记法（Notation）。如何阅读 ECMA 文档呢？

我这里推荐三个资料：

* [dmitrysoshnikov](http://dmitrysoshnikov.com/)
* [How to Read the ECMAScript Specification(内容较少，还在更新中，不过似乎断更一年了)](https://timothygu.me/es-howto/)
* \[V8 团队出品的系列文章]

1. [understanding-ecmascript-part-1](https://v8.dev/blog/understanding-ecmascript-part-1)
2. [understanding-ecmascript-part-2](https://v8.dev/blog/understanding-ecmascript-part-2)
3. [understanding-ecmascript-part-3](https://v8.dev/blog/understanding-ecmascript-part-3)

### 2020-04-17\[工具]

前端基本都是对前端应用进行打包，生成静态资源。那么如何将你的 NodeJS 应用打包，从而可以在没有 Node 环境的地方直接使用呢？这里介绍一个由鼎鼎大名的 ziet 开发的工具`pkg`，这里有一篇介绍的中文文章 [《把你的 NodeJS 程序给没有 NodeJS 的人运行》](https://github.com/75team/w3c/blob/master/articles/20191113_liuguanyu_%E6%8A%8A%E4%BD%A0%E7%9A%84NodeJS%E7%A8%8B%E5%BA%8F%E7%BB%99%E6%B2%A1%E6%9C%89NodeJS%E7%9A%84%E4%BA%BA%E8%BF%90%E8%A1%8C.md)，也可以看下。

<https://github.com/zeit/pkg>

### 2020-04-16\[仓库]

现在公司会做一些大屏数据展示的功能。目前我们使用的是 echarts，会基于他们做二次封装。但是有一些东西做起来还是比较繁琐的。这个仓库提供了更加丰富的封装功能，更加容易上手使用。这是 一个 Vue 数据可视化组件库（类似阿里 DataV，大屏数据展示），提供 SVG 的边框及装饰、图表、水位图、飞线图等组件，简单易用，长期更新(React 版已发布)。

<https://github.com/DataV-Team/DataV>

### 2020-04-15\[好文]

AntV 是如何处理 Canvas 的局部刷新的？看完这个你就明白了，绝对干货满满～

<https://www.yuque.com/antv/blog/ydsuqn>

### 2020-04-14\[仓库]

一个可视化图标网站，可以在线拖拽生成图表，支持多种图表类型。

![](https://p.ipic.vip/0bz244.jpg)

![](https://p.ipic.vip/z1ekjs.gif)

<https://github.com/dongsuo/vue-data-board>

### 2020-04-10\[好文]

来自 Chrome 官方人员最最权威的宏任务，微任务指南。 这篇文章是目前我看过最好的讲解《浏览器事件循环，宏任务，微任务》的文章。

![](https://p.ipic.vip/tdy7r8.jpg)

他的教程的特点是可以可视化交互式学习，真的很赞：

![](https://p.ipic.vip/vow55z.jpg)

<https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/>

### 2020-04-09\[好文]

Nginx 作为一个优秀的反向代理，常常活跃于各大公司，甚至有的大公司会对 nginx 做二次开发。Nginx 里面的配置很多，每次学习一点点，日积月累，你也能变成 nginx “配置专家”。

今天我们来看一篇来自网易游戏运营平台发布的 nginx 中的“失败重试机制”。

<https://mp.weixin.qq.com/s/yDOXb9diMFcmbKhc58oH4w>

### 2020-04-08\[网站]

大家经常会在分享大会上看到过一些高大上的 PPT，这些看起来高大上 PPT 除了内容本身优质之外，还有一个共同点，就是善于运用图和表。之前我分享过一篇文章 - [累死累活干不过一个写 PPT 的](https://lucifer.ren/blog/2019/12/11/ppt-data/)。里面讲到了如何讲数据说话，将自己的成果通过可视化的方式展示出来，其中也推荐了几个工具。今天再向大家推荐一个相对来说“更加面向新手，入门更容易”的产品，虽然操作简单，但实际上其自定义设置也非常丰富。

![](https://p.ipic.vip/41tezk.gif)

对于常见的图表可以直接使用，并且支持导入数据，多种自定义设置等。

![](https://p.ipic.vip/o4nxz8.gif)

![](https://p.ipic.vip/f4l9q0.jpg)

地址： <https://app.flourish.studio/projects>

### 2020-04-07\[好文]

> 清明节后的第一天。

我想大家应该都听过 PWA。但是真正将 PWA 用到实际项目中的很少，更多的是网上看的一些资料。这里有一份教程，这个教程特点是一步步带你构建 PWA 应用，相信你跟着作者一起做一遍，一定会学到更多。

地址： <https://blog.logrocket.com/how-to-build-a-progressive-web-app-pwa-with-node-js/>

### 2020-04-03\[工具]

新一代的前端打包工具，采用 Go 编写，由于采用 Go 编写，而不是 JavaScript，因此性能相对较好，下面是一个 benchmark 对比图：

![](https://p.ipic.vip/thepp1.jpg)

只不过这个仓库目前只有一人维护，因此更新可能会是个问题，大家不妨先关注一下。

![](https://p.ipic.vip/qe8u05.jpg)

地址： <https://github.com/evanw/esbuild>

### 2020-04-02\[好文]

如果你想知道 ES 最新标准的细节知识，比如我想知道 ES10 中某一个方法究竟是做什么的。那么最好的方法莫过于直接查看 ECMA 规范。但即便你是一个 JS 老手，在没有准备知识的情况下，直接啃规范还是很吃力的。因为规范中会有大量的术语和记法。本系列教程由 V8 团队执笔，帮你看懂 ECMA 规范。

地址： <https://v8.dev/blog/understanding-ecmascript-part-3>

### 2020-04-01\[好文]

WebAssembly 是一种一种新的“语言”。允许开发者使用 C/C++等转化为 JS 可以直接调用的形式，由于是二进制形式，因此相比直接使用 JS 实现，性能更好。

![](https://p.ipic.vip/f0ckac.jpg)

本文（英文）详细解释了如何使用 WebAssembly 来进行图片处理。实际上基于 WebAssembly 来实现 webp，视频编解码等都在业界有所实现。这篇文章相对其他而言有两个特点： 简单，实用。

文章地址： <https://blog.logrocket.com/image-styling-and-filters-using-webassembly/>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2020-03

![](https://p.ipic.vip/jo8tae.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2020-03

### 2020-03-31\[好文]

gRPC 使用 protobuf 进行数据封装(序列化和反序列化)，同时使用 http2 进行数据传输，为什么不直接基于 TCP 传输呢？grpc 究竟和其他 rpc 框架，比如阿里的 dubbo，facebook 的 Thrift 有什么区别？这篇文章带你了解一下。

地址：<https://mp.weixin.qq.com/s/GuMp4Z8oJv9K\\_MJxMptsSA>

### 2020-03-30\[好文]

《吊打面试官》系列 Node.js 全栈秒杀系统。这篇文章非常详细地讲述了如何使用 nodejs 构建一个秒杀系统，文中提到的知识点，我也经常在面试中向候选人提问。

![](https://p.ipic.vip/5nzrs3.jpg)

<https://mp.weixin.qq.com/s/LoRr76smB-M8sNp-85wdqg>

### 2020-03-27\[库]

今天给大家推荐的是一个图片上传组件 - uppload。支持：

* 20 多种选择文件的方式
* 10 种编辑文件的方式
* 支持自定义将文件发送到服务端
* 主题
* 插件
* 。。。

更重要的是其源码写的很赞，模块划分，代码解耦，以及单元测试都非常值得学习， 感兴趣的可以研究一下。

![](https://p.ipic.vip/48zjfm.jpg)

<https://github.com/elninotech/uppload>

### 2020-03-26\[好文]

一个外国游客来中国广州游玩，定了一家酒店，但是通过 Google 地图去找，离目的地相差几英里，原因在于 Google 使用的地图坐标系统是 WGS-84 ，而国内的比如 Baidu 地图可以很好的显示，因为其用的是 GCJ-02。一句话总结来说：

![](https://p.ipic.vip/wys4ck.jpg)

原文地址：<https://abstractkitchen.com/blog/a-short-guide-to-chinese-coordinate-system/>

### 2020-03-25\[工具]

微软开源的 Puppeteer 的衍生项目 `Playwirght`，或许能够替代 Puppeteer。 和 Puppeteer 相比，其有以下特点：

* 弥补了 Puppeteer 的平台局限性，为所有热门渲染引擎提供类似的功能
* 和 Puppeteer 基本兼容，用户可以无痛（低痛）迁移
* 使用了隔离的 BrowserContext，而不是像 Puppeteer 一样共用一个 defaultBrowserContext。

项目地址： <https://github.com/microsoft/playwright>

### 2020-03-24\[工具]

如果你是学生党或者学术党，需要经常查找文献，那么一个文献管理工具就显得很有必要。这里推荐一个工具：Zotero。

![](https://p.ipic.vip/k3pn0x.jpg)

地址： <https://www.zotero.org/>

### 2020-03-23\[好文]

Elasticsearch 已经火了很多年了，现在依然可以见到他们活跃的身影。笔者公司就在用，我也参与了相关开发，其使用起来很简单，但是精通起来却不容易。而很多人正好对其不熟悉，这里正好有一个非常简单易懂的中文教程：《Elasticsearch 学习：入门篇》

地址： <https://www.cyhone.com/articles/introduction-of-elasticsearch/index.html>

### 2020-03-20\[工具]

这是一个在线服务，用来生成几何占位符，类似于 Github 的默认头像。

![](https://p.ipic.vip/ndcc71.jpg) （Github 的默认头像）

使用方式也很简单，并支持多种参数：

```html
<img
  src="https://generative-placeholders.glitch.me/image?width=600&height=300&img=01"
/>
<img
  src="https://generative-placeholders.glitch.me/image?width=600&height=300&img=02"
/>
<img
  src="https://generative-placeholders.glitch.me/image?width=600&height=300&img=03"
/>
```

地址： <https://generative-placeholders.glitch.me/>

### 2020-03-19\[好文]

政采云的前端 leader（花名堂主） 的一个关于前端基建的分享《堂主 - 如何推动前端团队的基础设施建设 | 7500 字》。如果你的团队也在做基础建设，那么或许可以帮到你，至少可以提供一些思路。

地址： <https://mp.weixin.qq.com/s/2VSa3xBpy5St8G1v0RjW9g>

### 2020-03-14\[仓库]

这里有一个很有意思的仓库，专门用来做远程面试，支持白板代码，视频通话，回放等功能。效果类似之前我在使用的 showmebug。

地址： <https://github.com/AgoraIO-Community/2019-Hackathon-Works-CoderLane/blob/master/README.ZH.md>

### 2020-03-13\[仓库]

一个可以在浏览器端压缩图片的库，从而减少网络传输，进而减小服务端的压力。

地址： <https://github.com/Donaldcwl/browser-image-compression>

### 2020-03-12\[仓库]

一个获取本机网卡信息的库，可以获取到 IPv4，IPv6 以及 MAC 地址。

地址： <https://github.com/scravy/node-macaddress>

### 2020-03-11\[仓库]

著名的知识管理平台《羽雀》就是从最开是的 CodeMirror 迁移到了 slate，slate 其实就是一个 Markdown 编辑器。

> 但是羽雀最终还是转向自研道路，基于浏览器的 contenteditable 实现富文本编辑器，通过 canvas 实现表格编辑器，通过 SVG 实现思维导图编辑器。

地址：<https://github.com/slatedocs/slate>

### 2020-03-10\[仓库]

一个可以制作类似“Github Project”效果的库。

![](https://p.ipic.vip/10jcgf.jpg)

地址： <https://github.com/lourenci/react-kanban>

### 2020-03-09\[网站]

之前给大家推荐了几个在线练习的网站，有算法的，有正则的，还有 git 的。今天介绍一个练习 SQL 语句的：

SQLZOO 是一款很好用的 SQL 练习网站，这里都是比较常用的 SQL 命令。不仅对每个命令的用法有详细解释，每个专题后面还有题目。循序渐进，LeetCode 也有 SQL 相关的题目，不过难度一般比较大，建议大家 把 SQLZOO 刷完基础 SQL 命令再去 LeetCode 刷 SQL 题目。

网站地址：<https://sqlzoo.net/>

### 2020-03-05\[好文]

Base64 编/解码器有不同实现，有的不相互兼容，如果使用了不兼容的实现，就会有 bug，比如典型的报错“Illegal base64 character a”。本文详细介绍了产生这个问题的原因，文章通俗易懂，适合新手阅读。

[记一个 Base64 有关的 Bug](https://mp.weixin.qq.com/s/SfFmct12UBc7BLdNUmBBKg)

### 2020-03-03\[好文]

前端新建一个项目的时候，需要用到很多配置文件，通常是以。开头，因此我们也叫 dotfiles。这篇文章介绍了前端开发常见的 dotfiles，以及其简单用法，或许可以给你一点参考。而且我在我的 [mac 装机教程](https://github.com/azl397985856/mac-setup) 中也提到了 dotfiles，只不过那边的 dotfiles 更为广泛。

文章地址： <https://lyreal666.com/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E9%85%8D%E7%BD%AE-react-typescript%EF%BC%88%E4%B8%80%EF%BC%89%EF%BC%9Adotfiles/>

### 2020-03-02\[好文]

原文标题《使用 TypeScript 开发 Web 应用的最佳实践》。文中基本将 TS 在日常开发中的姿势都提到了，并且总结了很多坑点，并且给出了自己的探索和思考。

![](https://p.ipic.vip/uqhezg.jpg)

![](https://p.ipic.vip/s87hyj.jpg)

文章地址：<https://yrq110.me/post/front-end/best-practice-of-typescript-in-webapp-developing/?hmsr=toutiao.io\\&utm\\_medium=toutiao.io\\&utm\\_source=toutiao.io>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2020-02

![](https://p.ipic.vip/q7kph0.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2020-02

## 2020-02-29\[仓库]

四年一次的 2 月 29 号哦！

今天给大家分享的是一个 scala to js 的编译器，允许你将 scala 代码转化为 js 代码，覆盖了 ES6，DOM 操作，单元测试等众多内容。

仓库地址： <https://github.com/scala-js/scala-js>

## 2020-02-28\[工具]

如果你想访问 google 商店，gmail，使用 google 搜索，但是不想用 vpn，那么`谷歌访问助手`或许可以帮到你，这适合一些轻量科学上网需求用户。

仓库地址：<https://github.com/haotian-wang/google-access-helper>

## 2020-02-27\[网站]

一个交互式 SQL 学习网站。在这里你扮演一个侦探，根据线索和警察局的数据库，使用 SQL 语句逐步缩小范围，最后找到真凶。

![](https://p.ipic.vip/aac5or.jpg)

网站地址：<http://mystery.knightlab.com/walkthrough.html>

## 2020-02-26\[网站]

培养一门业务爱好是很重要的。但是很多人不知道要培养什么样的兴趣。这个网站就是为了解决这个问题而产生的。每次访问该网站，都会随机产生一个兴趣。来看下有没有适合你的吧！

网站地址： <http://findyourselfahobby.com/index.php>

## 2020-02-25\[网站]

有时候你想知道 LeetCode 中的题目是哪个公司出的。在 LeetCode 我们需要订阅会员才能看，为了看这个专门订阅会员可能不太值。 这里教你两种方式：

* 使用 [leetcode for vscode 插件](https://marketplace.visualstudio.com/items?itemName=shengchen.vscode-leetcode)

![](https://p.ipic.vip/yk9w47.jpg)

* 使用 <https://leetcode.jp/problemdetail.php?id=1334>

![](https://p.ipic.vip/s80xbu.jpg)

你只需要将上面的 id 改成你想看的 LeetCode 题号即可。这个网站还有一个用途，那就是可以查看被锁定的题目。

## 2020-02-24\[仓库]

你如果在做 OCR， 并且技术栈是 js ， 那就不要错过。其可以识别超过 100 种自然语言，目前有 2w 多的 star ✨。

仓库地址： <https://github.com/naptha/tesseract.js>

### 2020-02-23\[框架]

大家如果做过一些图表需求，可能会用过类似 antV，echarts 这样的图表库。这些库帮我们封装了一些常见的图表，比如折线图，饼图，地理图等等。 但是当我们真正想去深度定制的时候，会发现非常困难。如果想实现像素级控制几乎不可能。

微软出了一套图形语言 chart-parts，很好地解决了这个问题。地址：<https://microsoft.github.io/chart-parts/documentation/tutorial> 。 目前其官方提供了 react 版本：

![](https://p.ipic.vip/94yhum.jpg)

![](https://p.ipic.vip/6r5m5a.jpg)

可以看出实现同一个功能，代码量显著增加，这是灵活领和可控性之间的平衡。因此当你决定使用它的时候，一定要仔细做好评估，是否适合你。

### 2020-02-22\[工具]

age 是一款加解密命令行工具，类似 ssh，我们可以生成自己的公钥，并基于自己的公钥加密，使用自己的私钥进行解密，age 也可以和 ssh 进行很好的合作。

使用口令对文件进行加密是常见的做法，而现在我们可以对信息进行一次公钥加密，这样任何人除非获取到你的私钥才能破解，这要比口令要安全。另外我们也可以基于此实现一个聊天，文件传输程序，并基于 age 来实现加解密，增加安全性，当然如果要做的话这中间的性能损耗也是一个需要考虑的问题。

仓库地址： <https://github.com/FiloSottile/age>

### 2020-02-21\[工具]

有时候我们开发了一个应用，想给别人看下效果，而这个人不和你一个局域网，并且你没有公网 IP。那么你可以使用一种叫做内网穿透的技术，其中比较有名的有花生壳，如果不熟悉内网穿透的可以看下这篇科普文 <https://zhuanlan.zhihu.com/p/30351943。> 而我现在使用的是 ngrok：

![](https://p.ipic.vip/kqbamx.jpg)

ngrok 主页： <https://ngrok.com/>

### 2020-02-20\[仓库]

STPyV8 是一个允许你在 JavaScript（基于 V8） 和 Python 之间互操作的仓库，STPPyV8 是 fork 自 PyV8 项目，目的是为了跟进最新的 V8 和 Python3。

地址： <https://github.com/area1/stpyv8>

### 2020-02-19\[仓库]

NodeTube 是一个使用 node 构建的 用来取代 youtube 的客户端，支持私有化部署。

技术栈：

* Node.js 8.0+
* MongoDB
* Redis
* ffmpeg

你可以使用 NodeTube + ngrok 快速搭建一个公网可以访问的类 Youtube 网站。

仓库地址： <https://github.com/mayeaux/nodetube>

### 2020-02-18\[好文]

AWS 是什么？都有哪些功能？如果你不知道，那么这篇文章可以帮到你。这篇文章很详细地讲解了 AWS 提供的服务。

![](https://p.ipic.vip/ku102n.jpg)

文章地址： <https://blog.logrocket.com/aws-services-cheat-sheet/>

### 2020-02-17\[好文]

如果你还没听过或者不知道 JWT 是干嘛的，那么你可以看下这篇文章《一分钟简单了解 JSON Web Token》，当然这和很多入门科普文章一样缺乏深度，但是对你完全不了解的人来说还是很友好的。

文章地址： <https://mp.weixin.qq.com/s/i3UbVlVfa--vnqg697xgRQ>

### 2020-02-14\[工具]

祝大家情人节快乐。 🌹🌹🌹🌹🌹🌹🌹🌹 哦，不对应该是 😷😷😷😷😷😷😷😷😷😷😷

今天介绍一个脑洞很大的 Chrome 扩展程序， 可以在你购物的时候帮助你找到优惠券。只是这款扩展不支持国内的网站，感觉这一个商机呢？ 感兴趣的小伙伴可以做一下。地址：<https://help.joinhoney.com>

### 2020-02-13\[工具]

对于 serverless，很多厂商都在做。而每个云厂商都有自己的 cli 工具，各个标准都不统一，也没有什么规范。 这个工具将其进行了统一，它支持 aliyun ， aws 众多云厂商。地址：<https://github.com/serverless/serverless>

### 2020-02-12\[网站]

今天推荐给大家一个交互式学习网站，会给你准备一些环境，这样就不需要在本地安装环境了，并且还可以检测你的操作是否正确等，类似国内的实验楼。

![](https://p.ipic.vip/nydhmn.jpg)

![](https://p.ipic.vip/pzlx56.jpg)

地址： <https://www.katacoda.com>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2020-01

![](https://p.ipic.vip/95kx1h.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2020-01

### 2020-01-23\[资料]

尤雨溪在多伦多的演讲《Vue 3.0 设计原则》对于想要学习 Vue3.0 或者想要直接从零开发 Vue3.0 的人来说，绝对是必读的。PPT 内容不多，几分钟就可以读完，不建议看视频，视频大概有 50 多分钟。

PPT 地址： <https://docs.google.com/presentation/d/1r0HcS4baHy2c106DsZ4jA7Zt0R9u2MnRmmKIvAVuf1o/edit#slide=id.p>

### 2020-01-22\[软件]

安卓软件的开屏广告很烦人，严重影响效率。这里推荐一个安卓 APP 可以改善这种情况, 并且不需要 root，只需要开启权限即可。注意它不是万能的，不过实际使用情况来看，还是有用的。

地址： <https://www.coolapk.com/apk/me.angeldevil.autoskip>

### 2020-01-21\[好文]

可访问性真的是一个非常重要的东西，尤其是对于有障碍人士。但是整个行业在这方面做的还完全不够，不管是技术能力，还是重视程度上。

比如我在使用钉钉软件的时候，他们的快捷键很少，这一点非常困扰我，当然类似的应用还有很多。我觉得整个行业应该注重起来这一块，将可访问性做好，要知道这也是用户体验中很重要的组成。这里有一篇文章 《Debugging your application for accessibility》， 从浅层次上讲解了可访问性的内容，以及基本实践，同时还推荐了一个叫 axe 的 chrome 扩展工具帮助你分析网页存在的可访问性问题，类似于 网页性能分析之于 lighthouse。

文章地址： <https://blog.logrocket.com/debugging-application-accessibility/>

### 2020-01-20\[网站]

我平时有 RSS 阅读的习惯，我使用的 Feedly 管理订阅内容。但是有的网站本身并不支持 RSS 订阅。那么一种黑科技，就是使用第三方服务帮我们转换一下，生成订阅。原理很简单，就是轮训内容变化，如果变化就通知你。当然前提你要知道“如何判断发布了新内容”，这部分 feed43 做的不错。我们利用 Feed43，将任意网页制作成 RSS 订阅源。 这里有一篇少数派的文章，大家可以参考一下： <https://sspai.com/post/34320>

你也可以使用 rsshub 来做同样的事情，rsshub 支持私有化部署，地址： <https://docs.rsshub.app/。>

### 2020-01-19\[网站]

给大家介绍一个 mac 软件下载网站，效果你懂的。类似的网站还有 xclient.info。

地址：<https://www.macappdownload.com/>

### 2020-01-17\[工具]

如果你想开发一个 VSCode 插件，那么一个脚手架是有用的。我推荐使用官方的脚手架工具。顺便再推荐一个 vscode 插件开发指南，来自 sorrycc，地址 <https://www.yuque.com/docs/share/cf6d9191-be02-4644-aef5-afc2f2f38297>

![](https://p.ipic.vip/fuczut.jpg)

地址： <https://github.com/Microsoft/vscode-generator-code>

### 2020-01-16\[工具]

不改变任何功能的情况下给你的 docker image 瘦身。

Github 地址： <https://github.com/docker-slim/docker-slim>

### 2020-01-13\[插件]

今天推荐两个关于 Github 的 chrome 插件。

一个是用来查看 Github 提交历史的，名字是`Git History Browser Extension`，安装之后 git 文件右上角信息会多一个按钮。

![](https://p.ipic.vip/l7flho.jpg)

点开之后是这种画风：

![](https://p.ipic.vip/vani9o.jpg)

另外一个插件是`OctoLinker`。这个插件你可以用来方便地进行文件跳转。

![](https://p.ipic.vip/07szw7.jpg)

### 2020-01-09\[好文]

如果你关注 Node.js 社区，那么你一定记得 Node.js v12 一个非常重磅的功能就是，内核的 HTTP Parser 默认使用 llhttp，取代了老旧的 http-parser，性能提升了 156%。

但知其然也要知其所以然，llhttp 是如何做到这一点的呢？《llhttp 是如何使 Node.js 性能翻倍的？》进行了详细的阐述。

地址： <https://zhuanlan.zhihu.com/p/100660049>

### 2020-01-08\[好文]

昨天介绍了《当你在浏览器中输入 google.com 并且按下回车之后发生了什么？》，今天推荐一篇《图解浏览器的基本工作原理》。 讲的内容主要是浏览器渲染相关的，让你在更大的视角，更细的粒度了解浏览器原理，最可贵的是文章通俗易懂，图文并茂，对于想了解浏览器原理而又找不到好的入门资料的同学来说很有用。

其中还提到了很多延伸知识，比如事件冒泡更微观角度是什么？事件的 passive：true 做了什么？为什么很多时候我们绘图不流畅以及如何实现平滑绘图？

```js
window.addEventListener("pointermove", (event) => {
  const events = event.getCoalescedEvents();
  for (let event of events) {
    const x = event.pageX;
    const y = event.pageY;
    // draw a line using x and y coordinates.
  }
});
```

(使用 `getCoalescedEvents` API 来获取组合的事件，从而绘制一条平滑的曲线)

文章地址： <https://zhuanlan.zhihu.com/p/47407398>

### 2020-01-07\[好文]

或许目前实际上最全的《当你在浏览器中输入 google.com 并且按下回车之后发生了什么？》。文档内容不仅局限于 DNS，TCP，HTTP，CDN。发送 HTML，解析 DOM 等过程，甚至包括了物理键盘和系统中断的工作原理，系统中断，ARP 等等更为详细的内容。

![](https://p.ipic.vip/soq02d.jpg)

地址： <https://github.com/skyline75489/what-happens-when-zh\\_CN>

### 2020-01-06\[框架]

前端测试正在变得越来越重要，之前也写了一篇文章[前端测试](https://github.com/azl397985856/frontend-test)，那么拥有一个顺手的测试框架显得越来越重要。

我个人目前在使用的测试框架是 Jest，除了 Jest 还有很多优秀的测试框架，知己知彼，百战不殆。我们看看下：

* Mocha：非常老牌的测试框架，使用 Jest 之前我在用
* Enzyme：一个 React 测试框架，后期我不再使用了，而是转向 Jest + react-dom/test-utils
* Ava
* Jasmine
* Cypress

另外你做自动化测试的话，推荐使用 Puppeteer，如果你做组件测试的话可以考虑 Jest 的快照或者 StoryBook（一个 2015 年以来一直关注并且看好的一个框架）。

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2019-12

![](https://p.ipic.vip/u6q9jv.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

> 项目主页维护当前月份的内容，想看往期内容，可以翻到下方历史汇总部分，然后选择自己感兴趣的月份点进去即可。

## 2019-12

### 2019-12-31\[见闻]

今天是我的生日，祝我生日快乐 🎂 ～～～～

一般公司的卫生间贴的都是公司信息或心灵鸡汤，但是谷歌卫生间贴的是`如何找到代码 Bug`，不得不感叹“这实在是太硬核了”！

![](https://p.ipic.vip/bfit09.jpg)

![](https://p.ipic.vip/0gd54s.jpg)

### 2019-12-24\[技巧]

今天是平安夜，苹果 🍎 和圣诞礼物 🎁 都收到了么？

今天给大家推荐的是一个 linux 中非常常见的命令 `grep` 的常用用法。

图版本：

![](https://p.ipic.vip/9e2qrv.jpg)

文字版本：

Matches patterns in input text.Supports simple patterns and regular expressions.

* Search for an exact string: grep search\_string path/to/file
* Search in case-insensitive mode: grep -i search\_string path/to/file
* Search recursively (ignoring non-text files) in current directory for an exact string: grep -RI search\_string .
* Use extended regular expressions (supporting ?, +, {}, () and |): grep -E ^regex$ path/to/file
* Print 3 lines of \[C]ontext around, \[B]efore, or \[A]fter each match: grep -C|B|A 3 search\_string path/to/file
* Print file name with the corresponding line number for each match: grep -Hn search\_string path/to/file
* Use the standard input instead of a file: cat path/to/file | grep search\_string
* Invert match for excluding specific strings: grep -v search\_string

### 2019-12-23\[学习方法]

很多人问我如何保持高效率。 首先要说的是我的效率并不是很高，这也就是我为什么还在不断学习提高效率的原因之一。那么既然有人问了我就班门弄斧回答一下，大家有什么好的方法和技巧欢迎提出来交流。

为了让自己保持高效率，我自己开了一个仓库记录了自己保持“高效率”的方式。希望可以给大家启发，本仓库内容持续更新～

仓库大纲：

![](https://p.ipic.vip/71p5ni.jpg)

仓库截图：

![](https://p.ipic.vip/nqiimi.jpg)

仓库地址：<https://github.com/azl397985856/To-Be-Productive>

### 2019-12-20\[新闻]

Facebook 发布 Hermes， 一个新的专门用于 React Native 的 JS 引擎。

文章地址：<https://facebook.github.io/react-native/blog/2019/07/17/hermes>

### 2019-12-19\[好文]

很多高级语言有自动的垃圾回收器，比如 JS，JAVA，Go 等。其会自动地进行垃圾回收工作，而不必像诸如 C 和 C++那样手动分配和清除内存。

对于 old space 的垃圾回收算法有一个是标记清除，从一个根对象开始对于所有可达的对象进行标记，剩下的就是不可达的，我们将其进行清除，本文讲解了三色标记法（黑色，白色和灰色），三色标记法本质上进行一次 DFS，并将内存对象分到三个部分，DFS 完成之后清除不可达的内存（白色）。这篇文章以动画形式讲解了三色标记法的具体过程。

文章（《一张图了解三色标记法》）地址：<http://idiotsky.top/2017/08/16/gc-three-color/>

### 2019-12-18\[教程]

哈弗大学 CS50 系列，内容持续更新，现在最新的是 2019 年。 你可以跟着教程来重新学习 CS 基础。

![](https://p.ipic.vip/9rrggw.jpg)

地址：<https://cs50.harvard.edu/college/>

### 2019-12-17\[网站]

Learn Git Branching 是一个交互式学习 Git 的网站。沙盒里你能执行相应的命令，还能看到每个命令的执行情况； 通过一系列刺激的关卡挑战，逐步深入的学习 Git 的强大功能，在这个过程中你可能还会发现一些有意思的事情。

![](https://p.ipic.vip/s0e35u.jpg)

![](https://p.ipic.vip/s389jc.jpg)

地址： <https://learngitbranching.js.org/>

### 2019-12-16\[新闻]

最新版本的 Chrome 和 Firefo 浏览器取消 EV 证书的显示。

![](https://p.ipic.vip/85srjg.jpg)

![](https://p.ipic.vip/8p40n5.jpg)

只有用户点击了锁 🔒，才会显示出 EV 证书的信息。

![](https://p.ipic.vip/upqiv2.jpg)

为什么会这样？想要知道答案的可以点击原文阅读。

原文地址：[Chrome and Firefox Changes Spark the End of EV Certificates](https://www.bleepingcomputer.com/news/software/chrome-and-firefox-changes-spark-the-end-of-ev-certificates/)

### 2019-12-13\[类库]

loki 是一个 React Storybook 组件回归测试工具。React Storybook 是一个我 15 年就开始关注的一个工具，本身的设计思想我比较喜欢。现在除了支持 React，也支持 React Native，Vue，Angular 等，甚至最新的 Svelte 也支持。

loki Github 地址： <https://github.com/oblador/loki>

### 2019-12-12\[技巧]

Angular 的 Commit Message Conventions 是一套很流行的 Commit Message 规约。简单方便，一目了然，更重要的是这种约定化如果形成一种默契，不管对于之后查看，还是生成各种外部资料（比如 CHNAGELOG）都是非常方便的。

![](https://p.ipic.vip/hpabfc.jpg)

详细信息： <https://gist.github.com/stephenparish/9941e89d80e2bc58a153>

相关工具也有很多，我个人使用的是[Commitizen](https://github.com/commitizen?type=source)

### 2019-12-11\[好文]

文章标题 《花椒前端基于 WebAssembly 的 H.265 播放器研发》，本文从背景介绍，技术调研，实际方案到最后的实践效果，完整地讲述了通过 `wasm` 将 H.265 应用到不支持其的浏览器的过程。干货满满，其架构图画的也是我比较喜欢的风格。

![](https://p.ipic.vip/mjubl8.jpg)

文章地址： <https://zhuanlan.zhihu.com/p/73772711>

### 2019-12-10\[技巧]

我们有时候需要在终端访问一些国外的资源。我目前采取的措施主要是给终端设置 proxy。

```
alias proxy='export all_proxy=socks5://127.0.0.1:1086'
alias unproxy='unset all_proxy'
```

其中`socks5://127.0.0.1:1086`是我的本机的正向代理地址。

如下是使用效果： ![](https://p.ipic.vip/jhy93x.jpg)

如图显示我们代理成功了，而且我们可以方便的在不想要代理的时候去掉代理。

### 2019-12-09\[类库]

对于前端，我们经常需要将组件进行可视化的展示。在 Vue 中，我们通常会用 [docsify](https://github.com/docsifyjs/docsify) 或者 [vuepress](https://github.com/vuejs/vuepress) 等。而对于 react 比较有名的有 [storybook](https://github.com/storybookjs/storybook) 和 [docz](https://github.com/doczjs/docz)。

当然这并不是绝对的，比如 storybook 也在支持 vue 和 webcomponents。

### 2019-12-06\[技能]

在分析 CPU、内存、磁盘等的性能指标时，有几种工具是高频出现的，如 top、vmstat、pidstat，这里稍微总结一下:

CPU：top、vmstat、pidstat、sar、perf、jstack、jstat；内存：top、free、vmstat、cachetop、cachestat、sar、jmap；磁盘：top、iostat、vmstat、pidstat、du/df；网络：netstat、sar、dstat、tcpdump；应用：profiler、dump 分析。排查 Java 应用的线上异常或者分析应用代码瓶颈，可以使用阿里开源的 Arthas ，nodejs 应用可以使用 alinode

![](https://p.ipic.vip/mojctf.jpg)

### 2019-12-05\[好文]

如果你想做微前端，一定要能够回答出这 10 个问题。

1. 微应用的注册、异步加载和生命周期管理；
2. 微应用之间、主从之间的消息机制；
3. 微应用之间的安全隔离措施；
4. 微应用的框架无关、版本无关；
5. 微应用之间、主从之间的公共依赖的库、业务逻辑(utils)以及版本怎么管理；
6. 微应用独立调试、和主应用联调的方式，快速定位报错（发射问题）；
7. 微应用的发布流程；
8. 微应用打包优化问题；
9. 微应用专有云场景的出包方案；
10. 渐进式升级：用微应用方案平滑重构老项目。

今天推荐的这个文档，区别与别的微前端文章的点在于其更加靠近规范层面，而不是结合自己的业务场景做的探索。这篇文章来自于阿里团队。

![](https://p.ipic.vip/uoc9pv.jpg)

文章地址： <https://mp.weixin.qq.com/s/rYNsKPhw2zR84-4K62gliw>

### 2019-12-04\[工具]

相信大家使用 shell 的时候，会经常碰到忘记的 option，或者某一个用法记不清楚。遇到这种问题通常我们会用 man 或者命令提供的--help 查看用法。 这里给大家介绍另外一种工具`tldr`, 它是一个将 man page 进行简化，将大家常用的用法总结出来的工具。

安全也非常简单，只需要 `npm install -g`(前提是你必须安装 node)， 如果你不想安装也没有关系，它还提供了[web 版](https://tldr.ostera.io/)。另外你也可以参考这里[定制你的主题](https://github.com/tldr-pages/tldr-node-client#configuration)

![](https://p.ipic.vip/k7vcv6.jpg)

仓库地址： <https://github.com/tldr-pages/tldr>

### 2019-12-03\[技巧]

今天给大家介绍的是`Google高级搜索技巧`。我们经常使用搜索引擎搜索一些东西，不管是遇到问题想寻求解决方案也好，想学习一些新东西也好，掌握一定的搜索技巧是可以让你搜索的过程事半功倍，尤其是常用的技巧一定要记住。

![](https://p.ipic.vip/ivt52q.jpg)

### 2019-12-02\[软件]

我们公司在使用的一个完全开源的堡垒机，是符合 4A 的专业运维审计系统。

![](https://p.ipic.vip/nni6z9.jpg)

![](https://p.ipic.vip/hw7we2.jpg)

![](https://p.ipic.vip/8ffklu.jpg)

地址： <https://github.com/jumpserver/jumpserver>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2019-11

![](https://p.ipic.vip/gybrto.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。。

## 2019-11

### 2019-11-29\[网站]

之前我在每日一题出了一道题[ 2019-08-16 - 怎么在浏览器中操作本地的文件](https://github.com/azl397985856/fe-interview/issues/16)。 一个可行的思路就是在本地创建一个服务器，比如 node 服务器，浏览器操作发送请求到服务器，然后 node 去操作本地文件。

现在 Chrome 支持 native fs api，使得这个过程原生支持，想要体验的可以访问这里 <https://labs.vaadin.com/native-fs/> ， 如果你愿意，你可以将它添加为 Chrome APP。

### 2019-11-28\[工具]

今天给大家推荐的工具是效率类软件 Alfred 的灵魂 workflows（工作流）。

以下是我使用频率比较高的 workflow，使用频率低的会被我定期清理掉。

> 我自己制作的工作流不在这里展示和推荐

![](https://p.ipic.vip/5xi644.jpg)

下载地址：

* [Chrome Bookmarks](https://github.com/azl397985856/daily-featured/blob/master/assets/2019-11/ChromeBookmarks.alfredworkflow)
* [Colors](https://github.com/azl397985856/daily-featured/blob/master/assets/2019-11/Colors.alfredworkflow)
* [Dash](https://github.com/azl397985856/daily-featured/blob/master/assets/2019-11/Dash.alfredworkflow)
* [Kill Process](https://github.com/azl397985856/daily-featured/blob/master/assets/2019-11/KillProcess.alfredworkflow)
* [RamdaDocs](https://github.com/azl397985856/daily-featured/blob/master/assets/2019-11/RamdaDocs.alfredworkflow)
* [TerminalFinder](https://github.com/azl397985856/daily-featured/blob/master/assets/2019-11/TerminalFinder.alfredworkflow)
* [Yosemite iOS Simulator](https://github.com/azl397985856/daily-featured/blob/master/assets/2019-11/YosemiteiOSSimulator.alfredworkflow)
* [Youdao](https://github.com/azl397985856/daily-featured/blob/master/assets/2019-11/Youdao.alfredworkflow)

### 2019-11-27\[软件]

mac 端不能右键新建文件，这在某些时候不是很方便。 没有这个软件的时候，我是在编辑器中新建或者是使用 touch 命令。 使用了这个`New File Menu`软件之后多了一种更方便的选择，你可以直接右键新建，Just Like Windows Users。

![](https://p.ipic.vip/6b29z5.jpg)

![](https://p.ipic.vip/6jq76e.jpg)

地址： <https://apps.apple.com/cn/app/new-file-menu/id1064959555?l=en\\&mt=12>

### 2019-11-26\[网站]

一个网站，可以分析的 Github 仓库，采用手绘风格，对于厌倦了标准图形的我来说简直是耳目一新的感觉。

![](https://p.ipic.vip/dni6oy.jpg)

![](https://p.ipic.vip/bd3jnv.jpg)

项目地址： <https://repo-analytics.github.io/>

### 2019-11-25\[技巧]

Chrome 开发者工具有非常好用但是却鲜为人知的功能。今天给大家介绍一个功能 - 代码覆盖率。 指的是你下载的代码有多少是被执行了的，这在做性能优化的时候很有用。如果一些代码根本没执行，就可以延迟加载。

使用方法：

* `Ctrl+Shift+P` for windows `CMD+Shift+P` for mac
* 输入 coverage， 选择如图的选项，并确定。

![](https://p.ipic.vip/5bfkmq.jpg)

然后你就能看到检测结果了：

![](https://p.ipic.vip/zlounf.jpg)

### 2019-11-22\[工具]

Github Large File Storage （简称 git-lfs）, 可以用来存储大文件，比如上 GB 的大文件，相比于传统的 Github 存储，这种方式空间更大，速度更快，并且工作流程和传统 Git flow 并无二致。

![](https://p.ipic.vip/drmjso.jpg)

地址：<https://git-lfs.github.com/>

### 2019-11-21\[娱乐]

文章标题 【The skeptic's guide to interpreting developer marketing speak 🗺️】 - 暂翻译为【如何翻译开发人员的营销术语】

里面讲了各种开发人员常用的营销术语，以及对应我们应该怎么去解读 ta。比如：

* `现代化` 就是说`刚刚git init`
* `AI加持` 就是说`无数的if else switch case语句`
* `最小化` 就是说`没有测试用例，没有例子`
* `跨平台` 就是说`我听说Electron可以跨平台，于是我就用它写了`
* ...

文章地址： <https://changelog.com/posts/the-skeptics-guide-to-interpreting-developer-marketing-speak>

### 2019-11-20\[工具]

微信的一个插件，功能有很多。 不过目前已经不再维护了。

* 消息自动回复
* 消息防撤回
* 远程控制(已支持语音)
* 微信多开
* 第二次登录免认证
* 聊天置底功能(类似置顶)
* 微信窗口置顶
* 会话多选删除
* 自动登录开关
* 通知中心快捷回复
* 聊天窗口表情包复制 & 存储 ...

我用的比较多的功能恐怕就是双开和防撤回了。

* 消息防撤回 ![消息防撤回.gif](https://p.ipic.vip/ssjr8v.gif)
* 微信多开 ![微信多开.gif](https://p.ipic.vip/94olws.gif)

仓库地址：<https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/tree/master>

### 2019-11-19\[工具]

JS 依赖检测工具，可以用来生成图片，可视化程度很高，还可以做成自动化，集成到 CI CD ，支持 CommonJS，AMD 和 ES Module。

![](https://p.ipic.vip/44cbwi.gif)

![](https://p.ipic.vip/zr4vkc.jpg)

项目地址： <https://github.com/pahen/madge>

### 2019-11-18\[娱乐]

今天给大家推荐一个在线 nokia 短信图片生成器，可以自己输入短语，一键生成。

![](https://p.ipic.vip/phlmvr.jpg)

网站地址： <https://zzkia.noddl.me:8020/>

### 2019-11-15\[网站]

有的什么我们需要在 Google Play 上下载软件，但是苦于没有通畅的网络(关于如何获取畅通的网络我在 2019-11-01 讲到，感兴趣可以翻过去看看)。因此一个 Google Play 镜像就很重要了。 这就如同我们 npm 和 cnpm 的关系。我们可以在这里直接下载 apkx。

> apkx 需要特殊的安装工具，或者一些小技巧才能安装。

网站地址： <https://apkpure.com/>

### 2019-11-14\[技巧]

很多时候我们会看到一些英文的简写。比如邮件，IM 等，这些简称能够帮我们提高沟通效率，如果你不知道一些常见的简写，沟通的时候就难免有障碍，以下是一些常见的简写，欢迎补充。

![](https://p.ipic.vip/y4lpan.jpg)

### 2019-11-13\[技巧]

今天要分享的是关于 Bash 中历史记录那些事。

* 第一个要介绍的是`history`, history is an alias for fc -l 1,你可以通过这个命令来查看最近你使用的命令。 然后你可以用!n(n 指的是 history 命令返回的命令编号)再次执行。其中有许多缩写，最有用的就是 !$， 用于指代上次键入的参数，!! 可以指代上次键入的命令。

![](https://p.ipic.vip/t2mzvh.jpg)

* 第二个要介绍的是历史搜索`ctrl + r`, 然后输入你想搜索的关键字即可
* 第三个要介绍的是`上下方向键`，你可以通过他在历史记录中上下移动。即按下上返回当前上一个命名，按下下返回当前下一个命令。
* 还有一个小插曲，似乎和历史有那么一点点关系。 就是`cd -`,切换到上一次的工作路径

如果你还知道什么和历史记录相关的命令，欢迎大家补充。

### 2019-11-12\[技巧]

dig 命令是常用的域名查询工具，可以用来测试域名系统工作是否正常。

如下`dig lucifer.ren`， 可以发现很多信息，包括域名最终解析到了到了另外一个域名`azl397985856.github.io`, IP 是`185.199.108.153`.

这个工具在很多情况下非常有用，尤其是对于喜欢命令行的你来说。

![](https://p.ipic.vip/camn15.jpg)

其实 dig 是`usr/bin`下的一个可执行文件，更多用法请`man dig`查看。

```bash
~ type dig
# dig is /usr/bin/dig
```

### 2019-11-11\[分享]

今天是双十一，大家剁手快乐。

今天给大家分享一下前一段时间刚刚举行的大会`React Conf 2019`，这个是 React 最高规模的技术会议。喜欢 React 的小伙伴千万不要错过了，这里有全套视频。

地址：<https://www.youtube.com/playlist?list=PLPxbbTqCLbGHPxZpw4xj\\_Wwg8-fdNxJRh>

### 2019-11-08\[好文]

前几天读了一篇文章《Scaling webapps for newbs & non-techies》，文章从最简单的单体应用，逐步讲到大型应用架构，不仅讲的通俗易懂，并且图画的也非常好，是我喜欢的风格。 很期待他的第二篇《the cloud for newbs and non-techies》。

![](https://p.ipic.vip/e5iwtf.jpg) （A single server + database） ![](https://p.ipic.vip/suk04i.jpg) （Adding a Reverse Proxy）

文章地址： <https://arcentry.com/blog/scaling-webapps-for-newbs-and-non-techies/>

### 2019-11-07\[学习方法]

前一段时间看了一篇文章 -《如何构建自己的产品知识库》。这篇文章的亮点在于其所提到的技巧能够横向类比到任何领域。换句话说你可以按照它将的方法构建你自己的知识库。

里面有一句话`产品知识体系是对产品知识搜集、筛选、整理后形成的知识组合，并且这些知识能够用于解决实际遇到的问题。` 学习任何知识又何尝不是呢？很多人问我学习方法，其实这个东西非常地系统，很难通过几个技巧完成，也很难在短期内看到很明显的效果。大家可以看一下，说不定对你的学习和生活所有启发，即便你不是一个产品经理。

文章地址: <https://www.toutiao.com/a6738596936057618951/>

> 后期如果有机会的话，我也会分享一下自己的学习方法

### 2019-11-06\[工具]

像 PS 和 Sketch 一样，figma 也是一个设计工具，和其他相比团队显得更简单，这点有点像蓝湖。做设计的同学要了解起来了。

![](https://p.ipic.vip/hpp9ca.jpg)

地址： <https://www.figma.com/>

### 2019-11-05\[观点]

VSCode 和 MDN 进行了官方联动，[详情](https://code.visualstudio.com/updates/v1_38#_mdn-reference-for-html-and-css).

![](https://p.ipic.vip/yzqr36.jpg)

再也不用跳出 IDE 用 Dash 查了。 用 Alfred + Dash 虽然方便，但是不免有一种`应用跳出`的感觉。现在就很方便了，如果之后有更多的联动支持，相信体验会越来越好。

![](https://p.ipic.vip/ke86i5.jpg)

### 2019-11-04\[好文]

最近几年啊，我本人也看了很多关于微服务的介绍，理念，落地等技术文章，今天给大家推荐一篇阿里飞冰团队发布的技术文，这或许是最简单的微服务落地技术文章。这篇文章详细讲述了业务场景，并详细记录了解决问题的过程以及对比了业界的一些解决方案，管中窥豹，让读者慢慢走进微服务，从这篇文章可以学习到`icestark`这个微服务的解决方案是怎么从从到有再到落地产生实际业务价值的。

文章地址： <https://zhuanlan.zhihu.com/p/88449415#h5o-9>

### 2019-11-01\[工具]

身为一个程序员，科学上网是标配。市面上免费的软件大多不稳定，出了问题很难及时解决。 自建服务器虽然好，但是还是有一点繁琐的，尤其是碰到了“开会”，IP 端口就会被封锁，自己处理就比较麻烦了。

今天给大家推荐一下 SSNG 的订阅功能，有了这个订阅地址就相当于有了无数的`自建服务器`，然后你可以在不同的节点之间进行切换。一般而言，我会对服务器进行测速，然后选择速度最快，如果某一个服务器挂了，我只需要一键切换到另外一个即可，无需额外操作。

市面上有很多这种订阅服务，这里推荐一个付费的服务 ，用户体验真的是好，用起来超简单， 提供一站式工具，包括网络检测工具，浏览器插件等，支持多种客户端（还有我最喜欢的 Switch 加速器），价格也不贵，基础套餐折算到月大约 11.2 块/月。它还支持签到送天数，也就是说你可以每天签到无限续期。地址：<https://glados.space/landing/M9OHH-Q88JQ-DX72D-R04RN>

使用方式也非常简单，只需要以下三步即可。

1. 下载对应客户端

![](https://p.ipic.vip/nsf8vg.jpg)

1. 点击复制订阅地址

![](https://p.ipic.vip/jz0czy.jpg)

1. 将地址粘贴到客户端

![](https://p.ipic.vip/b2dahz.jpg)

![](https://p.ipic.vip/k5ro16.jpg)

提示： 你也可以像我一样测速，然后根据速度选择节点。

![](https://p.ipic.vip/0mwbgp.jpg)

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2019-10

![](https://p.ipic.vip/z1gao9.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。。

## 2019-10

### 2019-10-31\[技能]

虽然我们不是专门的网络工程师，但是不免在实际工作以及面试中会需要这方面的知识，当然这是浅层的即可。如果完全不知道，那么对于一些网络性能优化问题肯定是没有概念，从而无从下手的。

网上关于 HTTP 协议的文章很多，面试的时候关于 HTTP 三大版本的差异也是热门考点。这篇文章就通俗易懂地解释了`HTTP/2与HTTP/3 的新特性`, 相比于之前，为什么要推出新的协议，核心解决了什么问题？有什么不足？ 这些东西网上资料要么就是太专业，要么就是太笼统和人云亦云，这篇文章是相对比较适合新手读的一个文章。

![](https://p.ipic.vip/z6ndx7.jpg)

文章地址： <https://segmentfault.com/a/1190000020714686#articleHeader16>

### 2019-10-30\[类库]

很多年前我自己写过一个简陋的`pub/sub库`, 这个仓库甚至被一些人在用。很多时候我们需要用到这种灵活的`pub/sub`功能，这个时候我们就会自己实现，或者用一些开源的。 今天给大家介绍的就是鼎鼎大名的 Jason Miller 写的一个`tiny event pub sub implement`，代码就几十行，不仅注释详实，而且给出了丰富的类型定义，代码简单易懂，非常适合学习。

代码地址： <https://github.com/developit/mitt/blob/master/src/index.js>

### 2019-10-29\[网站]

上一次给大家分享了一个常用正则的 VSCode 插件（2019-10-11 期），另外的[《大前端面试宝典》](https://lucifer.ren/fe-interview/#/?id=%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f)也讲到了正则的学习，并给出了我认为非常不错的学习资料。

今天我继续给大家介绍几个正则学习&练习的网站。

* [Regex Golf](https://alf.nu/RegexGolf) 是一个有名的正则练习网站，会根据你的正则打分，难度偏高。 ![](https://p.ipic.vip/1b5zph.jpg)
* [regexone](https://regexone.com/lesson/introduction_abcs) 是一个交互友好，面向新手的一个正则练习网站，可以交互式地学习正则，右边还贴心地给出了 Notes，另外语言不同其实正则规范也不太一样，这个网站给出了不同语言的正则讲解，很用心。值得一题的是，里面的资料非常新，最新的`/u- interpret the regular expression as unicode codepoints` 都有。 ![](https://p.ipic.vip/h2l4qw.jpg)
* [regexr](https://regexr.com/)这个不是练习的， 是用来可视化的， 和之前的[regexper](https://regexper.com/)有点像，就连域名都差不多，不过这个用户体验是真的棒。 ![](https://p.ipic.vip/dxmwro.jpg)
* [The regular expression game](http://play.inginf.units.it/#/) 是一个过关类型的正则练习网站，有意思的是它可以根据你写的正则匹配程度进行打分，即使你没有全部匹配也是可以得分的。 ![](https://p.ipic.vip/z9hwxv.jpg)

### 2019-10-28\[工具]

这个是人称贺老的百姓网贺师俊`Hax`整理的一份`中文技术活动日程`， 这些活动有几个特点：

* 技术活动的主要语言是中文
* 技术活动的主要参与者是程序员
* 技术活动的主要日程接受公开报名
* 技术活动具有一定规模

目前这个仓库仅有个简陋的 `yaml 数据文件`，记录`技术活动的时间和一些信息`。后续希望能加入一个更好的查询界面。活动组织者可直接修改数据文件并提交 PR，或提交 issue 描述一下活动情况。活动组织者也可以 watch 本仓库，这样当有变动时（通常是会议信息更新），可以收到通知。

![](https://p.ipic.vip/5i1vs1.jpg)

仓库地址：<https://github.com/hax/chinese-tech-conf-schedule>

### 2019-10-25\[工具]

今天给大家推荐的是一个我个人非常喜欢的一个`好用且免费图床工具` - [IPic](https://apps.apple.com/cn/app/ipic-markdown-%E5%9B%BE%E5%BA%8A-%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E5%B7%A5%E5%85%B7/id1101244278?mt=12)。 这个工具不仅内置免费的微博图床,还可以自己定义，我本人还添加了腾讯云的 COS

使用起来也非常简单，直接复制图片，然后点击对应的图片即可，另外值得一提的是它本身还支持直接生成 MardDown 链接，这对经常用 MarkDown 写作的我来说绝对是一个非常实用的功能。

另外它还搭配了一个软件[IPic Mover](https://apps.apple.com/cn/app/ipic-mover/id1183822957?mt=12)用来迁移图床，比如你的文章里面都是新浪图床，只需要一键就可以瞬间迁移到别的平台，比如腾讯云 COS。 不过这个搭配的工具是收费的，但是有免费体验时间。

![](https://p.ipic.vip/kv3rjj.jpg)

### 2019-10-24\[技能]

今天是 1024 程序员节，祝广大的程序员们节日快乐。🎩🎩🎩🎩🎩🎩

之前给大家介绍了一款跨平台的 Web 平台技术栈检测工具 Wappalyzer。这几天我看了下他的源码，觉得很不错，于是就想着推荐给大家。

Wappalyzer 的整体架构非常有意思，这里讲一下我发现的主要特点，更多细节等待着你的探索。

* 平台相关的代码放在 drivers 文件夹下，公共的代码在 src/wappalyzer.js
* 特地写了 validate 脚本来检测代码。
* 将检测逻辑抽离到了 src/app.json 中， 以配置文件的形式存放（这个 json 文件结构设计地很精巧，应该是花了心思的）
* 主要采用正则来检测应用
* 考虑到间接引用，比如框架 A 引用了 B，那么检测到了 A 也会把 B 带上

如果想快速上手可以看下 ta 提供的[测试用例](https://github.com/AliasIO/Wappalyzer/blob/master/src/wappalyzer.spec.js)，非常简洁。

Github 地址： <https://github.com/AliasIO/Wappalyzer>

### 2019-10-23\[网站]

今天给广大的前端朋友们介绍一个在线做题的网站，可以瞬间在线知道答案，而且不需要登陆，一共 58 道题目，不知道后续会不会更新。 这个网站的题目我看了其实没有什么新意，但是不需要登陆而是直接使用 LocalStorage 来存储你的答题情况对用户来说很轻量，给我的感觉很好，感兴趣的可以试一下。

![](https://p.ipic.vip/lcf3sw.jpg)

(题目列表)

![](https://p.ipic.vip/wu99hs.jpg)

(题目详情)

网址： <https://quiz.typeofnan.dev/>

### 2019-10-22\[观点]

前一段时间王思聪的股权遭到了冻结，据中新经纬记者计算，王思聪名下冻结股权价值合计已经超过 8445 万元。

“这种情况一般是王思聪欠别人钱，别人追讨，作为诉讼保全措施冻结的。”金杜律师事务所律师李量接受虎嗅采访时说，“王思聪欠钱可以是直接欠，或和贾跃亭一样，给别人提供担保，承担了连带责任。”

但是实际上这种冻结对于王思聪来说根本起不到作用，他会有很多方法来免除所谓的强制执行，他只要将自己的股权先一步将股权质押给万达集团，这样`质押权人就对被保全的股份有优先权`, 换句话说这`对王思聪来说这种冻结根本无效`。

现实中有很多这样的事情，这些规则似乎是在`限制那些“能力不足”的人，而对社会上这些“制造规则的人”无能为力`。更可悲的是，很多人对这些不知道，不关注。其实越是贫穷的家庭，越是生活在社会底层的人，他们的后代，大概率还会是穷人。其实，我们奋斗的目标无非就是：让子女一出生就站在了别人的肩膀上！

### 2019-10-21\[效率]

我是一个有着轻微强迫症的人，社交软件的小红点有时候会打乱我的节奏，将我从专注模式(Focus Mode)强制转化为发散模式（Diffuse Mode）。 这两种模式适合我们做不同类型的工作，因此掌控小红点，避免这种不希望的模式切换是提高效率的一个有效途径。

我的做法是：

* 手机静音
* 电脑关闭红点提醒

mac 电脑可以在系统偏好设置 - 通知 - 对应 APP - 将标记应用程序的勾去掉

![](https://p.ipic.vip/hgkwmx.jpg)

一般而言，你也不用担心会错过什么东西，因为右侧通知还是会有的，比如钉钉的会议提醒等。

经过这样的设置，你就可以自由切换两种模式，而不会被频繁打断，当然还是会有人来打断你，这个问题我们以后再讲。

### 2019-10-18\[类库]

UMI 的官方定位是`可插拔的企业级 react 应用框架`。其作者云谦也是 Ant-Design，dvajs 的核心贡献者，同时也是我早期关注的人之一。这个项目的价值绝对不亚于更受大家欢迎的 dvajs，是一个值得学习的项目。

说白了，Umi 和 create-react-app（cra）类似，就是现有技术栈的组合，封装细节，让开发者用起来更简单，只写业务代码就可以了，它有几个特点：

![](https://p.ipic.vip/9eixut.jpg)

* 零配置就是默认选型都给你做好了。
* 开箱即用就是技术栈都固化了。
* 约定大于配置，开发模式也固化好了。

下图是云谦介绍 umi 的定位的时候贴的一张架构图：

![](https://p.ipic.vip/3zntux.jpg)

项目地址：<https://github.com/umijs/umi>

### 2019-10-17\[工具]

之前分享过《2019-09-23 - 为什么一行 80 个字符是一个值得遵守的规范，即使你拥有 4k 显示器？》，里面提到了并排窗口的问题。 多个显示器确实可以提高效率，如果你能高效地利用每一个显示器，效果会更棒。

> 配合 4k 大屏显示器效果更棒

今天介绍的这款工具就是一款窗口布局工具，能够快速修改当前窗口大小并放置在指定位置，Moom 默认操作点设立在了窗口左上角的绿色按钮上，将鼠标 hover 在绿钮上就会弹出一个选择菜单，里面有五种尺寸可选，单击选项即可变化窗口大小，并能将窗口移动到指定位置。

> 搭配使用快捷键效果更棒

![](https://p.ipic.vip/tnd7ba.jpg)

### 2019-10-16\[工具]

今天给大家推荐的是一款非常好用的 Chrome 插件，可以用来查看网站是由什么技术栈构建的。其实类似的软件也有别的，但是这个是我使用过的最好的一个。

![](https://p.ipic.vip/yesxyi.jpg)

（这个是其官网的检测结果）

![](https://p.ipic.vip/8p6yr5.jpg)

（这个是 GitHub 的检测结果）

项目主页： <https://www.wappalyzer.com>

### 2019-10-15\[技能]

今天给大家分享一个微信小技巧，据说有的人还不知道，所以今天就把它分享出来，大家如果有什么微信使用小技巧也欢迎在下方进行评论。

今天的小技巧是`判断对方是否把你拉黑或者删除`:

1. 给对方转账，是好友会让你输入密码，不是好友都不用你输入密码，直接弹出下图，整个过程好友不知情的！

* 如果拉黑会提示： `请确认你和他（她）的好友关系是否正常`
* 如果删除，则会提示： `你不是收款方的好友`

![](https://p.ipic.vip/yro7m7.jpg)

1. 点开好友名片，如果显示左图，说明她真的没有发过一条朋友圈。若显示右图，点开个人相册却什么也看不到，那么你有可能被删除、拉黑、朋友圈屏蔽，或者发过朋友圈但设为私密了。

![](https://p.ipic.vip/udu1nn.jpg)

为了搞清楚对方是删除还是屏蔽，你就可以用到开头转账的那一招啦！

### 2019-10-14\[好文]

如果想做一些高级的东西，编译是一个绕不过的坎，Babel 是一个前端的转义工具，Babel 有着自己的插件系统，这是个系列文章，通过这个系列你可以学到 AST，以及 Babel 插件相关的东西，并且你可以自己动手写一个 Babel 插件。

![](https://p.ipic.vip/usdzta.jpg)

文章地址：

* [Step-by-step guide for writing a custom babel transformation](https://lihautan.com/step-by-step-guide-for-writing-a-babel-transformation/)
* [Creating custom JavaScript syntax with Babel](https://lihautan.com/creating-custom-javascript-syntax-with-babel/)

### 2019-10-12\[工具]

前端在调试兼容性样式的时候是一个很头疼的问题，各个浏览器以及同一个浏览器不同版本支持的 css 都是不同的，比如有些不支持 Grid，有些不支持 cal 函数。如果你自己根据这些去修改代码肯定是非常低效的，这个 Chrome 插件就是解决这样的问题，你可以在高级的浏览器上调试，自行禁用一些 css 特性来 debug。

![](https://p.ipic.vip/bm2mr4.jpg)

仓库地址： <https://github.com/keithclark/css-feature-toggle-devtools-extension>

chrome 插件地址： <https://chrome.google.com/webstore/detail/css-feature-toggles/aeinmfddnniiloadoappmdnffcbffnjg>

### 2019-10-11\[工具]

常用正则大全, 支持 vscode 扩展插件

值得一提的是它支持 VSCode 插件形式使用：

![](https://p.ipic.vip/kyez90.jpg)

目前有 57 个正则：

![](https://p.ipic.vip/1suvao.jpg)

插件地址： <https://github.com/any86/any-rule>

### 2019-10-10\[技能]

傅里叶变换是一种在各个领域都经常使用的数学工具。这个网站将为你介绍傅里叶变换能干什么，为什么傅里叶变换非常有用，以及你如何利用傅里叶变换干漂亮的事。傅立叶变换有很多实际的应用，比如 MP3 的原理，MP3 是如何将声波转化为二进制，并如何进行压缩的？ 比如 JPEG 的原理等。

![](https://p.ipic.vip/bl9p1v.jpg)

这个文章（网站）是我见过傅立叶变换最直观的一个解释之一，并且支持交互式操作。

![](https://p.ipic.vip/ike7wl.jpg)

网站地址： <http://www.jezzamon.com/fourier/zh-cn.html>

### 2019-10-09\[工具]

VSCode 是我经常使用的一个软件，结合自己的开发习惯我也会增加很多配置和插件等，如何将这些插件进行备份以便将来换电脑可以及时同步过来，这里关于 VScode 的配置我用的是 VSCode [setting sync 插件](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync)。

这个需要结合 Gist 使用，具体使用方式请查看官方文档：

![](https://p.ipic.vip/zxr114.jpg)

![](https://p.ipic.vip/nxhasy.jpg)

![](https://p.ipic.vip/h2xa6n.jpg)

其实我有一个专门的[开发常用配置文件备份仓库](https://github.com/azl397985856/dev-config)用来存放这些东西，这是我的仓库存放的配置，这样我即使换了电脑也能很快地用到我最舒服的配置。

![](https://p.ipic.vip/mvp7f0.jpg)

如果大家没有更好的方式，不妨采用这种方式，如果你有更好的方式欢迎给我留言。

### 2019-10-08\[工具]

今天是国庆结束的第一天，大家假期玩的怎么样？ 希望大家可以尽快从假期的状态中转变回来。今天给大家推荐一个我个人使用比较多的一个功能，就是`剪贴板历史`。

我在使用手机的时候（笔者使用的是安卓机），会经常复制一些文字或者图片，然后进行粘贴，有时候会需要粘贴之前复制的一个东西，因此剪贴板历史就显得很重要，手机上我用的就是`搜索输入法自带的剪贴板历史功能`。

而在电脑上我使用的是 Alfred 自带的`剪贴板历史`功能，只不过默认不开启，你需要去配置一下才行。

![](https://p.ipic.vip/r4ivdg.jpg)

然后你就可以查看你的剪贴板历史了：

![](https://p.ipic.vip/i8quci.jpg)

![](https://p.ipic.vip/xf00ma.jpg)

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


# 2019-09

![](https://p.ipic.vip/muc567.jpg)

每天给你推荐一个新奇，好玩，高品质的开源库，好文，观点或言论等。

## 2019-09

### 2019-09-30\[工具]

今天是 9 月的最后一天，明天就是十一了，提前祝大家国庆节快乐 ～～～ 🎉🎉🎉🎉🎉🎉🎉 ！

今天再来给大家安利 6 个 chrome 扩展程序，排名不分先后。

![](https://p.ipic.vip/d4xgc5.jpg)

1. Proxy SwitchyOmega

此扩展为 SwitchySharp 的升级版，可替代 SwitchyPlus 或 Proxy Switchy. 可轻松快捷地管理和切换多个代理设置，是一个我使用多年的一个插件，配合 PAC 食用味道更好。

![](https://p.ipic.vip/rpeh4i.jpg)

[下载地址](https://chrome.google.com/webstore/detail/proxy-switchyomega/padekgcemlokbadohgkifijomclgjgif)

1. OneTab

节省高达 95％的内存，并减轻标签页混乱现象。 有些标签关了舍不得，不关太多看的很乱并且更关键的是占用内存。有了这个工具就不存在这些问题了。

![](https://p.ipic.vip/3m791v.jpg)

[下载地址](https://chrome.google.com/webstore/detail/onetab/chphlpgkkbolifaimnlloiipkdnihall)

1. AdBlock Plus

Adblock Plus 是世界上最流行的浏览器扩展，世界各地有数百万用户在使用它。这是一个社区驱动的开源项目，有数百名志愿者为 Adblock Plus 的成功作出了贡献，以实现所有烦人的广告被自动阻挡。

![](https://p.ipic.vip/pj9iom.jpg)

[下载地址](https://chrome.google.com/webstore/search/AdBlock)

1. Multi-highlight

普通的网页搜索只能一个一个搜索，不能同时搜索多个关键字，这个扩展提供了这种功能上的扩展。

![](https://p.ipic.vip/4gz056.jpg)

[下载地址](https://chrome.google.com/webstore/detail/multi-highlight/pfgfgjlejbbpfmcfjhdmikihihddeeji)

1. HTML5 Outliner

![](https://p.ipic.vip/y30opf.jpg)

我平时再看文章或者文档的时候习惯先看一遍目录或者大纲，然后再决定我到底要不要看，看哪里。我相信很多人和我一样有着同样的习惯。但是很多网站，包括 infoq，知乎等大网站这方面都做的比较差。下图是我的个人博客的大纲功能：

![](https://p.ipic.vip/d7k945.jpg)

因此这款工具对于我这种人来说就非常重要了，他能根据当前网页的结果快速生成大纲，并且支持锚点功能，当然它也有很多覆盖不到的情况，因为标题的种类实现太多了，大家完全可以写一个`div class = 'header'`从而让这个工具无用武之地。 这也从侧面说明了语义化的重要性，不仅对于障碍人士重要，对于无障碍人士也有很大的意义。

[下载地址](https://chrome.google.com/webstore/detail/html5-outliner/afoibpobokebhgfnknfndkgemglggomo)

1. 眼睛护航

把网页背景变成眼睛保护色或适合夜晚阅读的夜间模式，一些无法变色的小区块可以通过单击进行变色。到了晚上将自动从绿色护眼模式变为夜间阅读模式。当然，也可以手动强制使用绿色模式或夜间模式。

这在一些体验差的网站上极为重要，还有一些大量使用亮瞎眼的颜色网站也有很好的作用，类似提升阅读体验的扩展还有[简悦](https://chrome.google.com/webstore/detail/simpread-reader-view/ijllcpnolfcooahcekpamkbidhejabll?hl=zh-CN)。

[下载地址](https://chrome.google.com/webstore/detail/care-your-eyes/fidmpnedniahpnkeomejhnepmbdamlhl)

### 2019-09-29\[工具]

如果你是一个站长，那么你一定需要一个网站速度测试工具。

你的用户如果都是中国用户，那么用[站长工具-国内测试](http://tool.chinaz.com/speedtest/lucifer.ren)应该就够用了。 如果你的用户有海外的话，可以试试[站长工具-国际测试](https://tool.chinaz.com/speedworld/)

![](https://p.ipic.vip/nnd98l.jpg) (国内测速)

![](https://p.ipic.vip/u881ds.jpg) (国际测试)

> 不得不吐槽下，网站体验做的不太好，而且广告有点多。

另外还有一个网站，不过这个只能够测试国内的网速，[17ce](https://www.17ce.com/)的体验做的稍微好一点，广告也没有那么显眼，如果你的客户只是国内，不妨考虑这个。

![](https://p.ipic.vip/mdps4j.jpg)

![](https://p.ipic.vip/tkucg9.jpg)

最后介绍一个国外的网站[pingdom](https://tools.pingdom.com)，如果客户是全球的，可以考虑用这个，这个是这几个中用户体验做的最好的。给出的技术指标比较多一点，但是他没有区域分布热力图, 并且支持的区域也不多。

![](https://p.ipic.vip/en41ex.jpg) ![](https://p.ipic.vip/62w9dr.jpg) ![](https://p.ipic.vip/mg26v2.jpg)

### 2019-09-27\[类库]

之前我写了一篇 [【前端测试】](https://github.com/azl397985856/frontend-test) 的草稿，一直搁置到现在，之前我做后端的时候，写测试尤其是单元测试是很普遍的。但是做前端这么久发现大家对这方面不是很重视， 其实前端也是非常需要做测试的。

今天给大家推荐的是一个非常流行的前端测试框架 jest 的 GUI 工具[majestic](https://github.com/Raathigesh/majestic) (⚡ Zero config GUI for Jest)

![](https://p.ipic.vip/wyuzj2.jpg)

![](https://p.ipic.vip/wk8usx.jpg)

### 2019-09-26\[工具]

你一定有想用某一个功能的快捷键，却想不出来的情况。也一定面临过多个软件快捷键不统一带来的烦恼，比如 A 软件`CMD + S`是保存， 另外一个软件 B 是`Shift + S`。

对于第一种问题，我们可以用一个叫 cheatsheet 的 mac 软件，有了它你就可以通过长按 command 键，从而查看当前应用的快捷键。 ![](https://p.ipic.vip/cu1s9z.jpg)

cheatsheet 下载地址： <https://cheatsheet-mac.en.softonic.com/mac>

> 顺便吐槽一下，cheatsheet 官网用户体验这块做的不怎么样

对于按键不统一的问题，我们可以直接修改对应软件的快捷键即可，毕竟大多数软件都是支持快捷键定制的，还有一些`服务`快捷键我们可以去`系统偏好设置 - 键盘 - 服务`中修改。

![](https://p.ipic.vip/xjnpkb.jpg)

另外给大家安利一个软件`Karabiner-Elements`, 它是一个 mac 上好用的键盘定制工作，可以用来改键，定制超级键等，更多功能等你挖掘。

![](https://p.ipic.vip/a1jt9o.jpg)

> 配合 HHKB 效果更佳

Karabiner-Elements 下载地址： <https://github.com/tekezo/Karabiner-Elements>

### 2019-09-25\[技能]

熟练使用命令行是一种常常被忽视，或者被认为难以掌握的技能，一旦掌握，会极大提高你工作的效率。当你能够熟练掌握这里列出的所有技巧时，你就学会了很多关于命令行的东西了。

今天介绍的这个仓库，首发于 Quora， 后面迁移到了 Github，并由众多高手做出了许多改进，现在已经有 6W+ Star 了。

![](https://p.ipic.vip/9pc4fs.jpg)

仓库目录（目录是我用工具自己抓的，非官方提供）：

![](https://p.ipic.vip/el7kli.jpg)

仓库地址： <https://github.com/jlevy/the-art-of-command-line/blob/master/README-zh.md>

### 2019-09-24\[工具]

今天给大家分享的是 VSCode 前一段时间推出的 SSH 扩展，实际使用效果非常棒，除了延迟，让你感觉不到你是在操作远程的文件。虽然有延迟，但是也仅仅限于你和服务器有 IO 交互的情况下才会有感知，结合我的使用体验来说，是“几乎”感觉不到差异（当然也有可能我的网比较快）。

VSCode SSH 扩展允许你连接到远程的主机，虚拟机或者是容器。而你所需要做的仅仅是点击 SSH 面板，然后配置一下就好了，配置也极其简单，对于经常使用 SSH 的你来说千万不要错过了。

![](https://p.ipic.vip/kxe8su.jpg)

下面是官方提供的原理架构图：

![](https://p.ipic.vip/hq0ixx.jpg)

地址： <https://code.visualstudio.com/docs/remote/ssh>

### 2019-09-23\[好文]

为什么一行 80 个字符是一个值得遵守的规范，即使你拥有 4k 显示器？

我个人一直是 80 字符的践行者，不仅仅是因为是这大家都普遍采用的标准，更重要的是我个人更习惯多窗口平铺的方式来展示我的窗口，这样效率更高一点，因此太大肯定会影响窗口平铺，太小又不方便阅读，80 对我来说其实刚刚好，其他比较常见的还有 100 字符等， 现在就让我们来看下为什么一行 80 个字符是一个值得遵守的规范吧。

![](https://p.ipic.vip/pb9ahj.jpg)

文章地址： <https://nickjanetakis.com/blog/80-characters-per-line-is-a-standard-worth-sticking-to-even-today>

### 2019-09-20\[工具]

我开启了[个人博客](https://lucifer.ren/blog/)，增加了评论，分类，统计，RSS，歌单等功能， 之后的文章会在博客首发。 感兴趣的可以 RSS 订阅我的博客。订阅方法我画了个图。

![rss-feed](https://p.ipic.vip/k9rn16.jpg)

RSS 是一种消息来源格式规范，用以聚合经常发布更新数据的网站，例如博客文章、新闻、音频或视频的网摘。RSS 文件包含全文或是节录的文字，再加上发布者所订阅之网摘数据和授权的元数据。

简单来说只要提供了符合 RSS 格式的数据源，你就可以订阅，然后在 RSS 阅读器上进行查看更新内容。

关于 RSS 订阅，今天我推荐的就是一个 RSS 的聚合器 feedly。<https://feedly.com>

Feedly 是一个 RSS 聚合器应用程序，支持各种网页浏览器和运行 iOS 或 Android 的移动设备，也是一个基于云端的服务。其从各种在线资源聚合用户自定的新闻订阅源，并可与他人分享。

![feedly](https://p.ipic.vip/yl23t2.jpg)

后续有机会我会向大家推荐我的 RSS 订阅源。

### 2019-09-19\[工具]

今天给大家推荐一款 MarkDown 编辑器。 MarkDown 在程序员中的使用频率是非常高的，Github 是最早一批对 MarkDown 语法支持度比较好的平台之一。我日常写文档，记笔记等都采用 MarkDown 格式来书写。 它不仅书写方便，而且由于其格式比较规范，因此理论上可以通过一些“转换规则”将其转化为各种表现形式，市面上也有很多基于 Markdown 的渲染器，比如[markdown-it](https://github.com/markdown-it/markdown-it)，也有很多基于这些渲染器制作的产品，比如[docsify](https://github.com/docsifyjs/docsify)。

早些时候，我使用的比较多的是[MacDown](https://macdown.uranusjr.com)和 VSCode 自带的 Markdown 功能。这两个功能非常简单，但是却能满足我当时的需求，之后我开始经常用 Markdown 更新文章之类的，因此这些就显得不太够用了，现在我用的是 Yu Writer， 算是一个值得推荐的国人开发的 MarkDown 编辑器，功能非常强大而且免费。 你可能听过 MWeb，但是它是收费的，功能和这个比起来也并不占优势。

![yu-writer](https://p.ipic.vip/dx6tyx.jpg)

下载地址：<https://ivarptr.github.io/yu-writer.site/>

### 2019-09-18\[工具]

前天分享了我的 chrome 插件管理器，今天我们就来分享我的《娱乐插件》。

![extension-joy](https://p.ipic.vip/39l7p3.jpg)

1. listen1

![listen1-icon](https://p.ipic.vip/6r9ugt.jpg)

娱乐插件第一个要分享的是一个听歌的插件，各个平台都有一些独家的音乐，就像视频网站一样，这就可怜了我们这些消费者。如果想要听所有的音乐就要办理各个 APP 的会员，或者在多个音乐 APP 中切换。

这个插件能让我们听到所有国内几个主流大平台的所有音乐，足不出户畅享所有的音乐，并且值得称赞的是它支持会员系统，你可以保存你的歌单，甚至可以直接登陆你的 Github 账户同步多端的数据。

![listen1](https://p.ipic.vip/m7p5t4.jpg)

仓库地址：<https://github.com/listen1/listen1>

1. Video Downloader Professional

![video-downloader-icon](https://p.ipic.vip/iy5cy6.jpg)

我主要用它来下载 Youtube 的视频，据说可以下载任何视频网站的视频，但是我亲测了几个网站不可以。

扩展下载地址：<https://chrome.google.com/webstore/detail/jpaglkhbmbmhlnpnehlffkgaaapoicnk>

1. Bilibili 全家桶

经常看番的朋友怎么能少的了几个好用的插件护体呢？

这几个插件的功能基本满足了我看番的所有需求，包括弹幕合并，查找弹幕，自动签到，一键直达，猜你喜欢等等，大家可以安装下自己体验。

![helper-icon](https://p.ipic.vip/nvc2a2.jpg)

[bilibili 助手](https://chrome.google.com/webstore/detail/kpbnombpnpcffllnianjibmpadjolanh)

![pakku-icon](https://p.ipic.vip/4d223x.jpg)

[pakku 哔哩哔哩弹幕过滤器](http://s.xmcp.ml/pakkujs/?src=wext_homepage)

![danmu-icon](https://p.ipic.vip/v04aa8.jpg)

[bilibili 猜你喜欢](https://chrome.google.com/webstore/detail/ngjddnobeppdekpmimhiamkoonoaccdf)

### 2019-09-17\[学习方法]

很多人想要问我“你的成长史是怎么样的？能不能分享一下你的菜鸡成长史”。 开始我是抵触的，这种东西写的不好大家会骂你，写的“太好”也会骂你。

今天我就来做个“lucifer”系列的开篇吧，用图来描述“lucifer 的一天”。

lucifer 的早晨：

![morning-lucifer](https://p.ipic.vip/mqd5vj.jpg)

lucifer 搬砖的一天开始了：

![morning-lucifer](https://p.ipic.vip/5bvmdz.jpg)

lucifer 的晚上：

![morning-lucifer](https://p.ipic.vip/azrafv.jpg)

### 2019-09-16\[工具]

经常有同学问我“你的这个扩展看着不错，叫什么”， “有什么好用的扩展程序推荐么？”。

因此我打算出一个《工具推荐》专题， 然后细分一个类别《工具推荐 - chrome 插件》。 这个算是这个系列的开篇之作，我默默翻开自己的 chrome 插件列表来看，有什么好用的推荐给大家。突然灵机一动，干脆把这个“扩展插件管理器”安利给大家好了。之后我会向大家推荐更多好用好玩的插件，有“工具”，“效率”， “娱乐”，“前端”等等。

![chrome-extension-manager](https://p.ipic.vip/vn5ro3.jpg)

我的 chrome 插件差不多有 60 多个，插件多起来的时候，良好的分类，开启关闭，禁用，卸载等管理就变得非常重要了。毕竟谁也不想在众多插件中寻寻觅觅的感觉，也不想因为开启太多插件吃我们宝贵的内存吧？这个插件的名字是[扩展管理器（Extension Manager)](https://chrome.google.com/webstore/detail/extension-manager/gjldcdngmdknpinoemndlidpcabkggco)

> 对于没有梯子的同学，我还贴心地给大家准备了我从官方下载的扩展文件。 [链接](https://github.com/azl397985856/daily-featured/blob/master/backup/2019-09/assets/2019-09/extension-manager.crx)

### 2019-09-12\[类库]

今天给大家推荐的是一个在给 Git 提交记录增加 emojis 的仓库。

或许你知道[AngularJS Git Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153) , 现在很多开源项目和内部项目都在使用，是一道非常流行的 git commit message 规范。 它的好处就是你可以很轻松地通过提交信息，看出`这次提交干的什么，影响范围等`，比如是新特性，修复 bug，增加文档， 重构代码等。

这个项目可以说更进一步，通过图的形式，让你更快地感知到这些信息，`可视化形式的沟通毫无疑问是最最有效的。因为人的大脑更擅长处理图像。` 项目提供了几十种 emoji，几乎覆盖了所有的场景。 仓库地址： <https://gitmoji.carloscuesta.me/>

![git-emoji](https://p.ipic.vip/a1qfax.jpg)

### 2019-09-11\[技能]

Google 内部有很多通用的最佳实践，在这我推荐一个项目，这是挂在 google group 下的一套通用的工程实战指南，被各个项目广泛使用，覆盖全部的编程语言。

这个仓库分成两部分：

1. 这部分是给 Code Reviewer（代码评审者）的指南
2. 这部分是给 Change Author（CL 作者）的指南

代码评审者指南本来是一个完整的文档，一共分为 6 部分，读者可根据需要阅读。

修改列表（Change List/CL）制定者指南包括一些浏览代码评审的最佳方式，开发者可以快速处理评审结果。

项目地址： <https://github.com/google/eng-practices>

### 2019-09-10\[类库]

今天给大家推荐的是一个打包平台，不知道大家有没有听说过“polyfill.io”，用法有点像。

这个仓库是 fork 自 packed，并进行了魔改，你可以将多个包打包成一个单独的 ESM，支持多种 options， 仓库地址： <https://github.com/webcomponents-dev/packd-es>

### 2019-09-09\[类库]

一个可以将草稿转化 HTML 的工具，利用了机器学习来生成页面。 你可以手画一些东西，然后将其直接生成静态页面。缺点也很明显，一方面是静态的，因此没有什么交互，对于交互强的应用没什么用。其次就是生成的是 HTML，可维护性会比较差，如果生成类似 JSX 这样的中间产物可能会好一点。当然市面上其实已经有了生成 JSX 产物的开源框架了。 地址：<https://github.com/ashnkumar/sketch-code>

### 2019-09-06\[学习方法, 好文]

如何培养自己的程序员思维。- Problem-solving is the meta-skill. 文章地址： <https://learnworthy.net/how-to-think-like-a-programmer/?utm\\_source=quora\\&utm\\_medium=referral>

### 2019-09-05\[类库]

这是微软开源的内部用来构建大型应用的工具库，包括接口管理，文档管理，代码仓库管理等。 地址： <https://github.com/microsoft/web-build-tools>

## 关注我

我重新整理了下自己的公众号，并且我还给它换了一个名字`脑洞前端`，它是一个帮助你打开大前端新世界大门的钥匙 🔑，在这里你可以听到新奇的观点，看到一些技术尝新，还会收到系统性总结和思考。

在这里我会尽量通过图的形式来阐述一些概念和逻辑，帮助大家快速理解，图解是我的目标。

之后我的文章会同步到微信公众号 `脑洞前端` ，你可以关注获取最新的文章，并和我进行交流。

另外你可以回复大前端进大前端微信交流群， 回复 leetcode 拉你进 leetcode 微信群，如果想加入 qq 群，请回复 qq。

![](https://p.ipic.vip/bp35i7.jpg)


