从来没有人认为JavaScript会成为世界上最重要的语言。它从Scheme和Self那里借鉴设计思想,揉合了C语言的代码风格,在十天之内就被临时拼凑了出来。以至于它的名字也是一个令人尴尬的组合——它和另一个几乎没有任何共同之处的语言 (除少数几个关键字之外)联系到了一起 。但JavaScript一经推出就势不可挡。它作为唯一所有主流浏览器都支持的脚本语言,很快便成为了Web开发领域的“世界语”。而在21世纪初期,随着Ajax 技术的风靡,起初仅为网页做些小点缀、微不足道的JavaScript,瞬间作为富应用程序开发语言而羽翼丰满起来。 随着JavaScript的走红,不满之声也从四面八方涌来。有人指责它有大量的语言“怪癖” 及各种浏览器间实现不一致的问题。其他人则抱怨它缺乏类和继承的特性。而那些刚刚从Ruby或Python入门编程的新人也不太喜欢JavaScript,觉得使用它纷杂的大括号、圆括号以及分号阻碍了他们施展拳脚。 有几个敢于冒险的家伙做了一些Web应用开发框架,使用这些框架可以把其他语言写的代码编译为JavaScript。比较著名的有Google的GWT和280 North公司的Objective-J。但是,没有几个程序员愿意在浏览器和他们之间架上一个厚重的抽象层。他们情愿继续小心翼翼地处理着JavaScript的各种缺陷,委屈求全于它的“精华部分”(也就是Douglas Crockford 在2008年出版的《JavaScript语言精粹》中描述的那些特性)。 直到现在依然如此。 镇上来的新小伙 2009年圣诞节,Jeremy Ashkenas首次发布了CoffeeScript语言,他称之为“JavaScript那不怎么惹人注目的小兄弟”。每个月,Ashkenas和其他人都会给CoffeeScript添加大量的新特性,很快,该项目便在GitHub 上吸引了成百上千的关注者。2010年3月,原本使用Ruby编写的CoffeeScript编译器,也由CoffeeScript重写的版本替代了。 2010年圣诞节CoffeeScript发布1.0版,成为GitHub上最受关注的项目之一。 2011年4月,当David Heinemeier Hansson 证实了有关于在Ruby on Rails 3.1中将支持CoffeeScript的传言时,CoffeeScript又受到了一波关注。 为何CoffeeScript流行得如此之快?我想有3个原因——它的熟悉度、安全性和可读性。 取其精华 JavaScript庞杂而无所不包。在提供众多优秀的函数式语言特性的同时,它还保留了命令式语言的风格。JavaScript这种微妙而强大的功能恰恰会让初学者倍感挫折:函数可以作为传递的参数,也可以作为函数的返回值,任何时候都可以给对象添加新的方法——一言以蔽之,在JavaScript中,函数是第一级对象。 CoffeeScript中保留了这些优良的特性,此外,它还提供了一套语法糖,以便开发者更好地使用它们。 编译优化 想象一下,如果有这么一门编程语言,它没有语法错误,且能让计算机忽略拼写错误的同时还竭力理解你的代码,那这世界该多美好啊!当然了,程序并不会总像开发者所期望的那样运行,但这也正是测试工作的意义所在。 现在再想象一下,你草草地把一次性写好的代码发布出来(其中包含拼写错误),全世界数不清的机器以它们略有不同的方式处理着你的小错误。突然之间,电脑忽略的那些语句直接宕掉了成千上万人使用的应用程序。 令人懊恼的是,现实世界就是这样。JavaScript没有标准的解释器,而数以百计的浏览器和服务器端框架都以各自的标准运行JavaScript。跨平台的不兼容问题让程序员们头痛不已。 当然,CoffeeScript并不能解决所有问题,但是其编译器尽力确保输出的JavaScript代码符合Lint 标准,该标准可以过滤掉常见的人为错误和不规范的惯用句法。当你输入2=3或者类似的毫无意义的代码时,CoffeeScript编译器就会主动提醒你——错误越早发现越好。 代码精简 写CoffeeScript很容易上瘾,为什么?请看下面这段JavaScript代码: 再看下面这段实现同样功能的CoffeeScript: 仔细观察就会发现,这段代码的字符数缩减了一半,代码行数减少了一半还多!类似这样的好处在CoffeeScript中随处可见。正如Paul Graham 所说:“简洁就是力量!” 简短的代码易于编写和阅读,更关键的是易于修改。代码越长就越麻烦,因为任何显著的改动都需要花费大力气。而短小精悍的代码块只需要敲两下键盘就能改好,并且还能促成一种更加敏捷、快速迭代的开发风格。 值得一提的是,切换到CoffeeScript并不是一个“非此即彼”的命题——JavaScript和CoffeeScript的代码还是可以自由地互相融合。CoffeeScript中的字符串和数字与JavaScript中的没什么不同;甚至于像Backbone.js 这样的JavaScript框架中的自定义类也能在CoffeeScript中运行。所以不必担心在CoffeeScript中调用JavaScript代码会出现什么问题,反之亦然。我们将在第5章讨论如何将CoffeeScript与JavaScript最流行的框架jQuery一起使用。 在CoffeeScript中嵌入JavaScript代码 还应该在这里提一下如何将JavaScript代码嵌入到CoffeeScript代码中。如下所示,使用反引号“`”包裹要嵌入的JavaScript代码即可: console.log `impatient ? useBackticks() :learnCoffeeScript()` CoffeeScript编译器会直接忽略掉反引号里的内容,这也就是说,比如你在反引号内声明一个变量,该变量并不受CoffeeScript作用域规则的约束。 在写CoffeeScript的时候,我没有一次需要使用反引号。毕竟,这种方式看不顺眼还好,怕的是搞不好就会出错。借用Troy McClure的金玉良言:“知道它怎么回事了吧——最好别用。” 故事就讲到这里,动手编代码才是真功夫,其他的只是等同于meta(即谈论代码编写), Jeff Atwood曾说过:“过多的meta就是谋杀。” 所以让我们再花那么一点点的篇幅来介绍下你手上这本书(我保证就只有几页了),然后我们就要开始噼噼啪啪地敲出些“热乎乎”的代码了。 目标读者 如果你对学习CoffeeScript感兴趣,那本书正好适合你!然而,由于CoffeeScript和JavaScript有着千丝万缕的联系,所以实际上本书贯穿了两种语言——但没有足够的篇幅把这两种语言都教给你。因此,笔者假定你在阅读本书之前已经对JavaScript有所了解了。 当然你不必是John Resig一样的“JavaScript Ninia”(JavaScript忍者) 。事实上,如果你只是个JavaScript业余爱好者那就太好了!通读本书会让你学到很多JavaScript知识。查看脚注给出的链接,就能找到我推荐的其他资源。如果你是编程新手,绝对应该先看看Eloquent JavaScript ,网上也有一个可以互动的版本。如果你已经有所涉猎,但想更专业点儿,那就读读JavaScript Garden 。如果你想要一个全面的参考,那没有比Mozilla Developer Network (Mozilla开发者社区)更适合你的了。 本书会提到很多Ruby的知识。CoffeeScript中诸多优秀的特性都是从Ruby那里来的,比如说隐式返回值、参数列以及if/unless修饰符等。同时也多亏了Rails 3.1,CoffeeScript在Ruby使用者中也有了大量的粉丝。所以,如果你是个Ruby爱好者,那非常棒,你已经先人一步了。如果不是,也别担心,看过一些例子,你就能轻松上手。 如果对本书有任何不清楚的地方,笔者建议你到本书的论坛 上去提问。尽管笔者尽力做到意思清晰,但计算机才是唯一能完全、直接地理解编程语言的东西——但它们不需要买什么书。 本书结构 我们将从挖掘编译和运行CoffeeScript代码的多种方式开始我们的CoffeeScript之旅。接下来我们会深入了解CoffeeScript的语言细节。每章都会介绍一些概念和规则,把它们结合到贯穿本书的示例项目中去(下一节将做详细介绍)。 要想掌握CoffeeScript,必须了解它与JavaScript领域的其他技术结合在一起如何运行。因此在介绍完语言的基础知识之后,我们将简单地了解下jQuery和Node.js。前者是最流行的JavaScript框架,后者则是一个令人兴奋的新项目——能够让JavaScript在浏览器之外运行!我们不会深入介绍这两个工具,主要看一下它们与CoffeeScript结合使用时的绝佳搭配。将它们的力量结合在一起,短短几个小时内就能写出一个完整的多人游戏来。 另外,不管处于什么水平,你都需要确保自己完成每章后面的习题。它们虽然简单但也有一定的挑战性,旨在帮助你了解一些令CoffeeScript程序员防不胜防的陷阱。试着自己把它们做完,之后可参阅附录A中的习题答案。 本书的示例代码、勘误表和讨论区都可以在PragProg相关页面找到:http://pragprog.com/titles/ tbcoffee/coffeescript。 关于范例游戏:5×5 每章的最后部分,我们会把新的概念应用于一个自创的名为5×5的拼字游戏之中。顾名思义,5×5游戏在一个5×5的网格上进行。游戏开始时每个小格子里会有一个随机的字母,然后玩家轮流交换方格中的字母,每一次交换之后为所有形成的单词打分(通常,每个移动的小格子可与周围的格子形成4个新的单词:横排一个、竖排一个以及两条对角线上的两个——只把从左到右方向上的单词算在内) ,如图1所示。 图1 命令行版和Web版5×5游戏,它们共用一份逻辑层处理代码 记分规则是以组成单词的那些字母在Scrabble 游戏中的点值叠加为基础,再乘以形成的不相同的单词的个数。因此,拿最好的情况来说,一次交换形成8个不同的单词,则每个单词的分数就都乘以8。已经在之前游戏中使用过的单词则不计算在内。 我们将在第2~4章中创建该游戏的命令行版本,然后在第5章将其移植到浏览器端;最后在第6章最终实现多人游戏的功能。你会发现从命令行移植到浏览器再到服务器上是如此容易——因为它们用的是同一种语言CoffeeScript。 CoffeeScript社区 一门伟大的语言少不了强大社区的支持。如果你遇到了问题,该到哪里求助呢? 到StackOverflow 上提问是个很好的办法(记得给你的问题打上coffeescript标签),附上困扰你的代码将会更加有效。如果想更快得到答案,通常可以到Freenode IRC 的#coffeescript频道找些友善的家伙问问。要是想讨论关于CoffeeScript杂七杂八的事情,试试谷歌小组。对于更为严肃的问题,比如说可能存在的bug,可以把它提交到GitHub上 。你也可以在那儿对新的语言特性提出要求。CoffeeScript还在不断的完善之中,开发团队欢迎任何形式的反馈。 说到文档,你或许已经在http://coffeescript.org上看到过漂亮的官方文档了。还有一份官方的wiki,网址为http://github.com/jashkenas/coffee-script/wiki。当然现在也包括你手上这本书。 如何联系我?我在Twitter上有@CoffeeScript账号,大家可以@我;也可以通过一种比较怀旧的方式——给我发邮件,我的邮箱:trevorburnham@gmail.com。 激动人心的Web开发之旅就要开始了,欢迎加入!
深入浅出CoffeeScript——前 言
书名: 深入浅出CoffeeScript
作者: [英] Trevor Burnham
出版社: 人民邮电出版社
原作名: CoffeeScript: Accelerated JavaScript
译者: 寸志
出版年: 2012-5
页数: 104
定价: 35.00元
装帧: 平装
丛书: 图灵程序设计丛书
ISBN: 9787115279743