本文发自 http://www.binss.me/blog/the-powerful-javascript/,转载请注明出处。

好吧,虽然当了一回标题党,但Javascript如今确实越来越无所不能。本文是我在了解、学习和折腾Javascript相关技术中的一些总结,主要包括:ECMAScript 6、Node.js、Electron、AngularJS(相信你已经猜到我在折腾什么了,已弃坑,一个悲伤的故事)。由于浅尝辄止,如文中有不到位或错误的地方,欢迎指正。

Javascript

已经不是当初看犀牛书和蝴蝶书时的Javascript了。

特性

ECMAScript 6

向javascript加了一大堆语法糖。如解构、模版、类与继承、Mixin、迭代器、生成器、Promise、Module、用=>定义函数、lambda函数等。

ECMAScript 7

瞄到有async和await。

可以用Babel来将ES6/ES7转(编译)成低版本兼容的代码。

小结

很好很强大,越来越Python,生产力提高了不少。

Node.js

基于V8的JavaScript运行环境。

特性

事件驱动 + 异步非阻塞I/O

统一了前后端JavaScript的编程模型。多条命令可以同时被运行,并通过回调函数(担心Callback hell?Generator + Promise 带你飞)得知命令已结束运行。

实际上是通过事件循环和请求对象来实现的。Node将I/O操作封装成请求对象,推入线程池(libuv)等待执行。在每轮事件循环都会检查是否有完成的请求,如有则取出并调用相应的回调函数。

模块多

npm上一搜一大把,随便挑。没有找不到,只有想不到。

小结

非常适合快速开发Web Server,能够较好地处理高IO的场景。

Electron

基于Node.js和Chromium,为用JavaScript提供了桌面应用的运行时。简单来说就是一个把原来的网页应用封装成单独APP的框架。

特性

开发成本低

可以完全复用网页的HTML、CSS、JavaScript代码,同时可以跨Windows、Linux和Mac OS。npm上一堆模块拿来即用。

调用系统资源

比如能够弹出native菜单栏、消息窗口、通知,获取系统的偏好设置等。

前后端通信

主进程和渲染进程是相互隔离的,可以看做是前端与后端。主进程(main.js)负责具体逻辑,能够require各种模块;而渲染进程只负责渲染页面,除了多了一些Electron提供的接口外,和传统前端并无太大区别。因此两者需要通过ipcMain/ipcRenderer模块进行数据交换。双方监听某个channel,然后通过channel进行特定数据的收发。

小结

上一个引领潮流的跨平台界面框架是Qt,当初用来折腾过课程大作业,个人觉得学习成本还是比较高,界面丑。Electron通过使用HTML、CSS、JavaScript,开发人员能够更轻易地写出酷炫的交互界面。

AngularJS

前端库,适用于开发单页面Web应用。

特性

控制反转(Inversion of Control)

为了减少组件间的耦合(避免require来require去无法复用组件),采用注入手段来加载依赖组件,将依赖的创建转移给了外部。

  • 推断式注入

    使用者给函数添加形参,如$xxx,在compile时通过toString()得到$xxx字符串,然后找到名为xxx的模块,实例化后注入。但这种注入无法抵抗压缩。

  • 内联注入

    模块实例化时第二个参数是一个数组,如["$xxx", "$yyy", function(){}],确保名称不被压缩。

  • 标记注入

    添加一个叫$inject的属性存放依赖数组。

双向绑定

采用MVVM(Model-View-ViewModel)

View和ViewModel双向绑定,双方中一者的变动将引起另一者同步变动。这样避免了jQuery时代频繁改Dom和从Dom拿数据的麻烦。

脏检测

当特定事件发生后,进入digest阶段,检查model有无变更,若有变更,设置为dirty,最终统一更新view。

模块

用于标识在一个Angular应用,同一个页面可以有多个应用,应用之间互不干涉。不支持运行时添加依赖。

小结

用起来很爽,但却大大提高了开发的复杂度,从此开始Web不再“所写即所得”。作为一名后端,渲染出来的DOM不知道应该怎么调试。

总结

未来Javascript自成体系,一统天下(误),成为全栈工程师不再是梦。前端框架将逻辑层和展示层分离,已经能够胜任更复杂的应用场景。后端Nodejs性能不错,各种组件应有尽有,能够快速开发。在桌面端套个Electron装原生(Atom、VS Code、Kitematic等)。在移动端套个Cordava装原生。

在Javascript的汪洋大海中游了两周后,我还是决定收手了,为啥?

  1. 非目标

    直至今天,我给自己定的目标还是朝后端方向发展。

  2. 坑太多

    虽然StackOverflow能够解决大多数的坑,但剩下的那些坑往往让作为业余选手的我想砸电脑。Time killer。

  3. 框架太多、迭代太快

    深刻体会到什么叫语言不够框架来凑。印象中两三年前Angular还是新奇东东,如今那帮大佬都跑去开发Angular 2去了。然后又诞生了React、Vuejs等酷炫框架。框架的迭代速度非常快,昨日的接口今天可能就已被废弃。

  4. 性能问题

    虽然一份代码到处乱跑的感觉很爽,但是在性能上可能还存在瓶颈。比如M$大牛搞出来的VS Code用了很多黑科技,总体使用还不错,但依然有点卡卡的感觉,不如Sublime流畅(于是我又滚回Sublime的怀抱了)。在使用POI时CPU分分钟飙到25%并吞掉若干内存。感觉要追上native应用还有很多路要走。

Javascript的未来可能是一场变革,也有可能是一场梦,让我们拭目以待。