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框架,但如果你正在进行生产,那么你肯定需要一个,一个好的应用程序. 虽然您认为自己拥有必要的知识和经验,但您是否愿意自行编写 ...
随机推荐
- 【原】AFNetworking源码阅读(三)
[原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...
- 关于Layer弹出框初探
layer至今仍作为layui的代表作,她的受众广泛并非偶然,而是这五年多的坚持,不断完善和维护.不断建设和提升社区服务,使得猿们纷纷自发传播,乃至于成为今天的Layui最强劲的源动力.目前,laye ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- Java列表
Java列表踩过的坑 其中subList是RandomAccessSubList,不是序列化的列表,不可以加入tair. 加入tair测试代码 @Autowired private CacheMana ...
- BI分析受阻?FineBI推出SPA螺旋式分析新功能!
过去,企业级的数据分析通常会有这么几种场景,业务部门托信息部门分析数据,结果报表一出,唇枪舌剑争论你我高低,数据不准,指标不对.信息部门欠缺业务概念,业务部门不懂技术逻辑,数据分析之路,暂时搁浅. 后 ...
- Git(1)
安装Git 完毕 (在开始菜单打开的话,打开的不是你想要的路径,切换路径很麻烦) 1.D盘新建 GitTest 文件夹 2.打开GitTest , 在空白的地方右键, 3.单击 Git Bash He ...
- php安装threads多线程扩展
php5.3或以上,且为线程安全版本.apache和php使用的编译器必须一致.通过phpinfo()查看Thread Safety为enabled则为线程安全版.通过phpinfo()查看Compi ...
- IP报头
位字段的值设置为二进制的0100表示IP版本4(IPv4).设置为0110表示IP版本6(IPv6) 位,它表示32位字长的IP报头长度,设计报头长度的原因是数据包可选字段大小会发生变化.IP ...
- 【一起学OpenFoam】01 OpenFoam的优势
CFD技术发展到今天,已经超过了大半个世纪了,已经涌现出非常多的CFD软件可供人们使用.通用商业CFD软件譬如Fluent.CFX.Star CCM+等在工业上得到了广泛的应用,另外一些专用的软件(如 ...
- Windows10自适应和交互式toast通知[1]
阅读目录: 概述 toast通知的结构 视觉区域(Visual) 行为(Actions) 特定场景下的Toast通知 带多内容的通知 带行为的通知(例子1) 带行为的通知(例子2) 带文本输入框和行为 ...