今天看到了 AngularJs 2.0 版本将基于 TypeScript 构建 的消息。与同事们对 TypeScript 展开了讨论。本文记录一些个人的想法。

理想的 JavaScript 开发模式


其实早在 TypeScript 发布早期的时候,我就已经开始关注这个语言。因为在2012年初时,我需要为 Rafy/OEA 平台选型编写 Web 端自动界面生成框架:Rafy.js。而这个客户端框架需要基于一些流行的 JS 库来进行开发,当时选型的重点就是选择哪一个基础框架。

当时,我期望能找到一种可以编写大型 JavaScript 框架程序的开发模式。理想情况下,这种开发模式需要:

  • 支持面向对象设计。无疑,面向对象设计方法依然是当下最重要的设计方法。.NET、Java、C++ 等都是面向对象的语言。封装、继承、多态,大大的提高了程序的可重用性、可维护性、灵活性。所以,支持面向对象是大规模框架开发的必要条件。
  • 支持快速重构。我认为重构是高级开发者必备的一个非常重要的能力。没有不变的完美设计,只有不断进步的设计。框架中的依赖关系、调用关系往往比较复杂,虽然外部的接口要尽量保持稳定、兼容,但是框架内部的接口却会经常变动。而框架中动辄上万行、不重复的代码,如果没有对重构的支持,很难想象如何维护好这么多的代码。
  • 编译时错误检查、程序包管理、高效的代码提示……一说到代码的可维护性,可能我们都是在说程序本身的设计。但是开发工具的提升,也能大大提升开发者的开发效率,以及对程序代码的维护成本。所以上述的这些提升开发效率的功能,对于开发大型程序来说,也是必要的。

上面说的这些要求,对于强类型的 .NET、Java 开发来说,其实都是最基本的。但是,对于弱类型的动态语言 JavaScript 来说,却不是易事。弱类型、动态的特性,导致如果不到运行时,就很难确定一个变量的具体类型,所以也就很难提供代码提示、重构等。从我开发 JavaScript 的第一天开始,我就一直被这些问题困扰,希望未来有一天能有技术解决它们。

Rafy.js 的基础框架选型


当时在编写 Rafy Web 前端框架时,为了解决上述的问题,我挑选了几个方案。其中一个就是 TypeScript!我经过试用后发现,强类型的 JavaScript,确实可以解决这些困扰。但无奈的是,当时的 TypeScript 只是一个刚出生的婴儿,版本号 0.8,连第一个正式版本都没有发布,实在不敢用在真实项目上,由于项目的时间要求,所以不得不放弃了这个语言。

此外,我也考察了几个 JS 框架,最终选定了 ExtJs 4。一是因为我要做的是 SinglePageApplication 的 Web 界面框架,而 ExtJs 4 中带了大量的界面控件,非常方便使用;其次,ExtJs 4 提供了客户端的实体模型,这可以与 Rafy 服务端实体可以更好地结合起来。更重要的是,ExtJs 4 带来了全新的面向对象类型系统,这解决了面向对象设计的基础设施问题。虽说如 prototype.js 等其它框架也或多或少地支持了部分的面向对象设计,但是 ExtJs4 的类型系统,无疑是支持得最全面的:命名空间、封装、继承、接口、静态、单例、类型引用管理。所以,Rafy.js 最终是基于 ExtJs4 来构建的。

下面是当时 Rafy.js 开发完成后的框架类截图:

注意到,为了更好地解决开发过程中的上述问题。我们不得不人为地添加了一个《Javascript 类库开发规范》。该文档中的内容其实还是约定了一些封装、继承、多态的编写约定(ExtJS 给出的面向对象类型系统同样不完美)、以及一些代码的规范。这些问题,其实完全可以从语言、工具的角度解决,但是我们不得不人工约定、人工检查!

虽然 ExtJs4 大体上解决了面向对象设计的问题。但是由于重构困难,编写低效,导致 Rafy.js 的第一个版本只写了几千行,就已经感觉到维护起来很吃力了。

TypeScript


上面说了这么多,无非就是想表达:强类型很重要、重构很重要、工具很重要。而这些正是 TypeScript 语言设计的主要目标:“As we look to the 2.0 release, we 're focusing on two goals in addition to our main goal of bringing good tooling to JavaScript development.  The first is to align with ES6…….“

先来说明一下,TypeScript(强类型 JavaScript)的优势:

  • 更好的开发工具:支持重构、代码自动完成、代码导航、编译检查(静态代码分析:显示警告和错误)、程序包管理……
  • 更好的语言特性:类型指定、泛型、面向对象支持。
  • 兼容原生的 JavaScript 。

这正是我想要的东西,也是开发大型 JS 项目的利器。

但是,TypeScript 并不适应于所有的开发人员、所有的项目,下面是 TypeScript 适应的场景:

  • 适应较大、复杂的项目。例如 SinglePageApplication、大型 JS 框架、前端游戏。
  • 需要支持面向对象设计、高可重用性、组件化开发的 JS 代码。

下面是 TypeScript 不适应的场景:

一些简单的、不需要 OOD、灵活性高、动态性高的代码就不适合选择 TypeScript。例如一般性的 Web 应用或站点的前端开发,这种页面级的逻辑往往编写在页面中,即简单,也不需要 OOD;再如,JQuery 框架的开发,这种框架的目标是灵活、方便、动态,而不是面向对象,所以也不太适合,所以 JQuery 框架应该不会使用 TypeScript 来重写。

目前,TypeScript 已经发布了 1.4 版本。打开 Visual Studio 2013 的扩展管理器,即可安装:

接下来的计划


接下来,我将使用 TypeScript 来把 Rafy.js 重新编写。在正式改 Rafy.js 之前,我还会把之前做的这个 Web 游戏《Javascript 坦克游戏》改造一下试试。

敬请期待。

相关文章:

TypeScript MSDN Blog

TypeScript 官网

TypeScript 在线试用

Dart、CoffeeScript、TypeScript 和 JavaScript 哪种最适合专门学习?

为何TypeScript是任何事情的答案?

Type入门(JavaScript的超集)-译

TypeScript 强类型 JavaScript – Rafy Web 框架选型的更多相关文章

  1. Atitit.js javascript的rpc框架选型

    Atitit.js javascript的rpc框架选型 1. Dwr1 2. 使用AJAXRPC1 2.2. 数据类型映射表1 3. json-rpc轻量级远程调用协议介绍及使用2 3.1. 2.3 ...

  2. web前端框架选型

    1.1.界面使用脚本语言有html5,php5,css3,js动态库jquery等 1.2.html采用技术为最新html5技术,html5生成的页面在phone.pad.Phablets.pc也可方 ...

  3. 探讨后端选型中不同语言及对应的Web框架

    在进行后端选型的时候,实际上我们要选择的是一个框架.后端领域所使用的技术和框架已经趋于稳定,我们只需要按我们的需要选择所需要的框架.当存在多个框架适合时,我们再选择适合的语言.不得不指出的是,当我们喜 ...

  4. web前端技术框架选型参考

    一.出发点 随着Web技术的不断发展,前端架构框架.UI框架.构建工具.CSS预处理等层出不穷,各有千秋.太多的框架在形成初期,都曾在web领域 掀起过一场技术浪潮,可有些却仅仅是昙花一现,随着他们用 ...

  5. python笔记-19 javascript补充、web框架、django基础

    一.JavaScript的补充 1 正则表达式 1.1 test的使用 test 测试是否符合条件 返回true or false 1.2 exec的使用 exec 从字符串中截取匹配的字符 1.3 ...

  6. 全 Javascript 的 Web 开发架构:MEAN

    http://developer.51cto.com/art/201404/434759.htm 全 Javascript 的 Web 开发架构:MEAN 引言 最近在Angular社区的原型开发者间 ...

  7. 2017年要学习的JavaScript的顶级框架和主题

    JavaScript的流行促进了一个非常活跃的由相关技术,框架和库组成的生态圈的发展.整个生态圈的多样性和活跃性越来越强,这让许多人变得越来越困惑. 你应该了解些什么技术呢?   我们应该将时间花费在 ...

  8. Go实战--也许最快的Go语言Web框架kataras/iris初识(basic认证、Markdown、YAML、Json)

    ris自称是Go语言中所有Web框架最快的,它的特点如下: 1.聚焦高性能 2.健壮的静态路由支持和通配符子域名支持. 3.视图系统支持超过5以上模板 4.支持定制事件的高可扩展性Websocket ...

  9. go语言最快最好运用最广的web框架比较(大多数人不了解的特性)

    令人敬畏的Web框架 如果你为自己设计一个小应用程序,你可能不需要一个Web框架,但如果你正在进行生产,那么你肯定需要一个,一个好的应用程序. 虽然您认为自己拥有必要的知识和经验,但您是否愿意自行编写 ...

随机推荐

  1. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用

    再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高.和dezhou聊过之后我仔细考虑了一下, ...

  2. 算法与数据结构(十七) 基数排序(Swift 3.0版)

    前面几篇博客我们已经陆陆续续的为大家介绍了7种排序方式,今天博客的主题依然与排序算法相关.今天这篇博客就来聊聊基数排序,基数排序算法是不稳定的排序算法,在排序数字较小的情况下,基数排序算法的效率还是比 ...

  3. iOS逆向工程之App脱壳

    本篇博客以微信为例,给微信脱壳."砸壳"在iOS逆向工程中是经常做的一件事情,,因为从AppStore直接下载安装的App是加壳的,其实就是经过加密的,这个“砸壳”的过程就是一个解 ...

  4. 简记某WebGIS项目的优化之路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 背景 该项目为研究生时的老师牵头,个人已毕业数年,应老师要求协助其 ...

  5. 3种web会话管理的方式

    http是无状态的,一次请求结束,连接断开,下次服务器再收到请求,它就不知道这个请求是哪个用户发过来的.当然它知道是哪个客户端地址发过来的,但是对于我们的应用来说,我们是靠用户来管理,而不是靠客户端. ...

  6. Android中Activity运行时屏幕方向与显示方式详解

    现在我们的手机一般都内置有方向感应器,手机屏幕会根据所处位置自动进行横竖屏切换(前提是未锁定屏幕方向).但有时我们的应用程序仅限在横屏或者竖屏状态下才可以运行,此时我们需要锁定该程序Activity运 ...

  7. Atitit.研发团队与公司绩效管理的原理概论的attilax总结

    Atitit.研发团队与公司绩效管理的原理概论的attilax总结 1. 四个理念 1 1.1. 绩效管理的三个目的.四个环节.五个关键2 1.2. 绩效目标smart2 2. 考核对象2 3. 绩效 ...

  8. oracle常用函数及示例

    学习oracle也有一段时间了,发现oracle中的函数好多,对于做后台的程序猿来说,大把大把的时间还要学习很多其他的新东西,再把这些函数也都记住是不太现实的,所以总结了一下oracle中的一些常用函 ...

  9. [Hadoop in Action] 第7章 细则手册

    向任务传递定制参数 获取任务待定的信息 生成多个输出 与关系数据库交互 让输出做全局排序   1.向任务传递作业定制的参数        在编写Mapper和Reducer时,通常会想让一些地方可以配 ...

  10. 洛谷P1547 Out of Hay

    题目背景 奶牛爱干草 题目描述 Bessie 计划调查N (2 <= N <= 2,000)个农场的干草情况,它从1号农场出发.农场之间总共有M (1 <= M <= 10,0 ...