如何实现类似 lodash 的 get 与 merge 函数

lodash 基本上成为了写 javascript 工具库的标配,它广泛应用在各种服务端以及前端应用中,但是它的包体积略大了一些。对于服务端来说,包的体积并不是十分的重要,或者换句话说,不像前端那样对包的体积特别敏感,一分一毫都会影响页面打开的性能,从而影响用户体验。

正因为前端包体积对于用户体验的重要性,因此有各种各样减小包体积的方法。针对 lodash 来说,你完全不必要引入 lodash 的所有工具函数,你只需要按需引入或者直接使用单函数包。关于按需引入你可以参考以下文章

Lessons on tree-shaking Lodash with Webpack and Babel

在针对我的个人站点中的 lodash 进行优化时,如果没记错的话,lodash 从以前 gzip 后的 80KB 变为了 20KB,相对来说还是比较大。而当我全局搜索了 lodash 的引用之后,发现 90% 的场景都是在使用 _.get

另外,随着 ES6+ 的发展,以及浏览器与 Node 对它的支持,很多 lodash 的函数都很容易自己来实现或者说已被实现,如 _.assign_.trim_.startsWith 等等已被 ES6+ 实现,而 _.uniq 又很容易通过 new Set() 来解决。有人就在 github 上总结了 you-dont-need/You-Dont-Need-Lodash-Underscore,其中囊括了很多工具函数很简易的实现。

从数据库到前端,使用 enum 代替 constant number

在我经历过的几个以node为主的后端项目中,都有一个文件 constant.js。顾名思义,里边保存着各种常量,而大多是字符串与数字的对应关系。

但是在实际工作中,根据数字来调试相当费劲,先不说后端代码中 where (status === 1) 这种可避免的神奇操作。(PS: 虽然我在吐槽它,但是有时我也会犯,给后来不熟悉业务者一脸懵逼…)。在数据库中查询也会遇到一些问题。

[登录那些事] 邮件发送,限流,漏桶与令牌桶

前段时间,我使用了 jwt 来实现邮箱验证码的校验与用户认证与登录,还特别写了一篇文章作为总结。

在那篇文章中,提到了一个点,如何限速。

在短信验证码和邮箱验证码,如果不限速,被恶意攻击造成大量的 QPS,不仅拖垮了服务,也会心疼如水的资费。鉴于君子固穷的原则,在我的邮箱服务里加上限速。

关于如何限速,有两个比较出名的算法,漏桶算法与令牌桶算法,这里对其简单介绍一下,最后再实践在我发邮件的API中

scala 入门指南

前言

环境

如果你正在学习或者只想敲几个示例,那么强烈推荐 Scastie,一个嵌在浏览器中的线上编辑器。

如果你更喜欢 REPL 环境在自己的 scala shell 中学习和测试,则需要首先安装 sbt,使用 sbt 进入 scala shell。

jwt 实践邮件验证与登录

去年我写了一篇介绍 jwt文章

文章指出如果没有特别的用户注销及单用户多设备登录的需求,可以使用 jwt,而 jwt 的最大的特征就是无状态,且不加密。

除了用户登录方面外,还可以使用 jwt 验证邮箱验证码,其实也可以验证手机验证码,但是鉴于我囊中羞涩,只能验证邮箱了。

另外,我已在我的试验田进行了实践,不过目前前端代码写的比较简陋,甚至没有失败的回馈提示。至于为什么前端写的简陋,完全是因为前端的代码量相比后端来讲实在过于庞大…

另外,如果你熟悉 graphql,也可以在本项目的 graphql-playground 中查看效果。

博客域名更换操作记录

拖延了半年后,我终于在最近把我的域名 https://shanyue.tech 通过了备案。新域名可以更好的贴合我的博客,趁此对我的域名进行更换

如果刚开始就使用新域名,倒是很简单。但是更换域名就需要做一些额外的琐碎的东西了,记录一下

使用纯 CSS 实现仿 Material Design 的 input 过渡效果

以前一段时间,基于对 nextgraphql 的调研,再加上本人的兴趣,我做了一个站点,也作为我以后各种技术折腾,实践以及兴趣交汇的试验田。

最近我需要在我的实验田使用 jwt 实践校验码的功能。校验码,就是指注册时邮箱或者短信的校验码。需要校验码则需要有登录注册,而在登录注册时,为了多写一些 CSS,我决定实现一个 Material Design 的表单过渡效果。

实现效果见 诗词弦歌 - 登录

开始之前,你先看看是否认识以下几个选择器。如果不,那么通过本文你可以学习到以下几个选择器,以及他们的试用场景

  • :not(:empty)
  • input:not([value=""])
  • input:valid
  • input:not(:placeholder-shown)



记录一个有关 curl 和 tar 的小问题

这是我今天在工作时遇到的一个有关解压的问题,先还原下问题

今天在解压一个压缩包时解压失败,以下是命令以及失败提示

$ curl -O https://github.com/alibaba/canal/releases/download/canal-1.1.3/canal.deployer-1.1.3.tar.gz
$ tar -zxvf canal.deployer-1.1.3.tar.gz

gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now

这里首先提示,造成这个问题的原因以及解决方案很简单,对你很有可能没有借鉴意义。不过寻找原因的过程以及从这个问题上学到的东西还是有点意思的。

kafka 从入门到入门

最近工作中需要使用到 Kafka,基于 mysqlbin logpostgresWAL log 把数据发布到 KafkaKafka 另外一大用途主要用作消息中间件,虽然没有在业务系统中使用它作为消息队列,但这也是一个令人心动的功能。趁此契机,从环境搭建,系统原理,到生产使用再系统过一遍 Kafka