TypeScript 强类型 JavaScript – Rafy Web 框架选型
今天看到了 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 坦克游戏》改造一下试试。
敬请期待。
相关文章:
《Dart、CoffeeScript、TypeScript 和 JavaScript 哪种最适合专门学习?》
TypeScript 强类型 JavaScript – Rafy Web 框架选型的更多相关文章
- Atitit.js javascript的rpc框架选型
Atitit.js javascript的rpc框架选型 1. Dwr1 2. 使用AJAXRPC1 2.2. 数据类型映射表1 3. json-rpc轻量级远程调用协议介绍及使用2 3.1. 2.3 ...
- web前端框架选型
1.1.界面使用脚本语言有html5,php5,css3,js动态库jquery等 1.2.html采用技术为最新html5技术,html5生成的页面在phone.pad.Phablets.pc也可方 ...
- 探讨后端选型中不同语言及对应的Web框架
在进行后端选型的时候,实际上我们要选择的是一个框架.后端领域所使用的技术和框架已经趋于稳定,我们只需要按我们的需要选择所需要的框架.当存在多个框架适合时,我们再选择适合的语言.不得不指出的是,当我们喜 ...
- web前端技术框架选型参考
一.出发点 随着Web技术的不断发展,前端架构框架.UI框架.构建工具.CSS预处理等层出不穷,各有千秋.太多的框架在形成初期,都曾在web领域 掀起过一场技术浪潮,可有些却仅仅是昙花一现,随着他们用 ...
- python笔记-19 javascript补充、web框架、django基础
一.JavaScript的补充 1 正则表达式 1.1 test的使用 test 测试是否符合条件 返回true or false 1.2 exec的使用 exec 从字符串中截取匹配的字符 1.3 ...
- 全 Javascript 的 Web 开发架构:MEAN
http://developer.51cto.com/art/201404/434759.htm 全 Javascript 的 Web 开发架构:MEAN 引言 最近在Angular社区的原型开发者间 ...
- 2017年要学习的JavaScript的顶级框架和主题
JavaScript的流行促进了一个非常活跃的由相关技术,框架和库组成的生态圈的发展.整个生态圈的多样性和活跃性越来越强,这让许多人变得越来越困惑. 你应该了解些什么技术呢? 我们应该将时间花费在 ...
- Go实战--也许最快的Go语言Web框架kataras/iris初识(basic认证、Markdown、YAML、Json)
ris自称是Go语言中所有Web框架最快的,它的特点如下: 1.聚焦高性能 2.健壮的静态路由支持和通配符子域名支持. 3.视图系统支持超过5以上模板 4.支持定制事件的高可扩展性Websocket ...
- go语言最快最好运用最广的web框架比较(大多数人不了解的特性)
令人敬畏的Web框架 如果你为自己设计一个小应用程序,你可能不需要一个Web框架,但如果你正在进行生产,那么你肯定需要一个,一个好的应用程序. 虽然您认为自己拥有必要的知识和经验,但您是否愿意自行编写 ...
随机推荐
- 【解决方案】Myeclipse 10 安装 GIT 插件 集成 步骤 图解
工程开发中,往往要使用到集成GIT ,那么下面说说插件安装步骤 PS:以Myeclipse 10 为例,讲解集成安装步骤. ----------------------main------------ ...
- 苹果强制使用HTTPS传输了怎么办?——关于HTTPS,APP开发者必须知道的事
WeTest 导读 2017年1月1日起,苹果公司将强制使用HTTPS协议传输.本文通过对HTTPS基础原理和通信过程内容的讲解,介绍APP开发者在这个背景下的应对办法. 几周前,我们在<htt ...
- 13、零配置Struts2开发
Convention 插件 从 Struts 2.1 开始, Struts 可以使用 Convention 插件来支持零配置: Convention 插件完全抛弃配置信息, 不仅不需要使用 strut ...
- .Net 大型分布式基础服务架构横向演变概述
一. 业务背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便于运维及监控. 二. 基础 ...
- 使用NUnit为游戏项目编写高质量单元测试的思考
0x00 单元测试Pro & Con 最近尝试在我参与的游戏项目中引入TDD(测试驱动开发)的开发模式,因此单元测试便变得十分必要.这篇博客就来聊一聊这段时间的感悟和想法.由于游戏开发和传统软 ...
- [Django]用户权限学习系列之设计自有权限管理系统设计思路
若在阅读本片文章遇到权限操作问题,请查看本系列的前两章! http://www.cnblogs.com/CQ-LQJ/p/5609690.html和http://www.cnblogs.com/CQ- ...
- linux-centos6.5之ssh配置
查询\安装SSH服务 #rpm -qa |grep ssh 检查是否装了SSH包 #yum install openssh-server 没有的话,安装SSH服务 #chkconfig --list ...
- 谈谈document.ready和window.onload的区别
在Jquery里面,我们可以看到两种写法:$(function(){}) 和$(document).ready(function(){}) 这两个方法的效果都是一样的,都是在dom文档树加载完之后执行 ...
- 机器指令翻译成 JavaScript —— No.3 流程分割
上一篇 我们讨论了跳转指令,并实现「正跳转」的翻译,但最终困在「负跳转」上.而且,由于线程模型的差异,我们不能 1:1 的翻译,必须对流程进行一些改造. 当初之所以选择翻译,而不是模拟,就是出于性能考 ...
- Xamarin.Android活动的生命周期
一.前言 用过Android手机的人一定会发现一种现象,当你把一个应用置于后台后,一段时间之后在打开就会发现应用重新打开了,但是之前的相关的数据却没有丢失.可以看出app的“生命”是掌握在系统手上的, ...