热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TypeScript实战分享:Google工程师深度解析TypeScript开发经验与心得

本文由编程笔记#小编为大家整理,主要介绍了工程师亲述在 Google 从事 TypeScript 工作的独家体会!相关的知识,希望对你有一定的参考价值。 【CSDN编者按】多年来,Google为
本文由编程笔记#小编为大家整理,主要介绍了工程师亲述在 Google 从事 TypeScript 工作的独家体会!相关的知识,希望对你有一定的参考价值。





【CSDN编者按】多年来,Google为了开发大型Javascript应用程序而构建了大量基础架构。


今天,就来听听在TypeScript上工作了两年多的Google软件工程师Evan Martin,对此有什么心得体会吧!


工程师亲述在 Google 从事 TypeScript 工作的独家体会!

我已经在TypeScript上工作了两年多了,所以我想写一两篇文章来回顾这两年的工作。首先,我应该写一个标准的免责声明:我只是一家公司的一个普通的工程师,公司拥有数万名工程师,肯定会有人对我在这里表达的观点持有不同的意见。


工程师亲述在 Google 从事 TypeScript 工作的独家体会!

谷歌很早就开始做Web应用程序


Google很早就开始做Web应用程序了。我简直无法相信Gmail发布已经14年了。在当时使用Javascript是非常疯狂的做法。Gmail的工程师不得不担心IE糟糕的垃圾回收算法,他们需要手动将字符串文字从for循环中提取出来,以避免GC(Garbage collection垃圾回收机制)停止工作。

最近我发现了一个那个时代的设计文档,他们当时在考虑做我们现在称为Javascript“压缩”的东西,但一些备选工具只能在Windows上使用。在今天看来,这些都难以想象。

这些年,Google为开发大型Javascript应用程序,构建了大量基础架构。例如,有一个模块系统可以让源文件表述它们的相互依赖性。有一个捆绑程序可以组合并压缩源文件,生成可以兼容浏览器的产品。

另一个程序可以通过可动态加载的入口点来分析应用的依赖关系图,并分解出公共的块供其他块使用。服务器端的渲染很常见。对于如今的Web开发人员来说,所有这些概念载熟悉不过了,但Google的技术栈很早就有了,而且一直在发展,因此在概念上类似,但具体方面完全不同,Google拥有不同的流程、工具,甚至不同的概念名称。

还有个例子可以说明并行发展:Google、Facebook和Microsoft各自构建了类似但不兼容的编译器,这些编译器向Javascript添加了静态检查。

Google的编译器常被称为Closure。(请不要与Clojure语言混淆;为了避免混淆需要说明一下:ClojureScript使用的是Closure编译器。)

Google的Javascript堆栈非常棒。有了它的帮助,Google才能编写并维护可以改变互联网的web应用程序。(还记得Google地图发布时,多么令人震惊吗?如今制作一个可以拖拽的地图小部件似乎非常简单。)

Google地图的一些技术甚至超越了当今最好的技术。例如,Closure编译器可能仍然是最复杂的Javascript优化程序,它能够执行很多操作,例如利用类型信息优化代码,跨越热加载的块的边界进行函数内联,以及在符号层次删除未使用的代码等。

Google的Javascript技术栈也存在一些问题。linter的渐进式发展表明了Closure只不过是个拥有静态类型的Javascript,其中新功能是通过注释引入的。

Closure的语句难以捉摸,速度很慢,有很多Bug,而且如果你不会正确地使用的话,那么它往往会破坏你的代码。尽管它是开源的,但也许是正因为这些原因,除了熟悉它的Google员工之外,行业中并没有广泛使用到它。

Javascript在Google内部的反响并不好,我认为部分原因在于我们对工具很挑剔,大家既嫌静态语言过于繁琐,又嫌动态语言不可捉摸。


工程师亲述在 Google 从事 TypeScript 工作的独家体会!

Javascript出乎意料地流行了起来


与此同时,在Google之外,Javascript也在不断发展,甚至出乎意料地流行起来了。我们构建了Chrome,部分原因是为了解决IE的那些垃圾回收Bug,但也因此催生了了v8,再由v8产生了Node.js。

最后导致今天大多数的Web工具都是用Javascript编写的,尽管Google习惯用Java构建这种工具。模块系统(UMD、AMD、CommonJS)迅速发展。(随之出现了ES6,并发明了自己的模块系统,但是由于某种原因它与其他所有模块系统不兼容,唉!)

NPM统一了工具和库的共享方式。Webpack可以在开发期间,将模块动态地切换到正在运行的应用程序中。

Google一概没有用到这个技术。Google的那些经验丰富的Web开发人员像是生活在另一个时间线中。我们有像SASS这样的CSS预处理语言,但它不是SASS而且没有人喜欢它。精心设计的块分割程序并不能真正支持第三方Javascript库,部分原因是这些工具的出现早于Javascript的库生态系统。

这都只是历史。你可以说我们本不应该这么做,但这么说却无法改变现状。相反,有趣的问题是:接下来我们该何去何从?有几个选择。我的观点肯定是偏向我喜欢的技术。


工程师亲述在 Google 从事 TypeScript 工作的独家体会!

接下来我们该何去何从


第一个诱人的选择就是放弃眼前的一切,并从头开始建造一个没有Javascript的新世界。如果我们投入更多精力到GWT(一个将Java编译成Javascript的Google项目)或Dart(一个将新语言编译成Javascript的Google项目)或WASM,或者你最喜欢的语言:Clojure?Haxe?还是Elm?那么我们根本不需要担心Javascript!

作为PL爱好者,我非常喜欢这个想法。我想仔细分析一下这个想法,但是这篇文章已经够长了,而且我认为已经有很多关于这方面讨论的文章了。

作为反驳,我有一些常见的问题:如果采用一种不同的语言,那么第一个问题是,这对于我们现有的数百万行代码没有任何帮助——“用新语言从从头开始重写”等想法在某些情况下是正确的选择,但是如何充分利用Gmail工程师的时间是一个很难的问题;第二个问题是,对于我们想聘请的经验丰富的前端工程师来说,也几乎没什么用。

与重写一切相对的做法是不改变任何东西。您可能会说,公开的Javascript世界充满了业余和不成熟的代码。一个优秀的工程师总能适应我们特殊的前端方式,我们总能改进或构建更多自己的工具。

我们构建的应用类型(Google搜索页面每天可以获得数十亿次点击)与其他人构建的web应用程序不同,我们的工具既优秀又很有必要性。我非常赞同这种观点。

我认为在权衡利弊的时候,有一种看法认为建立我们自己的工具很有道理,而另一种看法则认为我们已经远离主流,我们的工具是一种负担。

那么争论的焦点是我们究竟处在什么位置,我相信我们不属于后者。我们为LLVM / Clang做出的贡献获益良多,因为我们依赖于C++,但是我们构建自己的LLVM,并不能从中获得更多额外的价值。


工程师亲述在 Google 从事 TypeScript 工作的独家体会!

我们应该折中


所以,我觉得我们应该折中,这也是我们的团队一直在追求的道路:逐步采用一些合理的外部工具,并弄清楚这些工具如何才能与我们现有的代码库相互合作。

这项任务并不那么有趣,因为我们不会只是单纯地抛弃历史遗留的混乱或者“这次做正确的事情”,但我喜欢更谦虚地思考,不要固步自封。

为了Google的Javascript世外桃源重回大陆,我们要做的第一步是:采用了一个支持良好的静态检查器:(1)不是我们自己做的; (2)很流行,同时与我们现有的代码相似;(3)旨在搭建通往Javascript的桥梁;(4)旨在支持大规模的开发,这才是我们定制工具的根本原因。而这个工具就是TypeScript。 

Closure编译器的优势在于优化输出,而TypeScript具有出色的用户界面且根本没有优化。因此这两个工具可以互补,并且(有些工作)可以结合在一起。

因为TypeScript已经很好用了——毕竟只有这样我们才会采用它——所以我们获得了许多采用已有语言的好处,比如IDE风格的代码自动补齐,以及能够从StackOverflow获取答案。

留给我们的主要工作是集成:允许我们的应用程序逐步转移到TypeScript,而无需从头开始重写。我们在与Google的构建系统集成时非常谨慎,我们采用了渐进式编译,这对大型应用程序至关重要;而且一个模块中的变更不会影响使用了该模块的API,也不会导致下游模块需要重新编译。

我们与Closure类型/模块系统的集成意味着ES6 TypeScript模块可以导入Google模块系统中的模块,而且保留了(大部分)类型信息。一家公司成功地使用了我们发布的工具,自动将其整个代码库进行了转换,同时保留他们压缩后的输出。

现在Google内部,各个地方都或多或少地使用了TypeScript;如果您使用Google的产品,那么意味着你已经与一些TypeScript代码打过交道了。TypeScript本身就是一系列有趣的折衷方案,它将静态类型的编程语言与自由转换的Javascript生态系统进行了平衡。

我们工程师也会这么做:我们也会做出有趣的妥协,试图平衡不同的问题。我希望将来可以写更多关于多年来发现的一些有趣的小事。正如刚开始使用TypeScript时我写下的这篇文章一样(http://neugierig.org/software/blog/2016/02/revisiting-typescript.html),我认为TypeScript在设计领域内做出了很好的权衡。



原文:http://neugierig.org/software/blog/2018/09/typescript-at-google.html


译者:弯月,责编:胡巍巍



推荐阅读
  • 算法和数据结构是计算机科学中最基础和最重要的两个主题,在软件开发中无处不在。我坚信,对这两个主题的充分了解对于成为一名更好的程序员也很关键, ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 在Python编程中,探讨了并发与并行的概念及其区别。并发指的是系统同时处理多个任务的能力,而并行则指在同一时间点上并行执行多个任务。文章详细解析了阻塞与非阻塞操作、同步与异步编程模型,以及IO多路复用技术的应用。通过模拟socket发送HTTP请求的过程,展示了如何创建连接、发送数据和接收响应,并强调了默认情况下socket的阻塞特性。此外,还介绍了如何利用这些技术优化网络通信性能和提高程序效率。 ... [详细]
  • Node.js 教程第五讲:深入解析 EventEmitter(事件监听与发射机制)
    本文将深入探讨 Node.js 中的 EventEmitter 模块,详细介绍其在事件监听与发射机制中的应用。内容涵盖事件驱动的基本概念、如何在 Node.js 中注册和触发自定义事件,以及 EventEmitter 的核心 API 和使用方法。通过本教程,读者将能够全面理解并熟练运用 EventEmitter 进行高效的事件处理。 ... [详细]
  • 《软件测试精要》深度解析与实战经验分享
    《软件测试精要》深度解析与实战经验分享,系统梳理了软件测试的核心概念与关键原则,结合实际项目中的测试经验和教训,详细探讨了测试分类、测试权衡要素、测试效率、测试覆盖率以及测试框架的引入和用例设计等内容,为读者提供了全面而实用的指导。 ... [详细]
  • 2017-09-07前端日报精选JavaScriptEventLoop机制详解与Vue.js中实践应用Redux基础与实践如何用js获取虚拟键盘高度?( ... [详细]
  • Facebook 强一致性键值存储 ZippyDB 架构简介
    更多内容关注微信公众号:fullstack888Facebook工程团队最近发布了一篇博客文章,阐述了如何构建其通用的键值存储的,也就是Z ... [详细]
  • SocialFi 的未来:数据所有权、更公平的价值分配和行为数据的价值化
    SocialFi本质上是对Web2中心化社交平台的一次价值解构。撰文:Morty ... [详细]
  • 本文详细解析了计算机设备的型号命名规则,并提供了各品牌的相关资料。具体包括设备名称、品牌、型号、规格配置、生产厂商、数量、单价及金额等信息。例如,直播机房的安装与集成涉及9套设备,总控系统的安装与架构为1套,文艺录音棚的安装与集成则需详见附录中的技术参数。 ... [详细]
  • 机顶盒,即数字电视机顶盒(Digital TV Set-Top Box,简称STB),是一种放置在电视机旁的设备。它主要用于将数字信号转换为电视能够识别的模拟信号,从而实现高质量的视频和音频播放。机顶盒不仅支持基本的电视节目接收功能,还具备多种增值服务,如互动点播、网络浏览等。随着技术的发展,现代机顶盒集成了更多的智能功能,成为家庭娱乐的重要组成部分。 ... [详细]
  • STAR: 转录组数据分析中的高效比对工具介绍
    欢迎关注“生信修炼手册”!STAR 是一款专为 RNA-seq 数据设计的高效比对工具,以其卓越的速度和高灵敏度著称。该软件在处理大规模转录组数据时表现出色,能够显著提高比对效率和准确性。此外,GATK 推荐使用 STAR 进行预处理步骤,以确保后续分析的可靠性。 ... [详细]
  • 求助高手:下载的压缩包中包含CMake文件,如何在Windows环境下使用已安装的CMake GUI进行运行?
    从GitHub仓库 `https://github.com/vonmax007/RobotSimulation` 下载的代码包含多种算法,其中算法1的文件目录中包含了CMake文件。为了在Windows环境下使用已安装的CMake GUI运行这些文件,需要先确保CMake已正确安装,并按照以下步骤操作:打开CMake GUI,设置源代码路径和构建路径,点击“Configure”配置项目,然后点击“Generate”生成构建文件。最后,在生成的构建目录中使用命令行或IDE进行编译和运行。 ... [详细]
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • 2022.01.13 激活(JetBrains全家桶)
    (2022.01.13 激活)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~I ... [详细]
  • Java对接支付宝的支付、退款、提现
    本篇主要是正对Java对接支付宝的常用功能,需要开通个人的沙箱环境和内网穿透(我用了阿里云服务器)。集成前提:开发者在集成和开发前需要了 ... [详细]
author-avatar
手机用户2502927615
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有