从2015到2018,WEB与时光与我

Posted on Wed 10 January 2018 in 遗迹

故事

新的一年如约而来又不期而至,在感叹又年长了一些的同时,也是时候再来一次一年一度的告别与再见的仪式了。

我是一个有些执着于“记录”的人,从开始接触编程到现在有许多年了,过去的代码却还大多能找到,但是很散乱。于是从2015年起,我有了一个新的习惯:每年按照年份创建一个文件夹,在这一年中无论是郑重开坑,还是要做点繁重些的杂务,都在这个年份文件夹里创建一个目录来存放源码。当然太简单的代码用过就不必储存,基本上都随着IEP的关闭一起消失在茫茫内存之中了。

但是这样仍有些乱糟糟的,后来为了直观看出这些项目谁先谁后,于是在文件夹前面加了序号,成了“XX.项目名”这样的格式。

每一年开年的时候,就是和上一年的大部分代码说再见的时候了。创建好新一年的文件夹之后,我会挑选一些上一年的项目。如果项目还在写的话,我就把那目录复制一份到新一年的文件夹里,旧的就永远定格在那一天,这就是我的告别与再会。我觉得时光是一个有些神秘的词汇,而这些代码文本在一定程度上描绘了属于过去某段时光的我,因此也好像也具有了些别样的意义。可能大部分人都希望回到从前,但现实是只能在时光易逝的无奈中向前走着。而在翻阅这些目录的同时,也仿佛在审视自己的过去。

2015年

我们先从有记录的最早一年开始。2015年在web领域算是一个转折点,后知后觉地,我们可以说ES6的正式发布算是一个标志性事件,从此以后前后端分离成为主流的开发方式。但是事实上整个生态链的成熟更加功不可没,今天流行的众多框架和工具都在2014年左右立项,并在2015年基本成熟,包括Webpack、Vue.js、AngularJS 2,而React和TypeScript则要更早到2013年。

值得一提的是Babel.js也是这一年改为这一名字的(以前叫6to5),我认为这是JS今日局面的最大功臣。在这之前,由于老JS实在是不堪用,各种转译器群雄并立,纷纷割据一方,整个前端的局面是狼烟四起,山河破碎,并在一定程度上波及了使用nodejs的后端。

然而在这一年之后,在Babel.js这面旗帜之下,全新面貌的JavaScript可以算得上是一扫寰宇,无人可敌,于是几乎所有转译语言都滚蛋啦。毕竟有着一个正统的名号,又很是Pythonic,那些转译器就算再来十个也不够打的。

不过在这之前呢?我们还是回到新旧交替的2015年吧。先来看看这一年的我。

2015年的我前后开了45个小坑,多与web有关,其中大概有一半是各种练习和试做。真正认真下些功夫的恐怕也就一掌之数,其中一些项目在未来的几年还会多次见到。有些项目在历年的变化也反映了相当有趣的结果……

我学会的第一个python web框架是web.py,在上古的时代,PHP很稳定的占据了沉默的多数,而ROR则是潮流的代表,一时名声大噪。而python这边,则是Django、Tornado、Flask、Bottle、Web.py几家纷争,当然了,今天我们仍然能看到它们,而且还有一些新的小伙伴。

不过在那些古老的时代,基本要么使用Django全家桶,要么使用一套经典的组合方案:Web框架、ORM、模板引擎。Web框架在除了Django的几个里面选,ORM基本上就是SQLAlchemy,模板引擎则是以mako和jinja2为代表。总之大家都是MVC架构,不过我更喜欢Django的MVT的叫法(Model View Template),尽管我不太喜欢Django。

因此在2015年的前半部分,我仍然是延续了这样经典的思路,不过这个时候我对这一套已经比较熟练了,也基本上形成了自己的习惯,那就是 SQLAlchemy + Tornado + Mako 三件套,为此还搞了一个cli,也就是在图中出现的第26个项目 fpage 了。https://github.com/fy0/fpage

我们找个典型来看一看:

model

view

static

template

这就是标准的MVT模式了。可以看到,这一年的我还在使用Python2,不过也同时考虑了对Python3的支持。而前端方面这时我还在使用 Coffeescript …… 唉,往事不堪回首啊。这一时期,前端在某些程度上从属于后端,我这里的html文件中实际上有很多模板语法,但他们是由后端往里传值,并进行渲染的。当然了,模板中少量的逻辑代码也遵从 Python 语法。

而在下半年,我接触到了Vue.js,同时也摸了摸TypeScript。TS于我有如擦肩而过,终于不再相见,而Vue.js却相伴至今。

这就是2015年了。

2016年

可能跟我在这年潜心学习,颇有一点两耳不闻窗外事的意思有关,这一年好像没发生什么大事,Web届世界和平。我在这一年自然而然的上了 Vue.js 全家桶的船,从此不做……不对,从此又一次跟上了大部队,体验了一些新时代的新魔法。ES2015 stage-2 深得我心,从此再也离不了 async await 语法。

我这边过渡到了前后端分离的开发方式,想必看起来风平浪静的业界应该也是如此吧。感觉这一年大家对于MVVM框架的讨论变多了,而我使用的 Vue 和 webpack 也纷纷进行了大版本的更新,它们都在这一年得到了很大成长。

这一年的目录一共是32个,我也在Web之外接触了一些新的领域。第一项的tinyre也是一个我的老项目,这是一个3千行左右c99实现的正则引擎,不过实际上之前一直都处于很多bug的状态,2015年末到2016年差不多重写了一遍,补了很多test,基本可用了。不过作为学习项目,其实还是非常僵硬的,执行效率相当的差……

还是回到Web上来,这一年我们抓的典型是22号选手,叫做SingleNote的,也就是我的博客程序的初始名字了。但后来一想,这名字不甚吉利,于是改成了StoryNote。

这是一个前后端分离的项目,其实很多时候会选择建立前端后端两个repo,对于公司项目的话无可厚非,但个人项目来说我觉得太过麻烦了。

可以看到,后端基本上还是那个样子(这也是从fpage生成出的),主力是 tornado + peewee(另一个ORM框架),但是实际上这时候后端已经只提供API接口了,templates目录虽然存在,但并没有实际用到。另外可以注意到,这个时候只有py3的临时文件,我已经完全迁移到py3,而且不再考虑向下兼容。 前端则是vue-cli生成出来的,形状也比较典型。不过实际上,这个项目在这一年并没有写完……而是鸽置到了下一年。

2017年

终于来到了刚刚过去的2017年。

这一年Web领域比较大的事情算是有一件,那就是React的协议之争。我等吃瓜群众隔岸观火,场面有来又回也不算十分劲爆。当然最后以Facebook的屈服告终,删了那个 PATENTS了事。但是虽然React的专利授权虽然被删了,但是Facebook很多其他项目里还有这个,其中就有我很看好的YogaLayout,这让我有些心有戚戚焉。

而对我来说的变化,首先是由于觉得不切实际,把序号从三位数改成两位数。另外随着对新的编程套路的熟悉,又有了一些新的大胆的想法。

话说大家应该也能看出来,由于每年前几个项目都是从上一年搬过来的,一般代表了一种美好的祝愿。然而现实是冰冷残酷的,老项目往往遭逢暂时鸽置的命运,人在江湖,身不由己啊。

这一年大概在年中的时候产生了一些新的思路,大致就是感觉现在的后端写着没什么意思,就是一些增删改查。这样一来我还不如后端只控制一下用户权限,把查表的操作让渡给前端。这样数据表直接对应api,建表后直接就能开始写前端,爱查什么查什么。

啊,还画了一个草图。不过既然掏不出干货,那贴图就只是象征性的,字也很丑大家不必细看。

总之这一想法下的产品就是一个基于aiohttp的框架slim,还有一个用于验证框架可行性的实践项目Icarus:

https://github.com/fy0/slim

https://github.com/fy0/Icarus

目前他们都在开发阶段,而且没文档没测试,所以基本没什么参考价值。我现在也顾不上写文档,当然等写好了之后,我会郑重一些介绍这两个项目的。

话说Icarus这个项目可能看了前文的人会觉得眼熟……没错,这就是2015年已经出现的那个项目,不过后来被用新的技术方案完全重写了(还没写完,不过老方案其实也是半成品)。我们还是用这个项目再举个例子:

可以看到是一个典型的 vue-cli 模板项目了。有人可能问那后端呢?后端在backend目录里,这个样子:

真是越混越惨了。15年的时候前端模板从属于后端,16年平分秋色,17年完全反过来了,唉。

2018年

刚开年,就一图流吧。

希望这几个项目不要继承前辈的光荣传统,当然我也会努力更新的!