|
-- 會員 / 註冊 --
|
|
|
|
Learning TypeScript中文版 ( 簡體 字) |
作者:龍逸楠,蔡偉,迷走 | 類別:1. -> 程式設計 -> 網路編程 -> Javascript |
譯者: |
出版社:電子工業出版社 | 3dWoo書號: 45504 詢問書籍請說出此書號!【缺書】 NT售價: 445 元 |
出版日:10/1/2016 |
頁數:344 |
光碟數:0 |
|
站長推薦: |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
加入購物車 │加到我的最愛 (請先登入會員) |
ISBN:9787121300479 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言:譯者序 在 JavaScript社區的荒蠻時代里,構建大型 Web應用是一件吃力且煩瑣的事情。但迫于業務發展的需要,業界一直在探索如何像成熟的工業化的語言那樣開發和構建大型的應用。 微軟在 2009 年發布了 TypeScript的第一個版本,它為 JavaScript 帶來了類型系統與模塊系統(現在已經廢棄并鼓勵使用 ES6模塊)。而自從 TypeScript問世,JavaScript 社區就沒有停止過對它的議論,有人認為類型系統給 JavaScript 帶來的靜態檢查能力更有利于構建大型應用,而另一些人則認為類型系統會使 JavaScript 喪失其先天的靈活性和動態性,不利于提高開發效率。還有一些人擔心 TypeScript為 JavaScript 帶來了太多非標準的特性,很難保證 TypeScript在未來與 JavaScript在語言層面上保持高度統一。 譯者在翻譯本書前,剛剛經歷了將一個 CoffeeScript應用全面使用 TypeScript重構。 CoffeeScript 從某種程度上來看完全是 TypeScript的對立面,它甚至比 JavaScript 更具動態性與靈活性。而在譯者重構的這個項目中,代碼量高達上萬行,且包含數十個模塊,之所以選擇使用 TypeScript重構它,是因為日益增長的代碼量與模塊數使得團隊協同開發的難度越來越大。 也正是因為這次重構,使譯者能深入了解 TypeScript。它的類型系統異常強大,可以大大降低團隊中成員的溝通成本。以往,團隊中的成員需要調用另一個成員寫的模塊時,必須要仔細研究這個模塊中各個 API 的參數、參數類型和返回值。然而因為項目中通常缺乏文檔與注釋(這是另外的討論點),所以通常在使用其他人開發的模塊時會占用程序員大量的時間去閱讀和理解其他人的代碼。而 TypeScript的類型系統無疑是給了我們一個快捷的文檔,使得我們能更好更快地使用別人的模塊。即使是在擁有良好的注釋以及文檔的模塊中,TypeScript服務提供的 Intellisense 功能也能讓開發人員如虎添翼,再也不用擔心忘記參數類型或忘記方法名。 而另一方面, TypeScript過強的約束也在開發時給我們帶來了很多額外的困擾。比如在開啟了--noImplicitReturns參數后,一些設計成無返回值的代碼將會導致編譯失敗,比如: getOne(_id: string): string { const result = cacheService.exist(_id) if (result) { return cacheService.findById(_id) } } 由于這段代碼只有一個分支有返回值,所以它將導致編譯失敗,但我們正是期待代碼這樣運行。 同時,我們也接觸到了一些 TypeScript 的私有功能,比如 enum(枚舉)與 reflectMetaData(元數據反射)。出于對使用非標準特性的風險的考量,我們并沒有在項目中使用這些特性。 除了強大的類型系統帶來的可靠的靜態檢查以外,我們還驚喜地發現了一個能大大增加項目可維護性與健壯性的實踐,那就是依靠 TypeScript的類與接口將面向對象的 SOLID原則應用到項目中,這無疑是搭了類似 Java 與 C# 等面向對象語言的順風車,它能讓我們更容易地寫出高內聚低耦合的代碼。 所以在面對社區各種對 TypeScript褒貶不一的評價時,希望讀者能理性地看待這些聲音,并且能夠在深思熟慮之后進一步接觸 TypeScript,深入了解它的優點與缺點,最終為自己的項目選擇合適的工具。
關于作者 Remo H. Jansen是一位前端工程師、開源項目貢獻者、企業家、科技愛好者、游戲愛好者和互聯網愛好者。 他來自西班牙的塞維利亞,但目前居住于愛爾蘭的都柏林,并在那里做著一份金融服務行業的全職工作。Remo有著多年的大型 JavaScript應用開發經驗,從航班預定系統到投資組合管理解決方案。 Remo在 TypeScript社區中十分活躍。他是都柏林 TypeScript交流會的組織者,并且是 InversifyJS(一個 TypeScript應用的控制反轉容器)和 AtSpy(一個 TypeScript應用的測試框架)的作者。 致謝 這是我出版的第一本書。在此之前,我經歷了相當漫長的學習之路,并且從許多值得感謝的人那里,學到了許多知識。我首先要感謝地處特里亞納圣彼得慈幼會(位于西班牙的塞維利亞)的計算機科學學 院中的老師們,因為他們讓我體會到了教育的價值。感謝 Packt Publishing團隊的成員們的支持和努力工作,與你們的合作十分愉快。感謝本書的所有技術審校者,他們無價的反饋和努力工作顯著地提升了本書內容的質 量。感謝我的同事和室友,Sergio Pacheco Jimenez 和 Adolfo Blanco Diez,因為我常在半夜與前者進行漫長的技術交流,后者為我提供了大量咖啡飲料的支持。感謝我的女朋友,Lorraine,我為你無條件的支持和耐心深感榮幸。你就是世界上最好的女朋友,并且還在不斷變得更好。 最后,感謝我的家人,感謝你們相信我,為我提供指導,成為我最好的傾聽者,支持我的工作,原諒我所犯的錯誤,以及其他一切你們教會我的東西。感謝我們在一起所經歷的開心與傷心的時光。能夠成為你們的孫子、兒子和兄弟,讓我十分驕傲。
關于審校者 Liviu Ignat是一位全棧工程師、架構師、科技極客和企業家,從 2004年以來開始編寫商業軟件。一開始使用的是 VB6,接著開始使用 .NET和 Java,后來轉向了 Web前端開發。他對函數式語言十分感興趣,如 F#、Scala、Swift、JavaScript等。在他的一些最新的服務端 Node.js項目和大多數使用流行前端框架的項目中已經使用上了 TypeScript。 目前,他正致力于許多項目,大多數項目是 http://giftdoodle.com/中的,他是這個公司的 CTO,這家公司中大多數 JavaScript項目都使用 TypeScript編寫。在他的工作經歷中,他使用.NET編寫過分布式后端服務,也編寫過復雜的單頁 Web應用。最近他正致力于使用 Node.js和 Docker編寫微服務,編寫單頁 Web應用,以編寫 Android和 iOS原生應用。 當 Liviu不寫代碼時,他喜歡在冬天滑雪,在夏天坐帆船去國外,去世界的其他地方旅行。你可以在 http://www.ignat.email/聯系到 Liviu。 Jakub Jedryszek目前是微軟的一位軟件工程師。在審校本書時,他工作于 Azure Portal,這是世界上使用 TypeScript編寫的最復雜的單頁 Web應用。他也是 .NET開發者的 dotNetConfPL——online會議的共同發起人之一。 Andrew Leith Macrae最初在 Apple 的產品上開始了他的編程生涯。多年以來,他使用過 Hypercard、Director、Flash和最近的 Adobe AIR for mobile 開發交互式應用。并且在開發過程中,他也會用到 HTML。他目前是多倫多 Rogers Communications 公司的高級前端工程師,正在使用 AngularJS和 SASS進行敏捷開發。 他堅信 TypeScript是 JavaScript 的未來,TypeScript帶來了強類型面向對象語言中的結構化和規則,為開發大規模 Web應用的代碼編寫提供了語義上的便利。 Brandon Mills的編程生涯已經有十多年了,他就職過只有兩個人的初創公司,也在微軟就職過。他在微軟參與了 Visual Studio 2013、Azure Tools 和預裝于 Windows 10的 Edge瀏覽器項目。他也是 ESLint 項目的核心開發團隊成員之一,這是一個開源可配置的 JavaScript和 JSX的語法檢查工具。他目前在 Node.js平臺上使用 JavaScript或 TypeScript編寫應用和服務。 感謝 Scott 的激勵和給予我的靈感,感謝 Linda給予我無條件的愛,感謝 Abby給予我的耐心,以及感謝 Ashlynn 對我的支持。 Ivo Gabe de Wolff是一位 ivogabe(創始于 2012年)名下的自由職業開發者,他正在烏得勒支大學學習數學和計算機科學。當他只有 11歲時,便開始使用 Game Maker編寫游戲程序。在學了諸如 C# 和 JavaScript等諸多編程語言后,他在現在的大多數項目中使用 TypeScript。在過去的幾年里,他在許多不同的環境中使用過 TypeScript,如移動端應用。目前他主要致力于 Node.js 程序的開發。 另外,他也是許多開源項目的作者,包括 gulp-typescript。 前言 在過去的幾年里,基于 JavaScript的 Web應用的數量呈幾何級數進行增長。但是,目前的 JavaScript標準( ECMAScript 5,又稱 ES5)是在許多年前設計出來的,面對如今大規模 JavaScript應用的復雜性時,它缺少了許多必要的特性。正是由于這些特性的缺失,一些應用的可維護性問題暴露了出來。 新一代的 JavaScript標準(ECMAScript 6,又稱 ES6),旨在解決上述可維護性問題。但它還沒有完全實現,且現在我們使用的瀏覽器與之也不是完全兼容的。所以,ES6標準的廣泛采用,仍被認為是一個漫長的過程。 為了解決這類 JavaScript的可維護和可擴展性問題,微軟花了兩年時間開發出 TypeScript,并在 2012年 10月,公開發布了它: “我們為需要構建和維護大型 JavaScript程序的團隊設計了 TypeScript,以滿足他們的需求。TypeScript可幫助他們在軟件組件之間定義接口,并且幫助理解現存 JavaScript庫的行為。同時,使用 TypeScript的團隊可以將代碼構建成動態加載的模塊,以減少命名沖突的問題。TypeScript可選的類型系統使開發者們可以使用一些高效的開發工具和最佳實踐:靜態檢查,基于符號的導航,代碼補全和代碼重構。” ——TypeScript語言特性 1.0 即使是具有豐富經驗的開發者,也很難給出大規模 JavaScript應用明確的定義。當談及這個話題時,我們應該避免使用代碼行數來作為評判標準,而是應該以代碼中模塊的數量和模塊之間的依賴關系來評判應用的規模。我們將大規模應用定義為,需要眾多開發者一同維護且具有一定復雜度的程序。 本書將會運用簡單且易于理解的形式來介紹 TypeScript眾多的特性。當你讀完本書時,你應該知曉用 TypeScript構建大型 JavaScript應用所需的所有知識。本書不但提供了 TypeScript核心特性的介紹,還會帶領你探索一些有用的工具、代碼設計規則、昀佳實踐以及如何將它們用于生產環境中。 本書涉及的內容 第 1章介紹了 TypeScript的核心特性,包括可選的靜態類型提醒系統、操作符、函數、接口和模塊。同時還附有在實際環境中使用它們的例子。 第 2章介紹了一些自動化工具,如 Gulp和 Karma,用以昀大化開發者的生產力。另外,本章還介紹了一些在開發 TypeScript應用時,有助于你使用第三方庫的工具。 第 3章深入探討了 TypeScript中的函數。為了成為一個精通 TypeScript的開發者,本章還會告訴你關于異步編程需要知曉的一些知識。 第 4章深入探討 TypeScript中的面向對象編程,包含類、接口和模塊,并且推薦了一些昀佳實踐(SOLID原則1)。還會包括如繼承、混入和泛型,它們都有助于增強代碼的可復用性。 第 5章幫助你理解 TypeScript運行時的工作機制,將有助于避免一些潛在的性能問題,使得我們成為更高效的 TypeScript開發者。 第 6章講解了高效運用可用的系統資源的必要知識。這一章還會闡述測試 TypeScript應用性能的方法,以及如何自動化一些用于提升 TypeScript應用性能的任務。 第 7章介紹了如何使用 TypeScript測試工具來進行 BDD(行為驅動開發)測試。在這一章,你將學習到如何使用 Karma、Mocha、Chai和 Sinon.JS來編寫 TypeScript單元測試,如何使用 Nightwatch.js編寫端對端測試,以及如何使用 Istanbul來生成測試覆蓋率報告。 第 8章深入探討了裝飾器,包括類、屬性、參數和方法裝飾器。該章還會包括關于反射元數據 API 的介紹。 第 9章介紹了一些現代 Web應用的核心架構原則。該章會介紹單頁面 Web應用的概念,以及它的通用組件和特性(模型、視圖、控制器、路由和模板等)。該章還會通過實現一個單頁面 Web應用框架,來闡述你所需知道的一切。 第 10章通過使用 TypeScript以及本書其他章節所提到的概念,來實現一個單頁面 Web應用。
閱讀本書前需要做的準備 本書中的例子都是使用 TypeScript 1.5編寫的,你需要 TypeScript編譯器和一個文本編輯器。本書將會說明如何使用 Atom,但是你也可以使用其他的編輯器,如 Visual Studio 2015、Visual Studio Code或 Sublime Text。 你還需要一個能夠上網的環境來下載一些必要的依賴引用、包和庫,如 jQuery、Mocha和 Gulp。在一些操作系統下安裝本書中的一些工具,你可能還需要一個擁有管理員權限的賬號。
本書的讀者對象 如果你是一個想要學習 TypeScript來編寫漂亮的 Web應用的中等水平的 JavaScript開發者,那么本書正適合你。你只需對 jQuery的基本概念有所了解。 為了讓你能昀大化地運用 TypeScript語言和其編譯器,本書將會由淺入深地介紹 TypeScript的語言結構和面向對象的特性。本書還將展示,如何使用強類型、面向對象的原則、設計模式和一些昀佳實踐來輕松管理復雜的大規模 JavaScript應用。
約定慣例 本書將會使用不同的書寫風格來區分不同種類的信息。以下是這些風格的例子和它們的意義。 正文中的代碼、數據庫表名、文件夾名、文件名、文件擴展名、路徑名、 URL、用戶輸入和推特用戶定位將會用代碼體書寫,如“我們可以通過 include指令將其他上下文包含進來”。 代碼塊則會是下面這樣的風格: class Greeter { greeting: string; constructor(message: string) { this.greeting = message; } greet() {
return "Hello, " + this.greeting; } } 如果希望向你強調代碼塊中的一部分,那么它們將會以粗體展示: function MathHelper() { /* ... */ } // class methodMathHelper.areaOfCircle = function(radius) {return radius * radius * this.PI; } // class property MathHelper.PI = 3.14159265359; 任何命令行的輸入和輸出將是以下這樣的: git clone https://github.com/user-name/repository-name.git
警告和關鍵提醒將會在這樣的圖標后出現。 小提示和小技巧將會在這樣的圖標后出現。 勘誤表 雖然我們已經盡力謹慎地確保內容的準確性,但錯誤仍然存在。如果你發現了書中的錯誤,包括正文和代碼中的錯誤,請告訴我們,我們會非常感激。這樣,你不僅幫助了其他讀者,也幫助我們改進后續的出版。如發現任何勘誤,可以在博文視點網站相應圖書的頁面提交勘誤信息。一旦你找到的錯誤被證實,你提交的信息就會被接受,我們的網站也會發布這些勘誤信息。你可以隨時瀏覽圖書頁面,查看已發布的勘誤信息。 |
內容簡介:本書首先介紹了TypeScript 的基本語法和基本的自動化工作流配置方法,然后從面向對象入手,著重介紹了面向對象的概念和它的一些最佳實踐,并結合例子講解了如何基于TypeScript 的類型系統應用這些最佳實踐。隨后剖析了TypeScript 在編譯后的運行時行為,并從性能與測試的角度講解了如何編寫健壯的TypeScript 代碼,所以書中還包括了性能分析與測試相關的內容。最后介紹了如何使用TypeScript 結合面向對象、MVC 等概念,結合本書前面提到的自動化的工作流、面向對象最佳實踐、性能優化和測試等內容實現一個單頁應用(SPA)框架,并用這個框架構建了一個單頁應用。 |
目錄:前言 ............ XVIII
1 TypeScript簡介 ...... 1 TypeScript的架構 ......... 1 設計目標 ........... 1 TypeScript組件 ........ 3 TypeScript語言特性 ......... 4 類型 ............... 6 變量、基本類型和運算符 ... 7 流程控制語句 ......... 14 函數 ............. 18 類 ............... 20 接口 ............. 22 命名空間 ........... 22 綜合運用 ............. 23 小結 . 25
2 自動化工作流程 ...... 26 一個現代化的開發工作流程 ... 26 準備工作 ............. 27 Node.js ............. 27 Atom .............. 27 Git和 GitHub ........ 30 版本控制工具 ........... 30 包管理工具 ............. 34 npm .............. 35 Bower............. 38 tsd .............. 38 自動化任務工具 ......... 39 檢查 TypeScript代碼的質量 41 編譯 TypeScript代碼 .... 42 優化 TypeScript應用 .... 44 管理 Gulp任務的執行順序 . 48 自動化測試工具 ......... 50 使跨設備測試同步 ......... 52 持續集成工具 ........... 55 腳手架工具 ............. 56 小結 . 58
3 使用函數 .......... 59 在 TypeScript中使用函數 .... 60 函數聲明和函數表達式 ... 60 函數類型 ........... 61 有可選參數的函數 ..... 62 有默認參數的函數 ..... 63 有剩余參數的函數 ..... 64 函數重載 ........... 66 特定重載簽名 ......... 67 函數作用域 ......... 68 立即調用函數 ......... 71 范型 ............. 74 tag函數和標簽模板 ..... 77 TypeScript中的異步編程 ..... 78 回調和高階函數 ....... 79 箭頭函數 ........... 79 回調地獄 ........... 81 promise ............ 86 生成器 ............. 91 異步函數——async和 await 93 小結 . 93
4 TypeScript中的面向對象編程 .............. 94 SOLID 原則 ........... 95 類 ... 95 接口 . 99 關聯、聚合和組合 ....... 100 關聯 ............. 100 聚合 ............. 100 組合 ............. 100 繼承 . 101 混合 ............. 104 范型類 ............... 109 范型約束 ............. 113 在范型約束中使用多重類型 ............... 117 范型中的 new操作 ..... 118 遵循 SOLID原則 ......... 118 里氏替換原則 ....... 118 接口隔離原則 ....... 120 依賴反轉原則 ....... 122 命名空間 ............. 122 模塊 . 124 ES6模塊——運行時與程序設計時 .......... 126 外部模塊語法——僅在程序設計階段可用 ...... 127 AMD 模塊定義語法——僅在運行時使用 ...... 128 CommonJS 模塊定義語法——僅在運行時使用 ... 129 UMD模塊定義語法——僅在運行時使用 ....... 130 SystemJS模塊定義 ——僅在運行時使用 ....... 131 循環依賴 ............. 131 小結 . 133
5 運行時 ...........134 環境 . 135 運行時的一些概念 ....... 135 幀 ............... 136 棧 ............... 137 隊列 ............. 137 堆 ............... 137 事件循環 ........... 137 this操作符 ............ 138 全局上下文中的 this操作符 .............. 139 函數上下文中的 this操作符 .............. 139 call、apply和 bind方法 ... 140 原型 . 143 實例屬性與類屬性的對比 . 144 基于原型的繼承 ....... 147 原型鏈 ........... 151 訪問對象的原型 ....... 152 new操作符 .......... 153 閉包 . 153 閉包和靜態變量 ....... 155 閉包和私有成員 ....... 157 小結 . 159
6 應用性能 .........160 準備工作 ............. 160 性能和資源 ........... 161 性能指標 ............. 162 可用性 ........... 162 響應時間 ........... 162 處理速度 ........... 162 延遲 ............. 162 帶寬 ............. 163 可伸縮性 ........... 163 性能分析 ............. 163 網絡性能分析 ....... 163 網絡性能與用戶體驗 ... 168 GPU性能分析 ........ 172 CPU性能分析 ........ 174 內存性能分析 ....... 176 垃圾回收器 ......... 178 性能自動化 ........... 178 性能優化自動化 ....... 178 性能監測自動化 ....... 179 性能測試自動化 ....... 180 錯誤處理 ............. 180 Error類 ............ 181 try…catch 語句和 throw 語句 ............. 182 小結 . 182
7 應用測試 .........183 軟件測試術語表 ......... 183 斷言 ............. 184 測試規范 ........... 185 測試用例 ........... 185 測試套件 ........... 185 測試監視 ........... 185 替身 ............. 185 測試樁 ........... 185 模擬 ............. 185 測試覆蓋率 ......... 186 必要的準備 ........... 186 Gulp ............. 187 Karma ............ 187 Istanbul ............ 187 Mocha ............ 187 Chai .............. 188 Sinon.JS ........... 188 類型定義 ........... 188 PhantomJS ......... 189 Selenium和 Nightwatch.js 189 測試計劃和方法 ......... 190 測試驅動開發 ....... 190 行為驅動測試 ....... 191 測試計劃和測試類型 ... 191 建立測試基礎結構 ....... 192 使用 Gulp構建這個程序 . 193 使用 Karma運行單元測試 197 使用 Selenium和 Nightwatch.js運行 E2E測試 ..... 200 使用 Mocha和 Chai創建測試斷言、規范和套件 ..... 203 測試異步代碼 ....... 207 斷言異常 ........... 208 Mocha和 Chai的 TDD與 BDD對比 ......... 209 使用 Sinon.JS編寫測試監視和測試樁 ........... 209 測試監視 ........... 213 測試樁 ........... 215 使用 Nightwatch.js創建端對端測試 ............. 216 生成測試覆蓋率報告 ....... 217 小結 . 220
8 裝飾器 ...........221 條件準備 ............. 221 注解和裝飾器 ........... 222 類裝飾器 ........... 223 方法裝飾器 ......... 226 屬性裝飾器 ......... 228 參數裝飾器 ......... 230 裝飾器工廠 ......... 232 帶有參數的裝飾器 ..... 234 反射元數據 API ....... 235 小結 . 239
9 應用架構 .........240 單頁應用架構 ........... 241 MV* 架構 ............. 246 MV* 框架中的組件和功能 ... 247 model ............. 247 collection ........... 248 item view ........... 248 collection view....... 249 controller .......... 250 事件 ............. 251 路由和 hash (#) 導航 .... 251 中介器 ........... 254 調度器 ........... 255 客戶端渲染和 Virtual DOM .............. 256 用戶界面數據綁定 ..... 256 數據流 ........... 258 Web component 和 shadow DOM ........... 259 選擇一個程序框架 ....... 260 從零開始實現一個 MVC框架 .. 261 準備工作 ........... 262 程序事件 ........... 264 中介器 ........... 265 程序組件 ........... 268 路由表 ........... 270 事件發射 ........... 271 路由 ............. 272 調度器 ........... 275 controller .......... 279 model和 model settings .. 280 view和 view settings..... 283 框架 ............. 287 小結 . 288
10 匯總 ...........289
準備工作 ............. 289 程序依賴 ............. 290 程序中的數據 ........... 291 程序架構 ............. 292 程序文件結構 ........... 293 配置自動構建流程 ....... 294 程序布局 ............. 297 實現根組件 ........... 298 實現 market controller ....... 299 實現 NASDAQ model ....... 302 實現 NYSE model ......... 303 實現 market view ........ 304 實現 market模板 ........ 306 實現 symbol controller...... 308 實現 quote model ...... 309 實現 symbol view ........ 311 實現 chart model ......... 313 實現 chart view ......... 316 測試應用 ............. 318 準備發布程序 ........... 319 小結 . 320
|
序: |
|