Skip to content

为什么微信的登录一定需要手机

2020年2月24日

来自知乎的问题,原地址https://www.zhihu.com/question/270040312/answer/1034679430

先说结论:微信是一个移动端通讯工具,再通俗一点,它就是一个手机软件。至于电脑版什么的,就是随手一做,如果威胁到手机版的地位,关掉都不会有人心疼的。

知乎确实迎来新一辈的朋友了,似乎已经没有多少人知道微信诞生的背景,也没有人在乎背后的逻辑了。微信在知乎上的口碑也从一开始的神作,变成了最被唾弃的软件。

先问几个问题:

  1. 微信10亿左右的月活用户(最近没翻财报,但大约是这个数字,量级不会错),你们猜有没有1亿人使用PC微信?
  2. 为什么你一边骂着微信,一边却离不开微信?

使用Rebase操作抹去Git仓库中的敏感信息

2019年11月29日

cover

Sequelize的一些小技巧

2019年11月10日

Sequelize.js是一个用于Node.js的数据库ORM库,支持Postgres、MySQL/MariaDB、SQLite、SQL Server等引擎。

本文记录一些团队在使用Sequelize过程中积累的经验教训。

介绍

ORM即Object Relational Mapping,中文叫“对象关系映射”。简单地说就是可以将数据库的各种对象(表、字段)及关系映射为程序语言的对象和关系,从而使开发者不需要直接操作数据库,转而操作对象即可。

例如,将表user映射为模型User后,从数据库中查询id1的用户就可以直接调用findOne()方法:

javascript
const user = await User.findOne({
    where: {
        id: 1
    }
});
const user = await User.findOne({
    where: {
        id: 1
    }
});

这样做会带来几个明显的好处:

  1. 降低开发难度:ORM都有完善的文档,几乎所有的操作只需要按文档调用指定方法即可,不需要自己拼接SQL
  2. 提升安全性:ORM会处理好SQL注入问题,不需要开发者关注
  3. 降低封装复杂度:公共逻辑可以基于ORM封装,非常方便

下文不区分“模型”和“Model”,均指Sequelize中与数据表对应的数据模型。

【问答】为什么会允许babel这种解析工具的存在?

2019年3月28日

本文来自知乎问题为什么会允许babel这种解析工具的存在?

希望提问者真的没有在调侃……因为在我看来,这有点像“何不食肉糜”的提问了。

ES6又名ES2015,也就是在2015年定稿的,在定稿之前其实大家已经讨论了很久了。但是光讨论有什么用呢?没有任何一个环境是支持ES6运行的。所以就讨论讨论再讨论,然后大家一拍桌子,好,定稿?

事实上在ES2015之前,ES5可能就是这么定下来的,ES4可能也是这么废弃的。

这时候,就有个神奇的东西,叫6to5出现了,它的第一次提交出现在2012年9月。Initial import · babel/babel@aedcd4e 它的作用就是把ES6的代码编译成ES5的代码,它的神奇之处就在于,虽然一个能支持ES6的环境都没有,但是我们仍然可以使用ES6来编写代码。这是一种前所未有的模式,甚至在其它语言中都没有出现过这种模式。(希望不是孤陋寡闻,至少py3 -> py2是没有见到类似工具的。)

于是,我们可以在规范还没有定稿的时候就先用用看,用着觉得不爽了再回去修改规范。这样是不是比拍桌子要科学得多?事实上现在的ES规范制定过程就是这么干的,定了stage 0到stage 4等几个级别,而且规定了需要在多少个环境中先验证,验证完之后才可以定稿发布。基本上可以毫不客气地说,这个东东就是由6to5开创的新局面。

2018小结

2019年2月3日

时间像一位长者,慢慢把生活的真相一层一层剥开给你看。

2018年像一溜烟,还没来昨及看清,就已然消失不见,留下我一个人,站在这里不断回想,它究竟是个什么样子。

“人在沮丧的时候特别喜欢思考人生。”这是我在4月份说的,大概也是在沮丧的情绪中不断反思而得出的结论。这种沮丧大部分要来自泥沙俱下的股市。“牛市的时候人人都觉得自己是股神”,这些话,也只有到山穷水尽的时候才能真正明白。好在,除此之外,倒也并没有什么真的大风大浪,一边跟着时间走,一边安慰自己,竟也就这样过来了。

【问答】如何看待“代码没有写到10万行不要碰设计”这样的观点?

2018年7月29日

本文来自知乎问题如何看待“代码没有写到10万行不要碰设计”这样的观点?

有些答主可能误解了题主说的“设计”的意思。这里不是指代码设计或者工程设计,指的是交互和视觉设计。

1 前端需要对交互和视觉设计有一些认识,这是完全没有问题的

比较硬的关系是,你会接设计同学出的设计稿,如果一点不了解设计领域的知识,拿到稿件会手足无措。适当地了解设计理论、方法、软件使用以及设计稿的常用处理(蒙版、切图、切片、变换、拼接等),是前端必备的工作知识。

比较软的关系是,前端是离用户最近的工程师,需要对用户体验负责。很多时候设计稿输出来的是静态的,但是用户交互的是一个动态的页面,如何把这些交互做好,设计和前端基本上各有一半的能力和责任。

如何与NPM package-lock.json愉快地玩耍

2018年7月26日

背景

对的,最近写文章都会交代一下背景。因为按标题的套路,这本应该是一篇教程类的文章,但这种文章其实挺无趣的。之所以想写这篇,是因为确实碰到了一些很麻烦的事情。闲言少叙,我们进入正题。

最近我们前端代码打包正在接入Gitlab CI,使用Docker来作为Executor,也就是在Docker中进行前端代码打包,然后收集打包结果,以备发布时使用。打包时Docker镜像很自然地就选择了官方Node镜像,最新版本(Node 10)。

一开始我们尝试性地接入了几个项目,有使用NPM scripts进行打包的,也有使用Gulp进行打包的,一切都很正常。但是昨天在接入一个新项目,使用Gulp打包的时候,却突然碰到了报错:

sh
$ gulp gitlab-ci
gulp[85]: ../src/node_contextify.cc:631:static void node::contextify::ContextifyScript::New(const v8::FunctionCallbackInfo<v8::Value>&): Assertion `args[1]->IsString()' failed.
Aborted
ERROR: Job failed: exit code 134
$ gulp gitlab-ci
gulp[85]: ../src/node_contextify.cc:631:static void node::contextify::ContextifyScript::New(const v8::FunctionCallbackInfo<v8::Value>&): Assertion `args[1]->IsString()' failed.
Aborted
ERROR: Job failed: exit code 134

看了一眼这个错误信息,一下子就发现,这并不是来自JS层的错误,而是来自Node原生层,这就超出了我的理解范围了。

记一次企业微信webview bug排查

2018年7月24日

cover

【问答】2018年的前端是否有『架构』可言?

2018年5月28日

【问答】如何评价锤子科技推出的TNT工作站?

2018年5月16日

Nginx + Koa 开启http/2 server push

2018年5月15日

cover

2017年科技新闻热点分析

2018年3月5日

cover