最近参加了第三届JSConf中国开发者大会,这里谈谈两天下来自己的一些感受。
首先不得不说一下主办方还是很厚道的,大会的内容很紧凑,涵盖了各个方面的内容。
对于我才刚刚毕业一年时间的新人来说,确实是开了不少眼界。也再一次感受到了自己的经验还很不足。
这里谈谈一些印象比较深刻的部分,以下意见仅代表个人观点,有错的地方请大家指正。。。
Then.js 异步库的实现原理及优缺点 – 严清
大家在只写过前端JavaScript,没有真正写过Node的项目的时候,可能体会不到什么叫做callback hell。
前端JavaScript很少会出现一个callback套了很多层callback的情况。而Node由于异步I/O的存在,Node几乎所有的函数都有callback。
这就导致了Node代码入门容易,想写好却很不容易。
第一个speaker最先分享了关于callback hell的一些解决方案和他们的优缺点
Event模式
使用JavaScript中最重要的模式来解嵌套,这个方案的原理是使用EventEmitter来解嵌套。
实际使用中感觉这个方案并不是很适合来解决嵌套问题(虽然可以解决), 它更适合做它原本应该做的事 – 实现事件发布和订阅机制
Promise/Deferred模式
这个模式其实绝大部分前端都使用过,最常见的例子就是JQuery中封装的$.ajax了,它允许我们先发送请求,而后再确定如何处理数据。
var promise = $.ajax('get/something');
//do something...
promise.success(function() {
//...
});
他的缺点是每个业务都要单独封装(比如ajax业务, fs业务等)
Generator, Thunk等模式
这些模式还没有实际使用经验,不做评论,等有机会实践后在评论。
then.js
现场没有听明白,下载了ppt结果发现ppt也没说明白,坑爹。先follow下有机会再试用。
据作者描述性能远超其他所有库,而且代码简短,写出来的代码风格也好。如果真是这样那还真是解决了一大难题了= =
淘宝前后端分离实践(中途岛) – 赫门
长久以来,MVC中的所有部分都是交给后端工程师去实现,而前端工程师负责的部分往往就是切图。
这种职责划分不得不说是欠妥的。后端不单包办了数据库交互,控制器,数据输出,甚至还去实现了大部分的前端效果。
而前端由于只负责了切图,导致时常出现html结构和实际前端效果所需要的html结构有很大的出入,出现需要返工重写结构,css的情况时有发生。
当然不单单只有这么些问题,后端需要将静态页面改成动态模板也导致了前后端的信息不统一。
在之后的更新改动中,前端改动的是静态页面,后端则需要去观察静态页面的改动,再把改动移到模板中,这中间可能发生的各种各样麻烦事。
就跟代码为什么要重构一样,前后端的关注点和职责也应该更加分离。
我们不应该从硬件环境来区分职责(browser和web server),而应该从工作职责上来区分。
现在有了Node,前端有了接触后端业务的良好环境。
而且,更因为Node在处理I/O密集型的业务时更胜PHP/JAVA这些语言一筹,View和Controller的任务交由前端来做也是有理有据的。
目前,淘宝首页和详情页正是采用了这种后端负责数据和业务逻辑, 前端负责路由设计,控制逻辑和浏览器端的html,css和js的设计。
并且已经有更多地项目开始实践这种职责分工, 相信他们的实践会给我们指明今后的道路。
Peer-Directed Collaborative Projects – 大神James Halliday
他的分享我觉得比起这个题目更应该说是他个人一年内所做的项目的总结,内容很多,每个项目都非常有创意,很抱歉大部分我都没太听懂。。。
唯有browserify总算是懂了一些。
现在在浏览器前端,主要流行的模块化方案主要有两种RequireJS和seaJS。
RequireJS(定义了AMD规范)是提前执行,推崇依赖前置。
seaJS(定义了CMD规范)是延时执行,推崇依赖就近。
这里吐槽一下我们的G。js的简介是A AMD implementation inspired by seaJS。
明明是实现了AMD规范,却表示自己灵感来自seaJS,囧。
这两种方式各有千秋,但是都和Node实现的CommonJS有差别,其中最明显的就是多了用define函数来包覆js文件了。
而browserify则是实现了前后端JavaScript统一规范的写法。他可以让浏览器端一样可以使用形如
var module1 = require('module1');
这种形式来引入模块,甚至可以把npm包和Node原生模块一起封装到前端真正做到前后端代码可以复用。
只能说大神的想法,你不服不行,别人也是真正做到了消灭前后端代码差异。browserify绝对是大会上的一个亮点。
目前所了解到的一个缺点是,browserify由于采用的是预编译的形式来封装代码,相比RequireJS和seaJS来说,可能在合并公共JS代码的时候会比较不方便。 而这种all-in-one的js封装形式,因为经常要下载更新后的JS文件,在代码频繁修改的时候也会影响到用户加载速度。
如果browserify能推出封装公共代码的封装方式的话,肯定会更加完美。
ps:大神真不愧是大神,自带unix小本本,大会期间代码写的飞起,单身20多年的手速什么的。。。
如何持续技术学习 – 玉伯
一个乍看没什么技术含量的标题和乍听之下不怎么滴的口才,却是我当时很关注的一个分享。所以也来说说
如何持续技术学习难道不是每个技术最应该关心的话题吗?
时间管理 情绪管理
“其实我们并不需要时间管理 需要的是情绪管理与适量自律”
我本身是一个很情绪化的人,所以我很同意情绪不但会影响我的效率,也会影响我的学习积极性。
保持一个愉快的心情去学习去工作远比,什么年度计划表有意义的多。
适当地自律远比用什么番茄工作法来强迫自己来遵守时间来的有效。
毕竟学习不是用逼就能学好的。
知识管理
- “投入在 Input 上的时间越多,知识管理越差”
- “最好的阅读是产出。”
这个简直不能同意更多,其实很多时候我们mark了很多技术文章,其中派上用场的却寥寥无几,
更多的是mark下来的时候那爽快感,就好像mark了,看了一遍,就学会了一样,殊不知还没等到睡觉你已经全忘光了。
最好的学还是去用,去产出。被动的接受知识远没有抱着疑问去寻求答案来的有效率。
梦想
梦想不是空头支票,需要你投入相当的时间和知识,再加上一个平和的情绪去实现它,要做一个有追求的程序员。
总体感受
国内倾向于分享实际应用中的产物,比如异步库then。js,淘宝前后端分离实践,BlendUI等。
而国外的分享感觉更加天马行空一些,比如James Halliday的所有分享trumpets,browserify, Jacob GroundWater的NodeOS等。
有很多其他分享也不错,时间不多这里就不一一回顾了。
顺便感慨下,James Halliday大神的手速真是吊的一b,光凭他能一边演讲一边以打字聊天般的手速写演示代码就足够让我五体投地了。
晚上回旅馆follow了他的github,看到那满满的几乎没有断过的提交后更是哭晕在厕所。
未来应该更多地参与开源的项目,学好英语,有益于别人,更有益于自己进步。