编写可靠的JavaScript代码 测试驱动开发JavaScript商业软件 [Reliable JavaScript: How to code safely in the wor]

编写可靠的JavaScript代码 测试驱动开发JavaScript商业软件 [Reliable JavaScript: How to code safely in the wor] pdf epub mobi txt 电子书 下载 2025

[美] Lawrence D.Spencer,Seth H.Richar 著,王肖峰 译
图书标签:
  • JavaScript
  • 测试驱动开发
  • TDD
  • 可靠性
  • 软件工程
  • 商业软件
  • 前端开发
  • 代码质量
  • 最佳实践
  • Web开发
想要找书就要到 静流书站
立刻按 ctrl+D收藏本页
你会得到大惊喜!!
出版社: 清华大学出版社
ISBN:9787302443971
版次:1
商品编码:12019146
包装:平装
丛书名: Web开发经典丛书
外文名称:Reliable JavaScript: How to code safely in the wor
开本:16开
出版时间:2016-07-01
用纸:胶版纸
页数:492
字数

具体描述

产品特色

编辑推荐

  本书分为5个部分:
  第Ⅰ部分“奠定坚实的基础”涵盖了软件工程的关键概念,例如SOLID和DRY原则,还讨论了单元测试和测试驱动开发的优点。
  在第Ⅱ部分“测试基于模式的代码”中,我们描述并使用测试驱动开发创建了几个有用的代码模式。
  第Ⅲ部分“测试和编写高级JavaScript特性”描述了如何使用和测试JavaScript语言更高级的特性。
  第Ⅳ部分“测试中的特殊主题”提供了测试DOM操作的样例,还演示了用于增强代码标准的静态分析工具的使用。
  第Ⅴ部分“总结”回顾了测试驱动开发的概念,还展示了一些本书用到的JavaScript习语。

内容简介

  为了构建更健壮的大型JavaScript应用程序,应先测试,后编码
  资深开发人员仍然在与大型JavaScript应用程序的失败做斗争,而这往往是由于应用程序自身的规模而导致的。本书以测试驱动工作流的形式提供了解决方案,它将产生经得起时间考验的健壮应用程序。本书将使用单元测试解释、演示和采用各种JavaScript模式和结构。随着本书的学习,你将成为JavaScript测试驱动开发的专家,胜任开发商业软件。如果准备在JavaScript开发中引入高级软件工程,那么本书正是*佳之选。
  主要特色
  ◆展示了如何编写开始就被确认为正确的代码,并使用测试让代码在接下来的维护过程中仍然保持正确
  ◆概述用于测试、依赖注入和面向方面编程的JavaScript框架目前的现状
  ◆解释可测试性特征以及构建可测试对象的方式
  ◆演示常见设计模式以及高级JavaScript特性和架构的实现和使用
  ◆涵盖DOM访问测试,包括过度更新、在循环中的过度访问以及XHR/JSONP请求

作者简介

  Lawrence D. Spencer,领导SeerIS的一个国际开发者团队,SeerIS公司是波士顿附近的一家软件和服务公司。他拥有超过35年的工作经验,曾经担任过管理人员、开发人员、咨询师以及讲师,经常出席编程大会。

  Seth H. Richards,从2002年开始一直专业制作软件。他的工作专注于基于Web的企业级地理信息系统应用。

内页插图

目录

第Ⅰ部分 奠定坚实的基础
第1章 实践软件工程 3
1.1 编写从开始就正确的代码 4
1.1.1 掌握JavaScript的特性 4
1.1.2 在大型系统中规避JavaScript陷阱 15
1.1.3 应用软件工程原则 17
1.2 编写保持正确的代码 22
1.2.1 投资单元测试的未来 22
1.2.2 实践测试驱动开发 22
1.2.3 编写易于测试的代码 23
1.3 小结 26
第2章 准备工具 27
2.1 使用测试框架 27
2.1.1 辨别不正确的代码 30
2.1.2 可测试性设计 32
2.1.3 编写最少的代码 33
2.1.4 安全维护和重构 33
2.1.5 可运行规范 34
2.1.6 当前的开源和商业框架 34
2.1.7 介绍Jasmine 36
2.2 使用依赖注入框架 41
2.2.1 依赖注入的定义 41
2.2.2 使用依赖注入让代码更可靠 43
2.2.3 掌握依赖注入 43
2.2.4 案例研究:编写一个轻量级依赖注入框架 43
2.2.5 使用依赖注入框架 50
2.2.6 当前的依赖注入框架 52
2.3 使用切面工具 53
2.3.1 案例研究:使用和不使用AOP进行缓存 53
2.3.2 案例研究:构建Aop.js模块 55
2.3.3 其他AOP库 67
2.3.4 结论 68
2.4 使用代码检查工具 68
2.4.1 使用linting工具让代码更可靠 68
2.4.2 JSHint简介 71
2.4.3 其他工具 73
2.4.4 严格模式 74
2.5 小结 74
第3章 构造可靠的对象 75
3.1 使用原生数据 75
3.2 使用对象字面量 77
3.3 使用模块模式 78
3.3.1 创建任意模块 78
3.3.2 创建立即执行模块 79
3.3.3 创建可靠的模块 80
3.4 使用对象原型和原型继承 80
3.4.1 默认对象原型 80
3.4.2 原型继承 81
3.4.3 原型链 82
3.5 使用new创建对象 83
3.6 使用类继承 88
3.6.1 模拟类继承 88
3.6.2 重复将杀死Kangaroo 89
3.7 使用函数式继承 91
3.8 猴子补丁(Monkey-Patching) 92
3.9 小结 95
第Ⅱ部分 测试基于模式的代码
第4章 浏览各种模式的优点 99
4.1 案例分析 99
4.2 通过更广泛的词汇产生更加优雅的代码 100
4.3 使用拥有良好设计、良好测试的构建块产生可靠的代码 101
4.4 小结 102
第5章 确保回调模式的正确使用 103
5.1 通过单元测试了解回调模式 104
5.1.1 编写和测试使用了回调函数的代码 104
5.1.2 编写和测试回调函数 109
5.2 避免问题 113
5.2.1 扁平化回调箭头 113
5.2.2 注意this变量 115
5.3 小结 119
第6章 确保承诺模式的正确使用 121
6.1 通过单元测试了解承诺 122
6.1.1 使用承诺 122
6.1.2 构造和返回承诺 127
6.1.3 测试XMLHttpRequest 130
6.2 串联承诺 133
6.3 使用承诺封装器 134
6.4 了解状态和命运 135
6.5 区分标准承诺和jQuery承诺 135
6.6 小结 136
第7章 确保正确使用散函数应用程序 137
7.1 对散函数应用程序进行单元测试 137
7.2 为散函数应用程序创建切面 139
7.3 区分散函数应用程序和柯里化 140
7.3.1 柯里化 140
7.3.2 散函数应用程序 141
7.4 小结 141
第8章 确保备忘录模式的正确使用 143
8.1 通过单元测试了解备忘录模式 144
8.2 使用AOP添加备忘录 147
8.2.1 创建备忘录切面 147
8.2.2 为restaurantApi应用returnValueCache切面 150
8.3 小结 152
第9章 确保单例模式的正确实现 153
9.1 通过单元测试了解单例模式 154
9.1.1 使用对象字面量实现单例共享缓存 154
9.1.2 使用模块实现单例共享缓存 158
9.2 小结 162
第10章 确保工厂模式的正确实现 163
10.1 为工厂编写单元测试 163
10.2 实现工厂模式 169
10.3 考虑其他工厂类型 171
10.4 小结 171
第11章 确保沙箱模式的正确实现和使用 173
11.1 通过单元测试了解沙箱模式 173
11.1.1 创建部件沙箱 174
11.1.2 创建和测试沙箱工具 187
11.1.3 创建与沙箱一起使用的函数 191
11.2 小结 193
第12章 确保装饰器模式的正确实现 195
12.1 使用测试驱动的方式开发装饰器 196
12.1.1 为被装饰的对象编写一个假对象 197
12.1.2 为错误的传递编写测试 198
12.1.3 编写空白装饰器 199
12.1.4 添加传递功能到装饰器 200
12.1.5 验证成功传递 202
12.1.6 添加装饰器的特性 204
12.1.7 通用化装饰器 210
12.2 小结 211
第13章 确保策略模式的正确实现 213
13.1 通过单元测试了解该模式 213
13.1.1 在不使用策略模式的情况下实现transportScheduler 214
13.1.2 使用策略模式实现transportScheduler 216
13.2 小结 227
第14章 确保代理模式的正确实现 229
14.1 通过测试驱动的方式开发代理 230
14.2 小结 245
第15章 确保正确实现可链接方法 247
15.1 通过单元测试了解该模式 248
15.2 链接then方法 255
15.3 小结 257
第Ⅲ部分 测试和编写高级JavaScript特性
第16章 在无接口语言中遵守接口 261
16.1 了解接口的优点 262
16.2 了解接口隔离原则 263
16.3 使用测试驱动开发创建契约注册表 265
16.3.1 定义契约 266
16.3.2 判断是否履行了契约 267
16.3.3 断言契约被履行了 271
16.3.4 绕过契约执行 273
16.3.5 创建在被返回(创建)的对象上实施契约的切面 273
16.4 小结 277
第17章 确保正确的参数类型 279
17.1 了解JavaScript无类型参数带来的机会和风险 280
17.2 扩展ContractRegistry检查参数 280
17.2.1 界定任务范围 280
17.2.2 判断集合中的所有变量是否都履行了它的契约 281
17.2.3 断言集合中的所有变量都履行了它的契约 289
17.2.4 在切面中打包参数检查功能 290
17.3 支持契约库 292
17.4 综合起来 293
17.4.1 创建契约模块 293
17.4.2 创建应用程序的ContractRegistry 296
17.4.3 为生产发布绕过契约 297
17.5 比较面向切面的解决方案和静态解决方案 297
17.5.1 考虑TypeScript的优点 297
17.5.2 考虑切面的优点 297
17.6 小结 298
第18章 确保正确使用call、apply和bind 299
18.1 浏览this是如何绑定的 299
18.1.1 默认绑定 300
18.1.2 隐式绑定 302
18.1.3 new绑定 303
18.1.4 显式绑定 305
18.2 创建和测试使用call、apply和bind的代码 305
18.2.1 使用call和apply 305
18.2.2 使用测试驱动开发创建一个Array.prototype.forEach Polyfill 307
18.2.3 使用bind 316
18.3 小结 321
第19章 确保正确使用方法借用 323
19.1 确保借用对象符合需求 324
19.1.1 让被借用的函数验证借用者的资格 324
19.1.2 向被借用的对象附加切面 326
19.1.3 使用borrow()方法 329
19.1.4 在ContractRegistry中添加对象验证器 330
19.2 预期借用者的副作用 331
19.2.1 考虑被隔离函数的副作用 331
19.2.2 考虑调用其他函数的函数的副作用 332
19.3 预期捐赠者对象的副作用 338
19.4 小结 339
第20章 确保正确使用混合 341
20.1 创建和使用混合 343
20.1.1 创建和使用传统混合 344
20.1.2 创建和使用函数式混合 361
20.2 小结 367
第21章 测试高级程序架构 369
21.1 确保观察者模式的可靠使用 369
21.1.1 检查观察者模式 370
21.1.2 增强观察者模式的可靠性 376
21.2 确保中介者模式的可靠使用 380
21.2.1 了解中介者模式 381
21.2.2 增强基于中介者代码的可靠性 382
21.3 小结 395
第Ⅳ部分 测试中的特殊主题
第22章 测试DOM访问 399
22.1 对UI进行单元测试 399
22.1.1 检查难于测试的UI代码 400
22.1.2 使用TDD创建UI组件 401
22.2 使用分析器优化代码 411
22.2.1 检测低效代码 411
22.2.2 避免不成熟的优化 418
22.3 小结 418
第23章 确保符合标准 419
23.1 使用ESLint 420
23.1.1 安装ESLint 420
23.1.2 运行ESLint 424
23.1.3 使用ESLint实施代码标准 427
23.2 实施架构分离 432
23.2.1 家庭秘密技术 433
23.2.2 铭记技术 435
23.2.3 不可能任务(Mission Impossible)技术 437
23.2.4 魔术棒(Magic Wand)
技术 441
23.2.5 不要使用调用栈技术 442
23.2.6 其他技术 442
23.2.7 其他架构 442
23.3 小结 443
第Ⅴ部分 总结
第24章 测试驱动开发原则的总结 447
24.1 回顾值得使用测试驱动开发的原因 447
24.2 练习测试驱动开发 448
24.3 编写可单元测试的代码 448
24.4 掌握测试驱动开发的
技术 448
24.4.1 在编码之前编写测试 448
24.4.2 保持测试DRY 449
24.4.3 首先测试错误条件 449
24.4.4 测试要先易后难 449
24.4.5 具体 449
24.4.6 只测试一件事情 450
24.4.7 测试数据如同测试一样重要 450
24.4.8 高效地使用Jasmine 450
24.5 测试本书描述的模式 450
24.5.1 测试面向切面编程 450
24.5.2 测试对象构造 451
24.5.3 测试回调 451
24.5.4 测试基于承诺的代码 451
24.5.5 测试散函数应用程序 451
24.5.6 测试备忘录模式 452
24.5.7 测试单例模式 452
24.5.8 测试工厂模式 452
24.5.9 测试沙箱 452
24.5.10 测试装饰器模式 453
24.5.11 测试策略模式 453
24.5.12 测试代理模式 453
24.5.13 测试可链接方法 453
24.5.14 测试接口一致性 453
24.5.15 测试call和apply的
使用 453
24.5.16 测试方法借用模式 454
24.5.17 测试混合 454
24.5.18 测试中介者和观察者模式 454
24.5.19 测试DOM访问 454
24.5.20 实施架构分离的测试 454
24.6 小结 455
第25章 本书JavaScript习语的总结 457
25.1 回顾对象 457
25.1.1 可以添加和删除的对象属性 457
25.1.2 可以将对象用作词典 458
25.2 回顾变量 459
25.2.1 提升变量声明 459
25.2.2 变量有函数作用域 460
25.3 回顾函数 463
25.3.1 函数是对象 463
25.3.2 提升函数声明 463
25.3.3 函数没有返回类型 464
25.3.4 函数可以是匿名的 465
25.3.5 函数可以被嵌套 465
25.3.6 函数调用可以使用任意数量的参数 466
25.3.7 函数可以立即被调用 467
25.4 回顾布尔操作 468
25.4.1 在测试相等性时类型可能会被强制转换 468
25.4.2 值可以是真或假 469
25.5 小结 469

前言/序言

  当我们与开发者同仁分享本书的书名《编写可靠的JavaScript代码》时,我们收到了如下反馈:
  “‘可靠的’和‘JavaScript代码’这两个词现在能放在一块?”
  “这一定是一本非常薄的书。”
  “我是否会在书店的小说区域John Grisham最近的惊悚小说附近找到它?”
  不,本书不是小说。
  我们收到的关于本书书名的反馈表明了一些具有经典的、编译语言经验的开发者对于JavaScript的普遍看法:JavaScript被用于创建华丽的作品集网站或者简单的应用程序,它与任务关键的企业应用程序没有关系。
  在过去这种观点是事实,但现在已经改变了。
  JavaScript作为一流语言崛起
  JavaScript作为野孩子的声誉是应得的,在接下来的两个小节中我们将揭示它的一些漏洞。不过,就像被宠坏的继承者一样,在继承了家族事业之后,通过提出挑战让所有人都感到震惊。但最近他变得严肃和负责,显示出真正伟大的能力。
  JavaScript早期仅仅被托付一些短“脚本”任务。任务非常简单:如果所需的字段未被填充,就将它标记为红色;如果按钮被单击了,就应该将另一个页面带入视图。尽管它的责任有限,但易于相处。到今天为止,大多数程序员使用JavaScript的经验都是此类。
  接着,在重新定义JavaScript的变革中,世界转向了Web。这一直是JavaScript游乐场,当The Old Boys Club的成员在服务器上完成真正的工作时,他就在Web中娱乐自己。
  在20世纪90年代末期,当微软引入iframes和XMLHTTP时,变革开始被阻碍。而当Google在2004年和2005年分别使Ajax成为Gmail应用程序和Google Maps的一部分时,变革开始崩溃。世界突然注意到当浏览器被赋予更多任务时(不只是显示服务器分配的内容),Web体验可以如此丰富。
  所以JavaScript被赋予了更多的责任,超出了任何人的计划。JavaScript需要得到帮助。
  此时帮助也应运而来,以工具包和框架的形式存在,例如jQuery、 Ext JS、 Ember.js、 Knockout、Backbone和AngularJS。这些有价值的顾问完成了所有他们能做的事情,为JavaScript带来了准则和结构。
  使用JavaScript编写真正糟糕的代码是非常简单的
  问题的部分原因是JavaScript作为页面脚本语言存在多年。在那个有限的范围内,使用全局变量或全局函数并没有问题。如果变量拼写错误,影响非常有限、也易于追踪(另外,影响可能是创建了另一个全局变量)。如果架构非常草率……那么有多少架构甚至可以只存在于一个Web页面上呢?
  编译器的缺少隐藏了潜在的错误。使用C#或Java编写的服务器端程序在运行之前至少可以保证语法上是正确的。而JavaScript则必须启动,然后就只能预祝好运了。拼写错误的变量或者调用不存在的函数都可能潜伏在代码中数月之久,直到遵循了特定的执行路径。
  接着就是JavaScript的怪癖,一些可爱的、疯狂的怪癖。
  这个列表的顶部一定就是==(使用类型强制转换的相等)和===(不使用类型强制转换的相等)。这是一个好想法,但是对于主要使用其他语言的程序员来说是如此难以适应!
  JavaScript拥有“真”和“假”的概念,它们让很多人感到糊涂。0是假值,因此多亏了类型强制转换(type coercion),表达式:
  false == '0'
  的结果是真。值false被强制转换成一个数字,也就是0(真被转换为1)。接下来,字符串‘0’也被强制转换成数字,也是0,所以表达式的结果是真。
  不过,false == 'false'的结果是假,因为左侧的false再次被强制转换成0,与右侧字符串‘false’相比,也被强制转换成数字。因为‘false’根本不是数字,所以第二个转换将产生NaN(Not a Number),相等性检测失败。
  如果声明了下面的函数:
  function letsHaveFun(me, you) {
  // Fun things happening between me and you
  }
  然后调用它,因此:
  letsHaveFun(me);
  JavaScript将在变量you未定义的情况下执行调用,只是为了开心地看着你与某个不存在的人玩耍。
  这个代码清单可以不断扩展下去。还有令人吃惊的作用域规则、独特的“原型”继承机制、自动的和有时不正确的分号插入、一个对象从另一个完全无关的对象借用函数的功能等 。
  伴随着全局变量的不请自来、几乎完全缺少的架构设计、与真理的可疑关系以及比动漫大会上发现的更多的怪癖,JavaScript能做到如此好的地步真是一个奇迹。
  无论你相信与否,它在变好之前会变得更糟糕。即使你是正确的,它也可能会非常容易出现问题。
  JavaScript代码容易被无意间破坏
  JavaScript有一种病态的幽默感。在一门稳重的编译语言中,如果有一行完全正确的调试代码在生产环境中运行得非常完美,例如:
  myVariable = myObject.myProperty;
  这时如果不小心碰到了键盘上的x键,那么它就变成了:
  myVariable = myObject.myPropxerty;
  编译器就会立即发出一条严厉的消息,警告下次一定要更加小心。而JavaScript则会高兴地运行该代码,并将undefined的值赋给myVariable。
  当你希望改变属性的名称时,JavaScript喜欢玩捉迷藏。你可能会认为在整个源目录中搜索.myProperty就可以找到所有需要改动的地方。“不,不,不!”JavaScript笑着说。“你忘了搜索['myProperty']。”
  实际上,应该使用正则表达式进行搜索,允许在括号和引号之间含有空格。你曾经这样做过吗?我们都没有。
  你还应该搜索下面这样的结构:
  var prop = 'myProperty';
  // . . .
  myObject[prop] = something;
  即使是如此小的重构也很难完成,因此可以想象错误的产生是多么容易。不适合重构的代码几乎是单词“脆弱”的定义。
  如何才能避免这些问题呢?如果有一个我们希望在本书进行宣扬并实践的概念,那么就是测试驱动开发。在不存在编译器的情况下,测试是针对错误的最佳防御。
  JavaScript也更加适用于按照软件工程的规则进行开发。实际上,由于JavaScript具有创造性,因此比其他语言更需要这些规则。
  我们见过许多开发人员都对这个信息抱着开放的态度,并且希望学习更多相关知识。我们希望你是其中一员。
  本书面向的读者
  因为本书不是一本JavaScript入门书籍,所以我们假设你已经有一些JavaScript经验。下面勾勒了本书理想读者的特点。
  从其他语言转向JavaScript的开发人员
  我们的职业生涯都不是从JavaScript开发人员开始的,可能也不是当JavaScript遇到大规模应用开发时才进入程序开发领域的。
  JavaScript与我们曾经使用过的任何语言都大不相同。我们来自于编译的、静态类型语言C#的舒适世界。
  当我们在保持C#程序员的架构和准则,并拥抱JavaScript的动态特性时,JavaScript就会容易掌握。
  如果你具有使用JavaScript之外的语言(例如C#或Java)进行思考和编程的背景的话,本书是适合你的。数据结构和架构方面的知识将为你掌握JavaScript的大规模开发提供牢固的基础。
  许多小节都演示了C#和Java中的语言特性(例如继承和接口)是如何对应于JavaScript中的功能的。我们还强调了JavaScript和其他语言之间的许多主要区别,例如作用域规则和类型强制转换相等性比较。掌握JavaScript功能和特性的相关知识将改善你用JavaScript思考的能力。
  本书的另一个关注点是如何将C#和Java开发中更常见的软件工程概念和实践应用到JavaScript中,例如设计模式、单元测试和测试驱动开发。合理的软件工程可以缓和JavaScript的本性,创建可靠的和可维护的代码。
  具有小规模JavaScript经验的开发人员
  在我们努力为团队增加具有JavaScript经验的开发人员时,我们遇到了许多候选人,都觉得具有小规模JavaScript开发经验(例如输入域验证和jQuery元素转换)就值得将“JavaScript”列在简历的重要位置。
  在面试中,判断这样的候选人不需要花费太多时间:可能在ASP.NET Web Forms应用程序中,他们可以轻松地使用按钮处理程序,但是创建一个JavaScript模块,并在其中使用防止被外部操作的变量就比较困难了。
  随着机构对JavaScript使用的进一步深化,我们对拥有JavaScript经验的定义也随之严格。数年之前,如果开发人员有点jQuery经验,我们就会对他的JavaScript经验非常满意了。
  不过,现在我们需要更多的经验。使用JavaScript编写整个应用程序已经不再是凤毛麟角了。在所谓的单页面应用(Single-Page Application,SPA)中,JavaScript代码将组成整个应用程序,与过去瞬间的单击处理程序相比,现在它承担着更多的责任。为了参与大规模JavaScript应用程序的开发,开发人员必须知道如何以结构化和规定的方式使用该语言,并同时使用它的许多独特功能和特性。
  通过本书的样例,我们希望你——小规模JavaScript开发人员——能够参与大规模JavaScript应用程序的开发。
  负责为新项目挑选编程语言的开发人员
  可能你已经听过这个谚语:“没有人会因为购买IBM产品而被解雇”。这个谚语反映了一种感觉:在为IT项目选择技术合作伙伴时,选择稳定的、有信誉的公司(例如IBM)是不会受到质疑的。即使项目费用超支、逾期或完全失败,选择IBM也是无可指责的。
  如果你正处于为新应用选择开发语言的位置,那么就处于与IT管理者选择技术合作伙伴一样的位置。有许多具有悠久历史并经过众人尝试和验证的语言,例如C#和Java,它们都是由大型、稳定的技术公司所支持的,已经被用于构建Web和桌面应用超过十年。没有人会因为选择C#被解雇。
  从新程序设计项目的安全选择来看,尤其是企业级的项目,JavaScript明显与C#不同。JavaScript不是一门成熟、稳定、正式的编程语言。
  与C#和Java这样的语言相比,它没有大规模软件项目的、长期的成功记录。这不是说使用C#和Java的项目就一定成功。不过,如果使用了其中一种语言的项目不成功,语言的选择可能不会被包含在失败的原因中。
  如我们在之前小节中所提到的,使用JavaScript非常容易编写出灾难性的代码。这为它带来了一点糟糕的名声,降低了选择它的可能性。
  不应该因为JavaScript的声誉而自动将它排除在项目的考虑之外,因为我们可以从它的强大功能中获益。Node.js——一个服务器端的JavaScript引擎——是轻量级的并且高度可伸缩的;对于实时和数据敏感应用程序来说是非常完美的选择。JavaScript可以被用于在浏览器中创建富用户界面。客户端框架(例如Ember和AngularJS)可以被用于构建完整的、基于浏览器的应用程序,可以通过将展示逻辑转移到客户端的方式减轻Web服务器的负担。
  尽管我们不能保证它会成功,但是接下来的章节将展示如何通过应用我们在自己项目中所学到的教训,在下一个项目选择JavaScript时降低风险。
  成功不是偶然的,尤其是在使用JavaScript时。它要求牢固掌握软件工程原则,这是第1章的主题。
  本书的组织结构
  我们将本书划分为5个部分。
  第Ⅰ部分“奠定坚实的基础”涵盖了软件工程的关键概念,例如SOLID和DRY原则,还讨论了单元测试和测试驱动开发的优点。第Ⅰ部分还介绍了本书使用的工具和JavaScript库。最后,讨论了JavaScript中的对象和它们的可测试性。
  在第Ⅱ部分“测试基于模式的代码”中,我们描述并使用测试驱动开发创建了几个有用的代码模式。其中一些模式(例如单例)可能与其他你所熟悉的语言中的模式类似。其他(例如承诺)主要是与JavaScript相关的。
  第Ⅲ部分“测试和编写高级JavaScript特性”描述了如何使用和测试JavaScript语言更高级的特性。它还涵盖了使用了高级编程架构的应用的创建和测试,例如中介者和观察者模式。
  第Ⅳ部分“测试中的特殊主题”提供了测试DOM操作的样例,还演示了用于增强代码标准的静态分析工具的使用。
  第Ⅴ部分“总结”回顾了测试驱动开发的概念,还展示了一些本书用到的JavaScript习语。
  使用本书所需的工具
  为了运行本书的样例,需要使用下列工具:
  ● 文本编辑器
  ● Web浏览器
  样例的源代码可以从Wrox网站下载:
  www.wrox.com/go/reliablejavascript
  基于本书的开源软件可以在GitHub上找到:
  www.github.com/reliablejavascript
  源代码
  当你浏览本书的样例时,可能会选择手动输入所有代码,或者使用随书提供的源代码。本书使用的所有源代码都可以从www.wrox.com和www.tupwk.com.cn/downpage下载。对于本书来说,代码下载文件在下面网址的Download Code选项卡中:
  www.wrox.com/go/reliablejavascript
  也可以在www.wrox.com中通过ISBN搜索本书找到代码。所有当前Wrox图书的代码下载的完整文件列表在www.wrox.com/dynamic/books/download.aspx 中。
  www.wrox.com的大多数代码都采用.ZIP、.RAR或者适用于特定平台的类似归档模式进行了压缩。下载了代码之后,只需要使用适当的压缩工具解压即可。
  注意:
  因为许多书都有相似的书名,所以你可能发现使用ISBN搜索是最容易的;本书英文版的ISBN是978-1-119-02872-7。
  勘误表
  尽管我们竭尽所能来确保在正文和代码中没有错误,但人无完人,错误难免会发生。如果你在Wrox出版的书中发现了错误(例如拼写错误或代码错误),我们将非常感谢你的反馈。发送勘误表将节省其他读者的时间,同时也会帮助我们提供更高质量的信息。
  要找到本书的勘误页面,可以进入www.wrox.com,使用Search搜索框或书名列表找到本书,然后在本书的详细信息页面上单击Book Errata链接。在这个页面上可以查看为本书提交的、Wrox编辑粘贴上去的所有错误。完整的书名列表(包括每本书的勘误表)也可以从www.wrox.com/misc-pages/booklist.shtml上获得。
  如果在本书的勘误页面上没有看到你发现的错误,则可以到www.wrox.com/contact/ techsupport.shtml 上填写表单,把你发现的错误发给我们。我们会检查这些信息,如果属实,就把它添加到本书的勘误页面上,并在本书随后的版本中更正错误。
  p2p.wrox.com
  如果想和作者或同行进行讨论,请加入p2p.wrox.com 上的P2P论坛。该论坛是一个基于Web的系统,你可以发布有关Wrox图书及相关技术的消息,与其他读者或技术人员交流。该论坛提供了订阅功能,当你感兴趣的主题有新帖子发布时,系统会邮件通知。Wrox的作者、编辑、其他业界专家和像你一样的读者都会出现在这些论坛中。
  在p2p.wrox.com网站上,你会找到很多不同的论坛,它们不但有助于你阅读本书,还有助于你开发自己的应用程序。加入论坛的步骤如下:
  (1) 进入p2p.wrox.com,单击Register链接。
  (2) 阅读使用条款,然后单击Agree按钮。
  (3) 填写加入该论坛必需的信息和其他你愿意提供的信息,单击Submit按钮。
  (4) 你将收到一封电子邮件,描述如何验证你的账户和完成加入过程。
  加入之后,就可以发布新的消息和回复其他用户发布的消息。可以随时在Web上阅读论坛里的消息。如果想让某个论坛的新消息以电子邮件的方式发给你,可以单击论坛列表中论坛名称旁边的Subscribe to this Forum图标。
  要了解如何使用Wrox P2P的更多信息,请阅读P2P FAQ,其中回答了论坛软件如何使用的问题,以及许多与P2P和Wrox图书相关的问题。要阅读FAQ,单击任何P2P页面上的FAQ链接即可。
  ……

精益求精:打造坚不可摧的JavaScript商业应用 在当今快速迭代的软件开发环境中,构建能够抵御现实世界挑战的JavaScript应用程序比以往任何时候都更加重要。无论是处理复杂的业务逻辑,还是应对海量用户请求,亦或是确保敏感数据的安全,代码的可靠性都是商业成功的基石。本书并非旨在重复市面上常见的JavaScript入门教程,而是深入探讨那些能够将你的JavaScript开发能力提升至专业级水准的深层实践和核心理念。我们将聚焦于那些能够显著提升代码健壮性、可维护性和可扩展性的关键技术和思维模式,帮助你从“能写”晋升到“写得好”,最终打造出让客户信赖、让团队协作顺畅的商业级JavaScript软件。 一、 严谨的思维:从“能跑”到“值得信赖”的转变 许多开发者在起步阶段,往往将精力集中在让代码“跑起来”,实现基本功能即可。然而,在商业环境中,这远远不够。一个健壮的系统需要能够预见并妥善处理各种异常情况,包括但不限于:无效的输入、网络中断、第三方服务故障、用户误操作、甚至是潜在的安全漏洞。本书将引导你建立一种“防御性编程”的思维模式,教会你如何在一个不完美的外部世界中,构建一个尽可能完美的内部系统。 假设的审视与边界条件的考量: 我们将深入分析常见的假设,以及这些假设在真实环境中可能失效的场景。例如,在处理用户输入时,我们不能仅仅假设用户会输入符合预期的数据类型和格式。本书会提供系统性的方法来识别和处理各种边界条件,确保你的代码在各种边缘情况下都能表现稳定。 错误处理的艺术: 错误处理不仅仅是简单的`try...catch`块。我们将探讨不同类型的错误(如运行时错误、逻辑错误、API错误),以及如何选择最适合的错误捕获和报告策略。学习如何编写清晰、 informative 的错误信息,不仅有助于开发者调试,更能为用户提供友好的反馈。 状态管理的健壮性: 在复杂的单页应用(SPA)中,状态管理是应用程序的核心。本书将超越基础的状态管理模式,深入探讨如何构建可预测、可调试且易于维护的状态管理系统。我们将讨论如何避免竞态条件、理解状态的不可变性原则,以及在必要时如何实现高效的状态持久化和恢复。 二、 体系化的测试:以不容置疑的严谨验证你的代码 测试驱动开发(TDD)并非仅仅是一种编写测试的技巧,它是一种以测试为驱动的软件开发方法论。通过先编写测试,再编写能够通过测试的代码,TDD能够引导开发者更清晰地思考需求、设计更模块化的代码,并极大地提高代码的覆盖率和可靠性。本书将深入剖析TDD在JavaScript商业软件开发中的实际应用,教你如何构建一套高效、可靠的测试体系。 从单元测试到集成测试的战略部署: 我们将详细讲解如何编写高质量的单元测试,确保每个独立的代码单元(函数、方法)都能按预期工作。在此基础上,我们将探讨如何设计和实施集成测试,验证不同模块之间协作的正确性,以及端到端的测试,模拟真实用户场景,全面评估应用程序的功能和性能。 选择合适的测试工具与框架: JavaScript测试生态系统极其丰富。本书将为你梳理主流的测试框架(如Jest, Mocha, Cypress),并指导你如何根据项目需求和团队偏好选择最合适的工具。我们将深入讲解这些工具的核心功能,包括断言库、模拟(mocking)与存根(stubbing)技术、代码覆盖率分析等。 测试的艺术与实践: 编写“好”的测试与编写“能跑”的测试有着本质的区别。我们将分享编写可维护、可读性强且真正有价值的测试的原则和技巧。这包括如何设计清晰的测试用例、如何有效利用测试数据、以及如何避免脆弱的测试(flaky tests)。 将TDD融入日常开发流程: TDD并非一次性的项目启动策略,而是需要融入日常的开发循环。本书将指导你如何在敏捷开发流程中有效实施TDD,如何平衡开发速度与测试质量,以及如何通过持续集成(CI)等实践,让测试成为保障代码质量的自动化哨兵。 三、 软件工程的最佳实践:构建可维护、可扩展的基石 商业软件的生命周期往往比开发周期要长得多。因此,代码的可维护性和可扩展性是决定项目长期健康的关键因素。本书将深入探讨那些能够帮助你构建高质量、易于维护和迭代的JavaScript代码库的软件工程实践。 模块化与组件化设计: 我们将深入研究如何将复杂的应用程序分解为清晰、独立且可重用的模块和组件。理解不同的模块化方案(如ES Modules)以及它们在大型项目中的应用,能够显著提高代码的可读性、可测试性和团队协作效率。 设计模式的应用: 经典的设计模式并非过时的概念,它们提供了解决常见软件设计问题的成熟方案。本书将精选在JavaScript商业开发中尤为实用的设计模式,如工厂模式、观察者模式、单例模式、策略模式等,并结合实际案例讲解如何在项目中灵活运用它们,以提高代码的灵活性和可维护性。 代码重构的策略与技巧: 随着项目的迭代和需求的演变,代码不可避免地会产生“技术债”。本书将教授你如何进行有效的代码重构,如何在不改变外部行为的前提下,改进代码的内部结构,使其更易于理解、修改和扩展。我们将探讨重构的最佳时机、常用的重构手法以及如何利用自动化工具辅助重构。 类型系统的力量: 尽管JavaScript本身是动态类型的语言,但通过引入静态类型检查,我们可以极大地提高代码的健壮性,减少运行时错误。本书将深入探讨TypeScript等静态类型解决方案,讲解如何利用类型系统来提升代码的可读性、可维护性和开发效率,特别是在大型、多人协作的商业项目中。 性能优化与异步编程的精髓: 在商业应用中,性能是用户体验和成本效益的重要考量。我们将探讨JavaScript的性能瓶颈,并提供实用的优化策略,包括代码优化、内存管理、以及高效的异步编程实践。理解 Promises, async/await 等现代JavaScript异步编程范式,并掌握它们在处理I/O密集型和CPU密集型任务时的最佳应用,是构建高性能应用的必经之路。 四、 现代JavaScript开发工具链的深度应用 现代JavaScript开发离不开强大的工具链。本书将超越对基础构建工具的简单介绍,而是深入讲解如何有效利用这些工具来提升开发效率和代码质量。 模块打包与代码优化: 深入理解Webpack, Rollup, Vite等打包工具的原理和高级配置,学习如何进行代码分割、懒加载、Tree Shaking等优化,以减小包体积,提升应用加载速度。 静态代码分析与代码风格统一: 掌握ESLint, Prettier等工具的应用,为团队建立统一的代码规范,在编码阶段就发现潜在问题,提高代码质量和一致性。 版本控制与协作: 虽然Git是必不可少的版本控制工具,但本书将侧重于如何在商业项目中有效运用Git进行分支管理、代码审查(Code Review),以及如何与其他团队成员高效协作。 结语 本书的目标是为你提供一套系统性的、切实可行的实践方法,让你能够构建出真正可靠、可维护且可扩展的JavaScript商业软件。我们相信,通过深入理解和实践本书中介绍的理念和技术,你将能够自信地应对复杂的商业需求,打造出能够经受时间考验的优质JavaScript应用,并在竞争激烈的软件开发领域脱颖而出。

用户评价

评分

这本书的价值在于它成功地架设了理论与生产环境之间的桥梁。很多前端或Node.js的测试书籍停留在ES5或早期的模块化概念上,但这本书紧密结合了现代的ES模块标准、TypeScript(尽管不是核心主题,但其理念贯穿始终)以及当前主流的框架生态(尽管没有深入特定框架,但其方法论是通用的)。最让我感到踏实的是,作者没有回避在大型项目中遇到的性能问题。他们展示了如何通过策略性地选择测试类型——单元测试、组件测试和端到端测试——来平衡开发速度和覆盖率,而不是盲目追求100%的代码覆盖率。那种关于如何管理测试套件的加载时间,以及如何利用沙盒环境模拟复杂用户交互的章节,对于那些正在为核心产品构建持续集成(CI)流程的工程师来说,是无价之宝。它让你从一个“会写代码的人”升级为一个“能构建稳定系统的工程师”。

评分

如果你是一个习惯于“即兴发挥”或者“摸着石头过河”的JavaScript开发者,我强烈建议你把这本书当作一本“行为规范”手册来阅读。它不仅仅是关于测试工具的使用指南,更深层次上,它是在重塑你对“代码质量”的认知。书中对于如何设计易于测试的函数和模块的指导非常具有前瞻性。例如,作者会明确指出,当一个函数需要同时处理数据转换和副作用(如日志记录或API调用)时,应立即考虑将其拆分成两个独立的、职责单一的函数。这种“纯函数优先”的理念,在TDD的驱动下被反复强调和实践。我过去总是把这些视为“最佳实践”,但这本书让我明白,在TDD的流程中,如果你的代码不易测试,那往往不是测试工具的问题,而是你的设计本身存在耦合和膨胀。它提供了一套严谨的流程,让你在编码的第一秒钟,就考虑到未来维护和扩展的成本。

评分

这本书的排版和代码示例的清晰度令人印象深刻。很多技术书籍在代码的展示上要么过于拥挤,要么版本过旧,导致读者在跟随实践时充满挫败感。但《编写可靠的JavaScript代码》在这方面做得非常到位。它不仅提供了完整的代码片段,还细致地解释了为什么选择某个特定的断言库(Assertion Library)或者测试框架的某个配置选项。对于那些想要从单元测试迈向集成测试的开发者来说,书中对Mocks和Stubs的讲解,非常具有实操价值。我过去对Mocking的理解非常片面,总觉得它是在“欺骗”代码,但书里清晰地阐述了,在测试外部依赖时,Mocking是保证测试隔离性和可重复性的必要手段。特别是它处理依赖注入(Dependency Injection, DI)的模式时,如何通过DI容器来配合测试框架进行快速替换,这对于我们团队重构遗留模块时,提供了可以直接应用的蓝图。语言风格上,它保持了一种专业但不失热情的语调,让你感觉是在一位经验丰富的同事的指导下学习。

评分

这本书在讲解异步编程和错误处理方面的章节,简直是为我量身定做的“救命稻草”。过去,处理Promise链和`async/await`结构时,我总感觉像在走钢丝,一个微小的疏忽就能导致整个流程悄无声息地崩溃,或者抛出一些根本无法追踪的拒绝(Rejection)。这本书没有仅仅停留在讲解`try...catch`的基础用法上,而是深入探讨了如何在TDD的框架下,设计那些能够优雅地处理失败场景的接口。作者展示了如何构造特定的测试用例来模拟网络延迟、服务器错误代码,甚至是用户快速连续点击导致的状态冲突。这种“防御性编程”的实践,是通过具体的测试用例来强化的,而不是空泛的建议。我尤其欣赏它对于“不可变性”在测试中的应用,通过确保每次操作都是基于干净状态的,极大地简化了测试环境的搭建和状态的清理工作。这本书真正教会了我如何构建那种“坏数据进来也没关系,它不会污染我的核心逻辑”的代码,这对于构建健壮的商业软件至关重要。

评分

这本书的开篇就给我一种非常务实的感觉,它没有过多地停留在理论的宏大叙事上,而是直接切入了现代JavaScript开发中最令人头疼的痛点:代码的脆弱性。我记得我以前写代码时,总是依赖于“希望它能跑起来”的心态,测试环节常常被压缩到最后一刻,或者干脆变成一种事后的补救措施。这本书的作者显然深谙这种痛苦,所以他们选择了一条截然不同的道路——测试驱动开发(TDD)。对我来说,最大的收获在于如何将这种“先写测试再写代码”的范式,融入到日常的JS项目中。书中的案例不是那种脱离实际的玩具代码,而是非常贴近企业级应用中常见的模块,比如异步操作的管理、状态的隔离,以及如何优雅地处理第三方依赖。那种在测试失败后,看着红色的反馈逐步变成绿色,构建出坚实可信代码的成就感,这本书让你学会了如何系统地去获取。它改变了我对“完成”一个功能的定义,以前是功能跑起来了就算完成,现在则是:除非测试通过并且覆盖了关键路径,否则它不算完成。这种思维模式的转变,是这本书最宝贵的馈赠。

评分

活动时候买,超值,多来一些酱紫的活动,不错~

评分

书很好 以后会继续买的 学习无价

评分

书很好 以后会继续买的 学习无价

评分

活动时候买,超值,多来一些酱紫的活动,不错~

评分

很不错的一次购物体验

评分

可维护可靠是所有软件的核心价值

评分

不错

评分

可维护可靠是所有软件的核心价值

评分

好评!

相关图书

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 book.coffeedeals.club All Rights Reserved. 静流书站 版权所有