[译] 前端攻略-从路人甲到英雄无敌二:JavaScript 与不断演化的框架
bbtxt
8年前
<p>继续译者的废话,这篇文章是 <a href="http://www.open-open.com/lib/view/open1469064133229.html">前端攻略-从路人甲到英雄无敌 </a>的下半部分,在上半篇中介绍了HTML与CSS的基础知识,在这里就主要介绍JavaScript与各种各样的前端框架。再安利一波笔者的我的前端之路</p> <p>笔者一直觉得不断变革的前端永远充满活力与激情,但是,哪有那么多激情燃烧的岁月,很多时候会有一种深深的无力感。B狗的才学会某个东西发现又被抛弃了,就好像笔者才决定大规模使用React+Redux+Webpack,就看到了这个 <a href="/misc/goto?guid=4959675577435511950" rel="nofollow,noindex">from-a-react-point-of-vue-comparing...</a> 。实际上,就包括React本身已经OverWhelming,对于初学者很不友好。并且各种各样的最佳实践、Boilerplate在某些意义上会反而提高学习门槛与曲线,对于这方面的讨论笔者推荐几个瞅瞅,当然,笔者本身也在思考,打腹稿中:</p> <ul> <li> <p><a href="/misc/goto?guid=4959675577524042309" rel="nofollow,noindex">javascript-fatigue</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675577614456802" rel="nofollow,noindex">state-of-the-union-js</a></p> </li> </ul> <p>我做到我已知的最好的,让最佳实践留给未来的我吧</p> <p>以下是正文部分。</p> <h2>JavaScript Basics</h2> <p>作为目前最流行的跨平台语言之一,JavaScript几乎出现在了所有的地方,但是千里之行始于足下,我们还是要先来理解JavaScript的一些基础知识。</p> <h3>Language</h3> <p>在学习怎么将JavaScript应用到Web开发之前,我们还是要看下JavaScript的基本语法。推荐阅读Mozilla Developer Network的 <a href="/misc/goto?guid=4959675577693956597" rel="nofollow,noindex">Language basics crash course</a> 。本教程会导引学习譬如基本的变量、流程控制与函数等等语言基础部分。</p> <p>读完了这个,你就可以读MDN的 <a href="/misc/goto?guid=4959638271245538556" rel="nofollow,noindex">JavaScript guide</a> 中的剩余部分:</p> <ul> <li> <p><a href="/misc/goto?guid=4959675577815088243" rel="nofollow,noindex">语法与类型</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675577896517715" rel="nofollow,noindex">流程控制与异常处理</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675577980803650" rel="nofollow,noindex">循环与迭代</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675578064494300" rel="nofollow,noindex">函数</a></p> </li> </ul> <p><a href="/misc/goto?guid=4959675578148731468" rel="nofollow,noindex">JavaScript Introduction,可以参考里面的Reference部分,有很多推荐的阅读参考</a></p> <p>同样的,不要死记硬背,你可以在你记不住的时候多看看,当然,最好的是能形成你自己的阅读笔记或者知识体系框架,譬如这个。你应当专注于理解变量初始化、循环以及函数等等关键的知识点,譬如for-in、forEach、for-of的区别,this的N种绑定方法等。如果你实在觉得这货太单调了,那也能直接跳过,以后发现啥东西不理解的时候再滚回来瞅一眼。在实践中学习可能能让你理解地更好。</p> <p>读书读累了,那可以看看视频换个脑子,这个Codecademy提供的 <a href="/misc/goto?guid=4959675578220331564" rel="nofollow,noindex">JavaScript系列教程</a> 不错,可以随手看也很有意思。另一个,如果你还有时间,可以看看 <a href="/misc/goto?guid=4958335783855988321" rel="nofollow,noindex">Eloquent JavaScript</a> 中的相关章节来加深你的记忆。 Eloquent JavaScript 是个非常优秀的在线的免费的JavaScript学习工具书。</p> <h3>Interactivity</h3> <p><img src="https://simg.open-open.com/show/4b83e70ed260ae7058fc9acca483c2e0.gif"></p> <p>到这一步你应该已经对JavaScript这门语言本身的基础知识有了了解,那么下一步就是学会如何应用到Web项目开发中。你首先需要来瞅几眼 <a href="/misc/goto?guid=4959675578338526860" rel="nofollow,noindex">文档对象模型 (DOM)</a> 来理解JavaScript是如何完成与网页的交互的。文档对象模型 (DOM) 是HTML和XML文档的编程接口。它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容。DOM 将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合。简言之,它会将web页面和脚本或程序语言连接起来。如果要做进一步了解的话推荐阅读CSSTricks出品的 <a href="/misc/goto?guid=4959675578428330132" rel="nofollow,noindex">What is the DOM</a> ,它也提供了简单而直接的对于DOM的介绍。</p> <p><img src="https://simg.open-open.com/show/abb272a98ae241a1f21b8f0dd52bc1e5.png"></p> <p>好像刚才那段对DOM的介绍有点照本宣科,CSS Tricks里是这么说的,关于DOM与HTML的区别。可能你在HTML代码中写了个 <table> 元素,但是忘了写 <tbody> ,没关系,浏览器会自动帮你插入 <tbody> 到DOM中,你可以利用JavaScript来控制该节点并且赋予样式,尽管它从未出现在你的HTML中。</p> <p>这里提供了一个简单的例子,通过JavaScript是如何改变某个DOM元素里的内容来展示基本的JavaScript与DOM树的交互,首先需要选择到对应DOM节点</p> <pre> var container = document.getElementById(“container”); </pre> <p>然后使用该DOM节点的属性来改变其内容</p> <pre> container.innerHTML = 'New Content!';</pre> <p>这只是一个简单的例子,你还可以用JavaScript DOM API干更多的事情,你可以阅读以下的MDN的教程来进行了解, <a href="/misc/goto?guid=4959675578527764237" rel="nofollow,noindex">The Document Object Model</a> .</p> <ul> <li> <p><a href="/misc/goto?guid=4959675578606578741" rel="nofollow,noindex">Events</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675578699944260" rel="nofollow,noindex">使用DOM进行Web与XML开发示例</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675578789727551" rel="nofollow,noindex">怎么创建一个DOM树</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675578338526860" rel="nofollow,noindex">DOM介绍</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675578890059795" rel="nofollow,noindex">利用选择器来定位DOM节点</a></p> </li> </ul> <p>老生常谈了,不能舍本逐末,还是要专注于理解概念而不是简单地表达式使用,要在心中默问自己几个问题:</p> <ul> <li> <p>DOM是什么鬼?</p> </li> <li> <p>怎么查询元素?</p> </li> <li> <p>怎么进行事件监听?</p> </li> <li> <p>怎么改变DOM节点的属性?</p> </li> </ul> <p>对于常见的JavaScript与DOM之间的交互, 可以参考PlainJS出品的 <a href="/misc/goto?guid=4959675578974363019" rel="nofollow,noindex">JavaScript Functions and Helpers</a> 。这个站点会给你提供很多的例子,譬如 <a href="/misc/goto?guid=4959675579056295396" rel="nofollow,noindex">如何操作DOM元素样式</a> 或者 <a href="/misc/goto?guid=4959675579137643887" rel="nofollow,noindex">怎么添加键盘事件响应</a> 等等。如果你希望再深入一点,同样推荐 <a href="/misc/goto?guid=4959675579229140825" rel="nofollow,noindex">Eloquent JavaScript</a> 中的DOM介绍的章节。</p> <h3>Inspector</h3> <p>在浏览器中,我们可以用开发者工具来调试客户端运行的JavaScript代码,譬如Firefox的Firebug和Chrome的开发者工具,可以帮你审视网页源代码,追踪JavaScript的执行过程和结果,打印出调试语句,还能瞅瞅譬如网络请求、Cookie等等资源。这个 <a href="/misc/goto?guid=4959637675583151052" rel="nofollow,noindex">tutorial</a> 是关于如何使用Chrome的开发者工具,如果你是火狐的话,瞅瞅这个 <a href="/misc/goto?guid=4959675579349494005" rel="nofollow,noindex">tutorial</a> 。</p> <p><img src="https://simg.open-open.com/show/71d0c33d0cb805772885e2184ae500ab.jpg"></p> <h2>Practicing the basics</h2> <p>上面聊完了基础的语法和交互操作,但是对于不知道有多少个坑的JS而言不过沧海一粟,不过我把一些新的东西放到了最后一节介绍,这边先放松放松,做点小实验玩玩。</p> <h3>Experiment 1</h3> <p>实验1里让我们把目光投向 <a href="/misc/goto?guid=4958877194746930068" rel="nofollow,noindex">AirBnB</a> , 打开你浏览器的 <a href="/misc/goto?guid=4959637675583151052" rel="nofollow,noindex">page inspector</a> , 然后点击 <a href="/misc/goto?guid=4959675579470644602" rel="nofollow,noindex">console tab</a> 。这样你就可以在页面上执行一些JavaScript脚本了,你可以尝试着控制一些界面元素,改个字体样式啥的。</p> <p><img src="https://simg.open-open.com/show/75f0bf327147c42947a60d25c421cfab.png"></p> <p>我选用airbnb的网站作为介绍是因为它的CSS类命名比较直接,并且没有被编译器混淆过,当然,你也可以看看百度啊之类的调试。</p> <ul> <li> <p>选择一个拥有唯一类名的header标签,改变其文字内容</p> </li> <li> <p>移除页面上的随机一个元素</p> </li> <li> <p>改变任意元素的CSS属性</p> </li> <li> <p>将一块区域的高度减小250px</p> </li> <li> <p>改变一个组件,譬如panel的可见性</p> </li> <li> <p>定义一个叫做 <em>doSomething</em> 的函数,让它弹出“Hello world”,并且执行它</p> </li> <li> <p>为某个文本块添加一个点击响应事件</p> </li> </ul> <p>如果你在那边卡住了,别忘了去看看 <a href="/misc/goto?guid=4959675578974363019" rel="nofollow,noindex">JavaScript Functions and Helpers</a> 指南,我在这边也给一个小小的例子:</p> <pre> var header = document.querySelector(‘.text-branding’) header.innerText = ‘Boop'</pre> <p>这个实验的主要目的就是回顾下你学到的JavaScript的基本语法以及一些DOM操作的知识。</p> <h3>Experiment 2</h3> <p><img src="https://simg.open-open.com/show/ffbc4da117a09e7a97562aed34d3aba6.gif"></p> <p>第二个实验使用 <a href="/misc/goto?guid=4959675579565472488" rel="nofollow,noindex">CodePen-JonathanZWhite</a> 编写一个较大较复杂的JavaScript交互项目,会用到一些 <a href="/misc/goto?guid=4959675579661475954" rel="nofollow,noindex">programmatic logic</a> 。这个实验的关注点会综合你在 <a href="/misc/goto?guid=4959675579742997501" rel="nofollow,noindex">前端攻略-从路人甲到英雄无敌</a> 中学到的关于HTML与CSS的知识,这边有几个参考项目:</p> <ul> <li> <p><a href="/misc/goto?guid=4959675579832191916" rel="nofollow,noindex">Periodic Table</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675579918595485" rel="nofollow,noindex">Mood Color Generator</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675580004259438" rel="nofollow,noindex">Calculator</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675580091302521" rel="nofollow,noindex">JavaScript Quiz</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675580173711740" rel="nofollow,noindex">Playable Canvas Asteroids</a></p> </li> </ul> <h2>More JavaScript</h2> <p>看过了基础知识,动手做了几个小实验,下面我们会进入一些更有难度的概念的学习。这边的列举的概念可能之间并么有什么必然的练习,不过我还是把它们放在了一起是因为它们能有助于你通往专家的道路,并且也能有助于你理解下面关于框架部分的讲解。</p> <h3>Language</h3> <p>实际上JavaScript并不是一门浅薄的语言,虽然它只用了短短一周时间就创建出来了,它包含了很多高级的概念与用法(并且因为历史版本问题存在着大量的Polyfill)。这里是列举出了常见的概念,同样地 <a href="/misc/goto?guid=4958335783855988321" rel="nofollow,noindex">Eloquent JavaScript</a> 也攘括了这些点:</p> <ul> <li> <p><a href="/misc/goto?guid=4959675580266362406" rel="nofollow,noindex">原型与继承</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675580351244563" rel="nofollow,noindex">作用域</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675580441709408" rel="nofollow,noindex">闭包</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675580521945963" rel="nofollow,noindex">回环</a></p> </li> <li> <p><a href="/misc/goto?guid=4959663421537250483" rel="nofollow,noindex">事件冒泡</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675580634150806" rel="nofollow,noindex">Apply, call, and bind</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675580712208917" rel="nofollow,noindex">Callbacks and promises</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675580798861744" rel="nofollow,noindex">变量与提升</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675580879496380" rel="nofollow,noindex">Currying</a></p> </li> </ul> <h3>Imperative vs. Declarative(命令式VS声明式)</h3> <p>就如同常见的两种编程方式,JavaScript与DOM交互的方式也分为命令式与声明式。一般来说,声明式编程关注于发生了啥,而命令式则同时关注与咋发生的。</p> <pre> var hero = document.querySelector('.hero') hero.addEventListener(‘click’, function() { var newChild = document.createElement(‘p’) newChild.appendChild(document.createTextNode(‘Hello world!’)) newChild.setAttribute(‘class’, ‘text’) newChild.setAttribute(‘data-info’, ‘header’) hero.appendChild(newChild) }) }</pre> <p>上面这个小例子就是典型的命令式编程,我们手动地查找到某个元素,然后将UI状态存储在DOM中,换言之,就是关注于如何达成某个目标。命令式编程的优势在于很直观,不过缺点也很明显,整个程序的健壮性很差,也不易于扩展。譬如如果某人把那个元素的类名从 hero 变成了 villain ,那么事件监听器就永远不会被调用了。</p> <p>声明式编程可以较好地解决这个问题,刚才提到的比较麻烦的元素选择这个动作可以交托给框架或者库区处理,这样就能让开发者专注于发生了啥,这里推荐一波 <a href="/misc/goto?guid=4959675580971160067" rel="nofollow,noindex">The State Of JavaScript — A Shift From Imperative To Declarative</a> 与 <a href="/misc/goto?guid=4959675552497268956" rel="nofollow,noindex">Three D’s of Web Development #1: Declarative vs. Imperative</a> 。本指南并没有一上来先给你看Angular或者React的HelloWord,而是告诉你命令式的做法和声明式的区别在哪,这样你就能更好地理解为啥我们会需要框架。</p> <p>响应式与声明式也可以看看笔者在我的前端之路里面提到的从以DOM操作为核心到数据流驱动的页面,关注发生了啥本质上就是关注状态与数据,而不是额外的操作。</p> <h3>Ajax</h3> <p>虽然已经有了很多关于Ajax的教程指南,还是建议你阅读下官方的 <a href="/misc/goto?guid=4959675581084098265" rel="nofollow,noindex">Ajax</a> 介绍。Ajax即是一个允许Web页面通过JavaScript与服务端完成交互的技术,Ajax也是前后端分离的一个基石。</p> <p><img src="https://simg.open-open.com/show/2a475896bb2c793b61441c40b1387a22.gif"></p> <p>譬如,如果你要去提交一个表单,那么就要先收集下输入的内容然后通过HTTP请求发送到服务端。你在发推ter的时候,就是推ter客户端发送HTTP请求到推ter的服务器,然后根据服务端响应来修正页面状态。推荐阅读下 <a href="/misc/goto?guid=4959675581165041429" rel="nofollow,noindex">What is Ajax</a> 来深入理解Ajax,如果还是觉得有些疑惑,那可以看看 <a href="/misc/goto?guid=4959675581250943047" rel="nofollow,noindex">Explain it like i’m 5, what is Ajax</a> ,要是还不够,那就回到 <a href="/misc/goto?guid=4959675581326364991" rel="nofollow,noindex">eloquentjavascript chapter</a> 关于HTTP的章节吧。</p> <p>早期,笔者是习惯用jQuery的$.ajax来进行Ajax操作,不过现在已经慢慢统一到了标准的 <a href="/misc/goto?guid=4959675581408786486" rel="nofollow,noindex">Fetch</a> ,你可以看看由 <a href="/misc/goto?guid=4959675581493079165" rel="nofollow,noindex">Dan Walsh</a> 写的文章来多了解下Fetch,它涵盖了Fetch的工作原理与基本的用法。因为Fetch在部分低版本浏览器上还不能使用,因此我们会选择一些Fetch <a href="/misc/goto?guid=4959675581580235468" rel="nofollow,noindex">polyfill</a> ,文档是 <a href="/misc/goto?guid=4958972275802763497" rel="nofollow,noindex">这里</a> 。</p> <h3>jQuery</h3> <ul> <li> <p><a href="/misc/goto?guid=4959675581689383945" rel="nofollow,noindex">一些jQuery使用技巧</a></p> </li> <li> <p><a href="/misc/goto?guid=4958855915361870403" rel="nofollow,noindex">也需要你压根用不到jQuery</a></p> </li> </ul> <p>到这里,咱们一直是用单纯的JavaScript来进行节点操作,怪麻烦的说,而且在不同的浏览器里还有写不同的Polyfill。实际上,已经有了大量的DOM节点的操作库来帮我们简化常用代码,其中最著名的就是 <a href="/misc/goto?guid=4958974669525712019" rel="nofollow,noindex">jQuery</a> ,一个当年前端程序猿的标配。要记住,jQuery是一个典型的命令式的操作库,它编写与前端井喷之前,在那个年代有着无可比拟的先进行。虽然今天,我们应该用像Angular、React这样的声明式编程的框架来进行复杂UI界面的编写,但是仍然是推荐学习下jQuery,毕竟还有大量的项目仍然是基于jQuery的。</p> <p><img src="https://simg.open-open.com/show/1d36f2785a4b68bc55e70c192d69641b.gif"></p> <p>jQuery官方提供了一个 <a href="/misc/goto?guid=4958530544722977674" rel="nofollow,noindex">Learning Center</a> ,是不错的基础学习的教程,它会一步一步带你学习重要的概念,譬如 <a href="/misc/goto?guid=4959675581853584886" rel="nofollow,noindex">animations</a> 与 <a href="/misc/goto?guid=4959675581934413849" rel="nofollow,noindex">event handling</a> 。如果你想要更多的学习资源,那么可以参考Codecademy的 <a href="/misc/goto?guid=4959675582022581998" rel="nofollow,noindex">jQuery course</a> 。</p> <p>不过一定要记住,jQuery并不是唯一的进行DOM操作的库, <a href="/misc/goto?guid=4959675578974363019" rel="nofollow,noindex">PlainJS</a> 和 <a href="/misc/goto?guid=4958855915361870403" rel="nofollow,noindex">You Might Not Need jQuery</a> 也提供了基于原本的JavaScript代码怎么实现常见的jQuery中的操作。</p> <h3>ES5 vs. ES6</h3> <p>在现代的前端开发中,另一个绕不过去的概念就是 <a href="/misc/goto?guid=4958969589239055305" rel="nofollow,noindex">ECMAScript</a> 。现在主要有两个常用的JavaScript版本,分布是ES5和ES6,它们呢都是JavaScript使用的ECMAScript标准。你可以把它们看做不同版本的JavaScript,ES5是在2009年定稿,然后使用至今。而ES6, 也叫作ES2015,是一个新的标准,它提供了很多譬如 <a href="/misc/goto?guid=4959638274361563027" rel="nofollow,noindex">常量</a> , <a href="/misc/goto?guid=4958967308506101269" rel="nofollow,noindex">类</a> , 以及 <a href="/misc/goto?guid=4959675582211109652" rel="nofollow,noindex">模板字符串</a> 等等特性。ES6是兼容ES5的,不像Python3和Python2,并且很多ES6带来的语法特性都是在ES5的封装的基础上,譬如ES6中的类是基于JavaScript <a href="/misc/goto?guid=4959675580266362406" rel="nofollow,noindex">prototypal inheritance</a> 的 <a href="/misc/goto?guid=4959008339887737112" rel="nofollow,noindex">syntactical sugar</a> 。</p> <p>这里推荐一个不错的ES6的教程 <a href="/misc/goto?guid=4959675582333411791" rel="nofollow,noindex">ES5, ES6, ES2016, ES.Next: What’s going on with JavaScript versioning</a> 以及Dan Wahlin的 <a href="/misc/goto?guid=4959675582421181886" rel="nofollow,noindex">Getting Started with ES6 — The Next Version of JavaScript</a> .。看完了这些,你也可以看看ES5和ES6特性的详细列表: <a href="/misc/goto?guid=4959675582505646145" rel="nofollow,noindex">ES6 Features</a> 以及 <a href="/misc/goto?guid=4958829314879541042" rel="nofollow,noindex">Github repository</a> 。</p> <h2>More Practice</h2> <p>恭喜你,成功到达存档点,你已经学了不少关于JavaScript的知识了,下面让我们来温习一波。</p> <p><img src="https://simg.open-open.com/show/c1e0bef3d12b03c55eef262154e971f7.png"></p> <h3>Experiment 3</h3> <p>Experiment 3 着重于如何利用jQuery进行常见的DOM节点操作,本实验中,我们会以一种更加结构化的方式。我是选择了Flipboard的主页作为范本,你可以参考下Codecademy的 <a href="/misc/goto?guid=4959675582618218348" rel="nofollow,noindex">Flipboard’s home page and add interactivity with JavaScript</a> 教程。</p> <h3>Experiment 4</h3> <p><img src="https://simg.open-open.com/show/6dd62a0d00ca4ff5961120af4bde1c86.png"></p> <p>按照惯例,实验4呢又把你学过的HTML和CSS的知识跟JavaScript的知识混杂到了一起进行锻炼,这是一个关于钟的实验,各种各样的钟。在动手之前推荐你看看 <a href="/misc/goto?guid=4959675582702681520" rel="nofollow,noindex">Decoupling Your HTML, CSS, and JavaScript</a> 来了解下JavaScript混入的情况下基本的CSS类名命名规范。同样的,我也准备了一系列的CodePen来当做你的教材:</p> <ul> <li> <p><a href="/misc/goto?guid=4959675582778656081" rel="nofollow,noindex">Flat Clock</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675582865991344" rel="nofollow,noindex">jQuery Wall Clock</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675582947070402" rel="nofollow,noindex">Fancy Clock</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675583035171658" rel="nofollow,noindex">Retro Clock</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675583112158102" rel="nofollow,noindex">Simple JavaScript Clock</a></p> </li> </ul> <p>如果你要更多的例子,请在CodePen上搜索 <a href="http://codepen.io/search/pens?q=clock&limit=all&type=type-pens" rel="nofollow,noindex">clock</a> 。你可以选择先写基本的HTML与CSS样式然后再加上JavaScript逻辑,也可以先写JavaScript逻辑代码然后再放入到样式中。你可以选择用jQuery,不过尽量还是用纯粹的JavaScript代码吧。</p> <h2>JavaScript Frameworks</h2> <p>小怪清完了,下面开始刷BOSS了,拿起你的剑吧勇士,美丽的公主就在前方。我们在这一章节会开始介绍常用的JavaScript框架。我们不提倡重复造轮子,但是一定要理解轮子并且能给它上上油或者换换螺丝钉,这些JavaScript框架可以帮你更好地组织你的代码。它们为前端开发者提供了可复用的解决方案,就好像所谓的设计模式一样,它可以用来解决状态管理、路由以及性能优化等等,正是因为有了这些框架,我们才能更好地构建 <a href="/misc/goto?guid=4959675583286870408" rel="nofollow,noindex">web apps</a> 。</p> <p>贪多嚼不烂,我不打算介绍所有的JavaScript框架,不过还是列个目录下来,这些框架包括但不限于 <a href="/misc/goto?guid=4958834801588021319" rel="nofollow,noindex">Angular</a> , <a href="/misc/goto?guid=4958968605084997344" rel="nofollow,noindex">React</a> + <a href="/misc/goto?guid=4959675583427680977" rel="nofollow,noindex">Flux</a> , <a href="/misc/goto?guid=4958340976610047764" rel="nofollow,noindex">Ember</a> , <a href="/misc/goto?guid=4958872202423066431" rel="nofollow,noindex">Aurelia</a> , <a href="/misc/goto?guid=4958857378973396767" rel="nofollow,noindex">Vue</a> , 以及 <a href="/misc/goto?guid=4958834640823188760" rel="nofollow,noindex">Meteor</a> 。你并不需要学习所有的框架,选择一个然后深入,最合适自己的才是最好的。</p> <p>便如译者在文首所说,我们并不能盲目地追赶框架,而是要理解框架背后的思想与原则。另一个在译者自己的实践中,会尽可能的基于ES6进行抽象,这样保证了即使换框架也能有很好地兼容于复用。</p> <h3>Architectural Patterns</h3> <p>在学习框架之前,首先要了解下常用的架构模式:</p> <ul> <li> <p><a href="/misc/goto?guid=4958969924976315648" rel="nofollow,noindex">model-view-controller</a></p> </li> <li> <p><a href="/misc/goto?guid=4959648783345459345" rel="nofollow,noindex">model-view-viewmodel</a></p> </li> <li> <p><a href="/misc/goto?guid=4959648783266255842" rel="nofollow,noindex">model–view–presenter</a></p> </li> </ul> <p>这些模式可以用来创建清晰的多层应用 <a href="/misc/goto?guid=4959630663646375669" rel="nofollow,noindex">关注分离</a> 。关注分离是一个设计原则,即是讲一个巨石型应用切分到不同的领域专注层,譬如前面我们都是在HTML中保留应用状态,而你可以使用一个JavaScript对象,或者说是Model层来存储应用状态。如果你想要了解地更多,可以先看下 <a href="/misc/goto?guid=4959675583750144045" rel="nofollow,noindex">Chrome Developers</a> 里对于MVC的讲解,然后阅读 <a href="/misc/goto?guid=4959675583844166872" rel="nofollow,noindex">Understanding MVC And MVP (For JavaScript And Backbone Developers)</a> 。阅读这篇文章的时候不要在意有没有学过Backbone,只要关注MVC与MVP比较的部分。 Addy Osman也写了另一篇关于MVVM的文章 <a href="/misc/goto?guid=4959675583937325530" rel="nofollow,noindex">Understanding MVVM — A Guide For JavaScript Developers</a> 。如果你想了解MVC的源起,可以参考Martin Fowler的 <a href="/misc/goto?guid=4959675552407209440" rel="nofollow,noindex">GUI Architectures</a> 。最后,阅读这篇 <a href="/misc/goto?guid=4959675584054990374" rel="nofollow,noindex">JavaScript MV* Patterns</a> , <a href="/misc/goto?guid=4959673630837546173" rel="nofollow,noindex">Learning JavaScript Design Patterns</a> 也是个很不错的在线免费电子书。</p> <h3>Design Patterns</h3> <p>JavaScript的框架也并没有重复造轮子,很多还是基于 <a href="/misc/goto?guid=4958988059238010315" rel="nofollow,noindex">已有的设计模式</a> ,你可以认为设计模式是在软件开发中用于解决通用问题的可复用的方法。尽管理解设计模式并不是学习一个框架的前提,不过我还是建议你可以先了解一些:</p> <ul> <li> <p><a href="/misc/goto?guid=4959675584209664406" rel="nofollow,noindex">Decorator</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675584288388599" rel="nofollow,noindex">Factory</a></p> </li> <li> <p><a href="/misc/goto?guid=4959673630915796373" rel="nofollow,noindex">Singleton</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675584405997391" rel="nofollow,noindex">Revealing module</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675584486774222" rel="nofollow,noindex">Facade</a></p> </li> <li> <p><a href="/misc/goto?guid=4959673631001715107" rel="nofollow,noindex">Observer</a></p> </li> </ul> <p>理解这些设计模式不仅会让你变成一个更好地设计师,也能有助于你更好地理解这些框架。</p> <h3>AngularJS</h3> <p>AngularJS 是一个 JavaScript <a href="/misc/goto?guid=4959675584607155925" rel="nofollow,noindex">MVC</a> 框架,不过有时候也是一个 <a href="/misc/goto?guid=4959675584691921961" rel="nofollow,noindex">MVVM</a> 框架。它由在2010年由Google进行维护并且迅速在社区刮起了一波浪潮。</p> <p><img src="https://simg.open-open.com/show/e149015d4dc3a81a3176d39f4c7125ce.png"></p> <p>Angular是一个典型的声明式框架,这里推荐一个阅读,可以帮你理解命令式编程到声明式编程的转变: <a href="/misc/goto?guid=4959675584776682671" rel="nofollow,noindex">How is AngularJS different from jQuery</a> 。如果你希望了解更多关于Angular的知识,可以参考Angular <a href="/misc/goto?guid=4959675584858745503" rel="nofollow,noindex">documentation</a> 。还有一个叫做 <a href="/misc/goto?guid=4958863464456853172" rel="nofollow,noindex">Angular Cat</a> 的渐进教程。 <a href="/misc/goto?guid=4959639315922493465" rel="nofollow,noindex">angular2-education</a> 是一个由 Tim Jacobi.整理的完整的关于angular2的教程,另外,还有John Papa编写的 <a href="/misc/goto?guid=4958966745059342027" rel="nofollow,noindex">最佳实践指南</a> 。</p> <h3>React + Flux</h3> <p>Angular帮助开发者解决了很多前端系统构建中遇到的问题,不过Angular 1存在着极大的性能问题。今年才出的Angular 2也是组件化思维,不过太过庞大。另一个常用的小而美的工具就是 <a href="/misc/goto?guid=4958968605084997344" rel="nofollow,noindex">React</a> ,专注于用户交互的构建。React可以认为是MVC层中的View层,React只是一个Library,通常与 <a href="/misc/goto?guid=4958973395995344945" rel="nofollow,noindex">Flux</a> 或者Redux一起结合起来使用。</p> <p><img src="https://simg.open-open.com/show/e800d44834df35f46cffd978a1a4c505.png"></p> <p>非死book最早设计React与Flux是为了解决MVC中的一些缺陷与扩展问题,可以参考著名的 <a href="https://www.油Tube.com/watch?list=PLb0IAmt7-GS188xDYE-u1ShQmFFGbrk0v&v=nYkdrAPrdcw" rel="nofollow,noindex">Hacker Way: Rethinking Web App Development at 非死book</a> 演讲,这里介绍了Flux的起源。首先,我们来学习React,推荐是直接看 <a href="/misc/goto?guid=4958874692283405843" rel="nofollow,noindex">React 官方文档</a> ,然后看看 <a href="/misc/goto?guid=4959675585187238137" rel="nofollow,noindex">React.js Introduction For People Who Know Just Enough jQuery To Get By</a> 来帮你从jQuery思维转移到React思维。</p> <p>可以参照译者的 <a href="/misc/goto?guid=4959675585267671035" rel="nofollow,noindex">React Introduction</a> 来获取更多关于React参考资料的东东</p> <p>在你对React有了基本的了解之后,下面就可以开始学习Flux了,同样的首先推荐 <a href="/misc/goto?guid=4958874692000698903" rel="nofollow,noindex">官方Flux文档</a> 。然后你可以看看 <a href="/misc/goto?guid=4959007488510331713" rel="nofollow,noindex">Awesome React</a> , 这里包含了很多你可以慢慢咀嚼的内容。</p> <h2>Practicing with Frameworks</h2> <p>又到了实践环节了,现在你已经对于JavaScript框架与架构模式有了基本的了解,是时候带一波节奏了。在这两个实验中,注意体会架构设计的理念,首先要保证 <a href="/misc/goto?guid=4959630663564092046" rel="nofollow,noindex">DRY</a> , 然后有一个 <a href="/misc/goto?guid=4959630663646375669" rel="nofollow,noindex">清晰的分层概念</a> , 最后要注意 <a href="/misc/goto?guid=4958987564349588981" rel="nofollow,noindex">单一职责原则</a> .</p> <h3>Experiment 5</h3> <p>实验5是不用框架重构著名的TodoMVC,换言之,就是用最基础的JavaScript代码来实现一个TodoMVC。本实验的目的就是为了向你展示在没有框架介入的情况下怎么构建一个完整的MVC应用</p> <p><img src="https://simg.open-open.com/show/4ab0a95584ba7f63a91d00df504efa07.png"></p> <p>你可以参考 <a href="/misc/goto?guid=4959675585490672850" rel="nofollow,noindex">TodoMVC</a> ,第一步就是创建一个新的本地项目然后建立三个基本的组件,你可以参考 <a href="/misc/goto?guid=4959675585571813600" rel="nofollow,noindex">Github repository</a> 这里的完整代码。如果你觉得现在的自己能力还不足以Hold住整个项目,表担心,先把它们下载下来,然后慢慢实践。</p> <h3>Experiment 6</h3> <p>Experiment 6 就是跟着Scotch.io的教程来实现一个下面这样的站点:</p> <p><img src="https://simg.open-open.com/show/1cb1aba4c6d8c38dd0d199107ff424fb.png"></p> <p><a href="/misc/goto?guid=4959675585660955321" rel="nofollow,noindex">Build an Etsy Clone with Angular and Stamplay</a> 会教你怎么基于Angular来构建一个网站,提供 <a href="/misc/goto?guid=4958987188763810914" rel="nofollow,noindex">APIs</a> 并且在一个大型的项目中进行架构组织。学完了这些之后,你要能理解以下这些问题:</p> <ul> <li> <p>啥是web app?</p> </li> <li> <p>怎么用Angular实践 MVC/MVVM?</p> </li> <li> <p>API是啥,肿么用?</p> </li> <li> <p>怎么组织与管理一个大型的CodeBase?</p> </li> <li> <p>将一个UI切分为声明式组件的好处在哪?</p> </li> </ul> <p>如果这个教程还不够,那还可以看看 <a href="/misc/goto?guid=4959675585768565377" rel="nofollow,noindex">Build a Real-Time Status Update App with AngularJS & Firebase</a> 。</p> <h3>Experiment 7</h3> <p><img src="https://simg.open-open.com/show/75363d4805a943123865820d6a1c8b75.png"></p> <p>第7个实验是将React与Flux综合使用,即利用React来构建一个TODOMVC。你可以参考 <a href="/misc/goto?guid=4959671500313555602" rel="nofollow,noindex">非死book’s Flux documentation site</a> 这个教程,它会教你一步一步地从零开始构建界面然后将Flux应用到整个Web项目中。通过了第一关,就可以移步到 <a href="/misc/goto?guid=4959675585885228666" rel="nofollow,noindex">怎么利用React、Redux与Immutable.js构建一个TodoMVC</a> 以及 <a href="/misc/goto?guid=4959675585958660118" rel="nofollow,noindex">利用Flux与React构建一个微博客</a> 。</p> <h2>Stay current</h2> <p>就像前端一样,JavaScript也永远不会停下前进的步伐。</p> <p><img src="https://simg.open-open.com/show/85925f09ce932fab460c9145c72d96b3.jpg"></p> <p>下面列举了一系列博客,多读读,能够随时了解最新的发展与消息:</p> <ul> <li> <p><a href="/misc/goto?guid=4959675586053086434" rel="nofollow,noindex">Smashing Magazine</a></p> </li> <li> <p><a href="/misc/goto?guid=4958333233077199188" rel="nofollow,noindex">JavaScript Weekly</a></p> </li> <li> <p><a href="/misc/goto?guid=4959615220898201856" rel="nofollow,noindex">Ng Weekly</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675586192829987" rel="nofollow,noindex">Reddit JavaScript</a></p> </li> <li> <p><a href="/misc/goto?guid=4959675586266116771" rel="nofollow,noindex">JavaScript Jabber</a></p> </li> </ul> <h2>Learn by example</h2> <h3>Styleguides</h3> <p> </p> <p>来自: https://segmentfault.com/a/1190000005353213</p> <p> </p>