精通模块化JavaScript
  • 推荐0
  • 收藏1
  • 浏览215

精通模块化JavaScript

尼古拉斯·贝瓦夸 (作者)  回晓 , 杨蓉 , 陈立伸 , 朱良臻 (译者) 许艳 (责任编辑)

  • 书  号:978-7-121-38707-4
  • 出版日期:2020-04-01
  • 页  数:
  • 开  本:
  • 出版状态:上市销售
  • 原书名: Mastering Modular JavaScript
  • 原书号:9781491955680
  • 维护人:许艳
本书是作者Nicolás Bevacqua所写的探索JavaScript架构的系列书之一,探讨了软件复杂性的基本原理,以及如何在JavaScript中应用这些原理开发具有高可维护性和可读性的模块化应用。书中给出了很多简明直接的建议和实例。全书从模块化思维开始,深入浅出地探讨了模块化的原则、如何设计模块,以及代码模块化的实践等,还介绍了应用的开发方式以及开源原则。阅读本书,你能掌握模块化JavaScript开发,使模块化在实际生产中产生真正的价值。
本书中的大部分建议、思考和指导都不是JavaScript特有的,因此本书不仅仅适合使用JavaScript和ES6的开发者和爱好者阅读,只要对编写易读、易维护、可扩展性强的模块化代码感兴趣的人,都不妨读一读。
编写易读、易维护、可扩展性强的模块化JavaScript应用
回晓,Web开发者,现任饿了么资深前端工程师,负责本书第1章“模块化思维”与第2章“模块化原则”的翻译。
杨蓉,Web前端开发者,毕业于华师大软件学院,目前均就职于饿了么大前端,负责本书第3章“模块设计”的翻译。
陈立伸,现任饿了么高级前端工程师,负责本书第5章“模块化模式与实践 ”和第6章“开发的方法论与哲学”的翻译。
朱良臻,Web开发者,前端爱好者。喜欢各种有趣的技术。负责本书第4章”内部构造“的翻译。

尽管印刷机已经问世很久了,但出版图书仍然是一件颇具挑战性的工作。通常,得有一位或几位作者勤勉地写作,还要有一位内容编辑协助作者,将他们的想法转化成不至于太枯燥且可读性更好的作品。如果这本书与技术或商业有关,则需要更加谨慎——要邀请有技术背景的审校者和密切关注相关主题的专家,找出稿件中关于技术定义或解释的严重错误。当然,文字编辑也不能少,他们是确保文字以及语法正确的最后一道防线。然而,到目前为止,我们仅仅谈了最浅层的东西:上面提及的所有角色主要处理书的内容,而一本书的制作过程还包括其他许多方面。比如,要有排版人员负责版式设计,保证图书有好的印刷效果,尽量避免代码出现孤行和折行的情况;要有人负责设计封面;还必须有人审核初稿的目录,然后作者才能与出版社签订合同。此外,还要有人监督印刷之前的整个过程,其通常被称为“生产流程”。一旦这些书印刷出来,还需要把它们发行出去。最后,图书上架开始售卖。有人购买它并开始阅读。图书产品的购买和交易过程甚至可以写成一本书。
整个过程复杂得令人难以置信。不过,对参与其中的每个人来说,事情却不是很复杂。比如作者,仅仅是每天写几百字而已。那么,复杂性去哪儿了呢?对整个过程进行这样的划分是有原因的:我们人类不擅长处理高复杂性的事项,对于出版图书或其他商业项目来说,将其分解为单个职责(比如“写作”“润色文字”“审校技术问题”“改正语法错误”“排版”,或“图书发行”),能简化复杂项目参与者的工作,让流程变得更简单。
出版图书仅仅是一个例子——其实对任何事情都可以这么处理。从你桌上选一样物品,随便选什么都行,思考它是怎么来到你桌上的。接着,把目光放远,想一下:它是怎么生产出来的?由什么制成?有多少人参与了它的制作、组装、打磨,并将它送到商店?你选的这个东西是水果吗?有多少人参与果树的种植、灭虫、修剪枝叶、打包果实,再把它送到商店?
我们身边充斥着各种复杂性,软件也不例外。从微观的层面来看,存在物理常量所框定的局限性,比如光速、比特、硬件、中断调用、汇编语言等;而从宏观层面来看,你可能会看到比如一个巨型技术部门,处理从查询到支付的整个过程。我们开发者和所负责的项目就身处在这些复杂性中。
平时,我们不太可能会停下来思考日常事物和交互中的复杂性,因为这样做会使人寸步难行。相反,我们把解决方法隐藏在抽象的接口之后,以至于我们的大脑就认为它们是接口。其中一些接口很好地映射到被抽象出来的实现中,让人觉得好用。而另一些则不然,它们让人觉得疑惑和沮丧。软件也是这样。我们不用考虑整个系统,实际上我们打交道的那些东西都被封装在接口里,而这些接口比其背后的具体实现更易理解和使用。

目标读者
这本书面向专业开发者、业余爱好者、掌握一定 JavaScript 和 ES6 知识的人。

这些开发人员以及对易读、易维护、可扩展性强的模块化编程(甚至不限于 JavaScript 语言)感兴趣的人,都可以从本书中受益。
为什么要使用模块化 JavaScript
刚开始我是抱着试着玩的心态接触 Node.js 的,但不知不觉喜欢上了 JavaScript。与此同时,我发现了开源并且爱上了这种实践。与 C# 封闭的环境对比,Node.js 的开源生态让我在怎样写出更便于他人使用的健壮代码方面找到了新的视角和乐趣。在这个背景下,我发现自己喜欢思考怎样定义接口,谁会使用接口,还有如何让用户有更多时间做其他事而不是花时间弄明白我们想让他做什么。
本书旨在提供一种友好的方法来帮助人们编写出好的模块化代码。并不是说 JavaScript 模块特别难写,而是说我们要遵循合理的设计实践来恰当地分配简单性和灵活性,以便用户在多数情况下可以依赖于简单且足够灵活的模块,同时保证内部复杂性是可控的——这并不是一件简单的事情。我
曾经在 JavaScript Application Design 一书和 Pony Foo 博客里零散地写过一些最佳应用设计的内容。但我一直渴望出版一本全面讨论如何分析、设计、编写模块化代码的书籍。
尽管找不到哪本书是从 JavaScript 的角度专门阐述这个主题的,不过我能很容易地找到涉及模块化代码主题的书籍,例如 Steve McConnell 所著《代码大全》(Microsoft Press)或者 Robert C. Martin 所著的《代码整洁之道》
(Prentice Hall),并在 JavaScript 开发工作中使用这些书中所教授的知识。本书试图让你把注意力从别人认为你应该做什么上移开,让你能够自己总结应该做什么以及为什么做,而不是强迫你接受一些虚伪的定义“整洁代码” 的所谓法则。
本书不会直接讲怎么编写模块化代码,而是试图阐明模块化体系结构背后的基本原理和 JavaScript 模块化的历史,以便于你更好地理解模块化编程的意义和益处。
市面上有很多关于应用设计的书籍,但关于模块化应用设计并没有太多的参考资料,更不用说模块化 JavaScript 应用设计了。所以,这本书应运而生。尽管本书中大部分的建议、思想和教导都不是专门针对 JavaScript 的,但是本书在阐述时聚焦于 JavaScript,这意味着你将学习如何编写模块化 Web 应用程序,而在此过程中也会记住那些使 Web 成为独特的平台以及让JavaScript 在许多方面都很特别的奇异功能。
本书没有采用长篇大论深入分析具体例子,而是希望你能够尝试应用书中的方法来解决自己项目中的问题,并且通过权衡各种方法的优缺点,最终实现目标。对于软件来说,不存在一刀切的通用解决办法,经常需要你自己做出判断,决定怎么写代码。所有的软件需要与其场景相适应,如果你做过任何软件开发或发行的工作,那么你肯定很清楚把同一个软件硬塞进不同的执行环境有多难。
正如 Practical Modern JavaScript 一样,这本书目标在于一点点地建立一个基线。在通过 Practical Modern JavaScript 一书学习最新的语言特性之后,我们借助这本书来学习模块化设计思想。这种增量的、模块化的方法在两本书中无处不在。

本书的结构
第 1 章讨论 JavaScript 语境下模块化编程的演变,从早期直接在 onclick 属性中嵌入的 JavaScript,到 CommonJS,最后到原生 ECMAScript 模块。然后,介绍编写自包含代码的好处,以及在系统的每个级别(服务、应用程序、组件、模块、函数、块等)都这么做的好处。
第 2 章涵盖了模块化设计的要点,为你打下一个基础,让你能在这个基础上编写对 API 层面友好的模块,并且知道这个模块会被如何(在所有可能的情况下)使用、其职责是什么,以及哪些部分属于接口。
第 3 章的大部分内容都是在帮助你理解要解决的各种问题,以及如何在解决那些问题的同时密切关注模块及其接口的演变,并且在等待清晰的模式出现前尽量不要进行抽象。本章刺破表象,让你将自己的上下文应用到待解决的问题上,启发你对文档、错误处理,以及遵循自己的推理等主题的最佳实践的思考。
第 4 章讨论内部复杂性、紧耦合,以及如何权衡框架和约束(convention)的优点。这一章的大部分篇幅都在讨论通过重构代码来降低复杂性的各种方法,然后讨论与复杂性相关的状态的作用,以及如何降低复杂性。数据结构也非常重要,因为在控制复杂性时,选择正确的数据结构虽然具有挑战性,却可以带来巨大的回报。
第 5 章专门讨论 JavaScript,详细介绍了如何利用现代语言结构来编写简洁的程序。这一章还研究了继承和组合等模式,进而引出如何根据实际用例来做正确的选择的讨论。最后,我们也梳理了经典模式,例如解释什么是模式、对象工厂、事件触发和 JSON 消息传递。
第 6 章描述了身经百战的模块开发人员是如何思考的,涉及安全问题和依赖关系管理、构建和集成过程、接口和抽象,以及对模块设计的建议和最佳实践。
就算你已经很了解 JavaScript 模块化历史,至少也应该浏览一下第 1 章中对历史的回顾。如果你是那种喜欢跳着看书的人,我建议你从头到尾阅读完所有章节,因为这本薄书更像是一本故事书,讲述了合理的程序应该是什么样子的而非给出一堆具体的操作步骤。
致谢
本书最终得以完成要感谢很多人的帮助。首先是 Virginia Wilson,她是本书的主要内容编辑和 O’Reilly 的 Modular JavaScript 系列负责人。她能洞察那些最重要的事情,并且在我的写作时间紧张、写作速度放缓时给予充分的理解,总是保持非常积极的态度。
技术审校者们也非常棒。Mathias Bynens 主要负责检查我关于 ECMAScript 规范的描述是否标准。Ingvar Stepanyan 似乎总是准备抓住机会对我的书进行技术评审,他总是提供独到的见解,让我对内容的描述更清晰、所举的例子更全面。我非常感激他的工作。Adam Rackis 为该系列图书的技术审校提供了很大帮助,他总能对需要修正的地方提出有理有据的意见,使其改后变得更充实或更清晰。
如果没能提到 2016 年在 Indiegogo 众筹平台上支持 Modular JavaScript 系列图书的所有人,那将是我的疏忽。在这些书只是一个想法时,谢谢你们对我的信任,从一开始就激励我,让我有了极大的热情。如果我们有机会见面,一起喝啤酒吧,我来买单。以下所列姓名无特定先后顺序:
Aaron Endsley, Aaron Hans, Aaron Olson, Aaron Wells, Adam Rackis, Adi
Purnama Mutiara, Adrian Li, Adrian Rand, Agustin Nicolas Polo, Alan
Chandler, Alasdair Shepherd, Alejandro Nanez, Alexis Mills, Allen Dean,
Anastasios Alexiou, Andrea Giammarchi, Andres Mijares, Andrew Broman,
Andrew Kenward, Andrew Shell, Andrew Van Slaars, Andrey Golovin,
Angel Ramirez Morel, Anna Vu, Anselm Hannemann, Anthony Casson,
Arnau Pujol, Arnis Lupiks, Artur Jonczyk, Aziz Khoury, Barney Scott, Beau Cronin, Ben Lagoutte, Ben Mann, Benjamin Bank, benjamintpoon, Benny
Neugebauer, Bishal Pantha, Bran Sorem, Brent Huffman, Bruce Hyatt, Burton
Podczerwinski, Béla Varga, Ca-Phun Ung, Cameron Stark, Carlos López,
Casper de Rooij, Chad Thoreson, Charles Her-man, Charles Rector, Charlie
Hill, Chase Hagwood, Chris Fothergill, Chris Weber, Christopher Dresel,
Christopher Gonzales, Christo-pher Hamilton, Christopher Scott, Cindy
Juarez, Claudia Hernán-dez, Constantin Chirila, Cris Ryan Tan, Dallen Richard
Loder, Dan Hayden, Dan M., Dan Perrera, Dan Rocha, Daniel Cloud, Daniel
Egger, Daniel Sleeth, David Ershag, David G. Chaves, David Gonzá-lez
Polán, David Hobbs, David Lemarier, Dayan Barros, Dejan Cencelj, Denise
Darmawi, Derick Rodriguez, Derik Badman, Dick Grayson, Dmitry Goryunov,
Don Hamilton III, Donald Gary, Doug Chase, Dumitru Florin Gabriel, Eder
Sánchez, Edgar Barrantes, Edouard Baudry, Eduardo Rabelo, Eric Lezotte,
Ersan Temizyurek, Ezequiel Cabrera, Fabian Marz, Fabio Vedovelli, Fabrice Le Coz, Federico Foresti, Fer To, Fernando Ripoll Lafuente, Flavio Spaini,
Fran Nunez, Francesco Strappini, Francisco Cerdas, Fredrik For smo, Fredrik Lexberg, Gabor Dolla, Gabriel Chertok, Gabriel García Seco, Gergo
Szonyi, Giovanni Londero, glennjonesnet, Gorshunov Vladimir, Guy Tepper,
Hamish Macpherson, Hanslutter Fomben, Henk Jan van Wijk, Hernan Chiosso,
Horváth László Gábor, Hugo Lopes, Ian B. De La Cruz, Ian Doyle, Ian McCausland, Ignacio Anaya, Istvan Szmozsanszky, Ivan Saveliev, Ivan Tanev,
J. Singh, Jack Pallot, Jack W McNicol, Jaime García, Jake Smith, Janderson
Mar-tins, Jani Kraner, Jared Moran, Jason Broyles, Jason Finch, Jean Osorio,
Jeffrey Borisch, Jelena Jovanovic, Jennifer Dixon, Jeremy Tymes, Jeremy
Wilken, Jia Fei Fei, Jiaxing Wang, Joachim Kliemann, Joan Maria Talarn,
Johannes Weiser, John Engstrom, John Fogarty, John Johnson, Jon Saw,
致谢
Jonathan Boiser, Joostc Schermers, Josh Adam, Josh Magness, José Esparza, jsnisenson, Juan Lopez, Junrou Nishida, J?rn Flath, Karthikeya Pammi, Kevin Gimbel, Kevin Ram-baud, Kevin Scheffelmeier, Kevin Youkhana, kgarbaya, konker, Kos-tas Galanos, Kris Bulman, Kyle Simpson, Lalit Agrawala, Lea P., Leonardo Di Lella, Lidor Lapid, mailtorenil, Marc Grabanski, Marco Martins, marco.scarpa, Marcus Bransbury, Mariano Campo, Mark Kramer, Martijn
Rouwendal, Martin Ansty, Martin Gonzalez, Mar-tin Luna, Massimiliano
Filacchioni, Mathias Bynens, Matt Riley, Matt Webb, Matteo Hertel, Matthew
Bagwell, Mauro Gestoso, Max Felgenhauer, Maxwell Chiareli, Michael Chan,
Michael Erdey, Michael Klose, Michael Kühnel, Michael Spreu, Michael Vezzani, Mike Kidder, Mike Parsons, Mitchell Gates, Nathan Heskew, Nathan Schlehlein, Nick Dunn, Nick Klunder, Nicolás Isnardi, Norbert Sien kiewicz, Oliver Wehn, Olivier Camon, Olivier Van Hamme, Owen Densmore,
P. Ghinde, Patrick Nouvion, Patrick Thompson, Paul Aeria, Paul Albertson,
Paul Cooper, Paul Grock, Paul Kalupnieks, Paul Kamma, Paul Vernon, Paula
Penedo Barbosa, Paulo Elias, Per Fr?jd, Peter deHaan, Peter Holzer, Peter
Piekarczyk, peterdoane, Phan An, Piotr Seefeld, Pranava S Balugari, Rahul
Ravikumar, Randy Ferrer, Renato Alonso, Rey Bango, Reynaldo Tortoledo,
Ric Johnson, Ricardo Pereira, Richard Davey, Richard Hoffmann, Richard
Weltman, Riyadh Al Nur, Robert Buchholz, Ron Male, Ryan Castner, Ryan
Ewing, Rylan Cottrell, Salvatore Torcivia, Sean Esteva, Sebastian Brieschenk,
Sergey Efremov, Sergey Melnikov, Shane Eckel, Shaunak Kashyap, Shawn
Searcy, Simeon Vincent, simonkeary, Stefan Boehm, Steve Mahony, Steven
Kingston, Stoyan Delev, Stuart Robson, Sumit Sarkar, Swizec Teller, Szabolcs
Legradi, Tanner Donovan, Ted Young, Thee Sritabtim, Thomas Noe, Thomas
Schwarz, Tim Goshinski, Tim Osborn, Tim Pietrusky, Tony Brown, Tudosa Razvan, Ture Gj?rup, Umar Farooq Khawaja, Uri Chandler, Victor Rosell,
Vinay Puppal, Vladimir Bruno, Vladimir Simonov, Vladimir Zeifman, Wayne
Callender, Wayne Patterson, Wee Keat Liew, Wes Bos, Wonmin Jeon, Yann LE CORRE, Yevgen Safronov, Yonatan Mevorach, youbiteme, Zach Gottlieb,
Zachary Hawkins, Zane Thomas, 曾坤福 , @agolveo, @amstarri, @bondydaa, @cber-genhem, @cde008, @changke, @dhtrinh02, @dlteron.green, @eduplessis, @eonilsson, @fogarty.tj, @fortune, @gm.schlereth, @illusionmh, @ jcnoble2和@michael!
和以往一样,我还要感谢我的妻子 Marianela,她始终在我身边,陪着我走过写这些书时像过山车一样起伏的情绪。我不知道她是怎么做到的。

目录

前言 VIII
第 1 章 模块化思维 1
1.1 模块化思维简介 1
1.2 模块化简史 3
1.3 模块化设计的好处 11
1.4 模块化粒度 13
1.5 模块化 JavaScript 的必要性 15

第 2 章 模块化原则 19
2.1 模块化设计的要点 21
2.2 CRUST 原则:一致、弹性、
明确、简单和小巧 35

第 3 章 模块设计 47
3.1 构建模块 47
3.2 CRUST 原则 56
3.3 修剪模块 63

第 4 章 内部构造 71
4.1 内部复杂性 71
4.2 重构复杂代码 76
4.3 像熵一样的状态 95
4.4 数据结构为王 102

第 5 章 模块化模式与实践 109
5.1 利用现代 JavaScript 109
5.2 组合与继承 121
5.3 代码模式 127

第 6 章 开发的方法与哲学 137
6.1 安全的配置管理 137
6.2 显式依赖管理 143
6.3 作为黑盒的接口 145
6.4 构建、部署与运行 146
6.5 无状态 149
6.6 开发与生产的平等性 152
6.7 抽象问题 154

读者评论

图书类别

相关图书

对比Excel,轻松学习SQL数据分析

张俊红 (作者)

本书是《对比Excel,轻松学习Python 数据分析》的姊妹篇,同样采用对比的方法,降低学习门槛,提高学习效率。全书分为3 篇:第1 篇主要介绍数据分析的基础...

 

人工智能技术商业应用场景实战

段云峰 (作者)

本书详细讲述了人工智能大潮中企业如何生存和发展,帮助企业看清人工智能,抓住生产力变革机遇,进行人工智能技术布局。<br>首先,从商业应用角度介绍了人工智能的缘起...

¥79.00

Python数据可视化之美

张杰 (作者)

本书主要介绍如何使用Python 中的matplotlib、Seaborn、plotnine、Basemap 等包绘制专业图表。本书首先介绍Python 语言编...

¥129.00

Power BI数据清洗与可视化交互式分析

张伟强 (作者)

本书是Power BI 快速入门工具书,笔者将Power BI 的知识点做了系统整理,并以案例的 方式呈现出来,使读者学习起来更轻松。全书共7 章,包括Pow...

¥59.00

深入理解TypeScript

Basarat Ali Syed (作者) 郭文超 何小磊 柳星 徐野 (译者)

TypeScript是一种由微软开发的、开源的编程语言,近两年来发展很迅猛,已经成为很多大型项目的标配。本书涵盖了TypeScript的大部分知识点,并对其进行...

 

R语言数据可视化之美:专业图表绘制指南(增强版)

张杰 (作者)

本书主要介绍如何使用R中的ggplot2包及其拓展包,以及ggraph、circlize和plot3D等包绘制专业图表。本书先介绍了R语言编程基础知识,以及使用...