Web开发这几年发生巨大的变化。从简单网页脚本开发语言到开始染指后端服务器开发,javascript生态圈群雄逐鹿,各种库插件多如牛毛,几乎无所不能,大有一统江湖的意味。
大牛Jose Aguinaga分享的在2016年如何学习JavaScript值得阅读理解https://hackernoon.com/how-it-feels-to-learn-javascript-in-2016-d3a717dd577f#.5zzf9ydlm,翻译版本(https://segmentfault.com/a/1190000007083024),本文将从本人的理解范畴,试图说明一些逐步深入学习JavaScript的学习路线的方案,当然如果你对html/css/javacript基础知识不够了解,那么你是路人甲,不属于本文要面对的范畴。本文将会涉及以下几个方面:
• Web应用开发的历史
• 一个现代的JavaScript Web应用会包含哪些部分
• 为什么不推荐使用jQuery?
• 为什么React是个不错的选择
• 为什么并不需要你首先学透JavaScript?
• 如何学习ES6语法
• 缘何与如何学习Redux?
• GraphQL到底解决了什么问题?
• 下一步又会走向何方
1 Web应用开发的历史
讲述javascript为什么要说web应用开发的历史呢?因为现代web开发,是基于移动端开发之后逐渐发展起来的。我们开始关程序叫App,有些网站称自己为Web App。08年谷歌发布了Chrome浏览器,几年之后Chrome成为了最为流行的浏览器之一。Chrome团队花费了大量精力在JavaScript上面,Web App也使用了大量的js代码,由于js历史的原因,它并不支持类/对象/模块这些现代编程语言所具有的优秀特征,这对于构建大型的复杂的Web App应用是个不小的挑战。于是就有了第三方机构和组织祭出了commonjs或amd大旗,前者是服务端规范,后者是前端规范。当然其他公司也在JavaScript投入了大量精力,现在它可以支持类和模块加载,如TypeScript,coffeeScript,flow等等可以编译为JavaScript运行,当然,未来随着浏览器对原生es6规范的支持,这些第三方语言编译的权重将会下降。
还记得 Swing、SWT 以及 wxWidget 这些东西吗?我们在浏览器上重新发明了它们,于是出现了一些新的 UI 编程模型,它们主要集中在组件化上。
我们必须想办法设计、构建和测试响应式 App,同时还要保持它们不会太臃肿,虽然人们人手一部手机,但流量并不宽裕。
于是组件框架出现了,谷歌的 Angular、Facebook 的 React 和来自开源社区的 Vue。
2007 年,Facebook 开始在美国雄起,到现在已经成为一个巨头公司。除了拥有大量的用户,Facebook 也是世界上拥有最多代码的公司之一。
Facebook 的开发团队开发了很多代码,并将它们开源。他们也有自己的开发者大会,叫作 F8。大部分巨头公司都有自己的开发者大会。
新的 App 需要越来越复杂的 UI 布局,所以 CSS 也需要有所变化。我们不再使用 table 元素来布局图像,iframe 元素也差不多销声匿迹了。我们建立了新的标准,比如 CSS Floats、Flexbox 和 CSS Grid。
人们不断地对这些标准进行迭代,开发出了各种框架,比如 Bootstrap、Foundation 等。我们还发明了一些语言,可以将它们编译成 CSS。它们弥补了 CSS 的一些不足,如变量和模块化,但还不够完美。
如果你感到疑惑,这是正常的,如果对这两年的js生态圈不够疑惑,说明,你离它太远,毕竟变化快,技术更新频繁已经是生态圈的常态了。
来,感受一下大前端。
2 一个现代的Web前端会包含哪些部分
1) css命令方案
最受欢迎的选择是 BEM ,其次是 CSS模块(CSS Modules),OOCSS和 SMACSS方案,这几种方案对css开发人员具有规范开发,指导开发的意义
2) 库和框架
js已经不是当年那个单纯的网页脚本语言了,越来越多的语言功能给赋给了js,它也能做越来越多的事情,大有统一前后端的趋势,同时由于诸如nodejs等后端平台的出现,单线程、异步I/O、事件驱动的高效方式,在一定程度上可以替代后端某些语言在多任务处理,多线程处理的优势。
当然除了jquery,还有越来越多的库被加入到当前的js的开发基础阵营之中,下图展示了多个正在前端开发中越来越重要库的占比
3) 前端打包
随着前端开发的复杂度越来越高,通过人工管理各个资源文件之间的依赖显得很不合时宜,于是出现了众多打包工具。根据Ashley Nolan 的前端问卷调查,得出来如下效果:
Gulp是最大的赢家,接近 44% 的开发人员在使用。然而,更简单的 npm scripts 脚本在2016年增加了 23% ,达到 26% 。
愚人码头注:可以查看两篇文章:为什么我放弃 Gulp 和 Grunt 而使用 npm Scripts 和 为什么使用 npm Scripts 构建项目
Grunt 已经失去了优势,跌落到 12%。另外,9% 的受访者选择了不使用任务运行器。
那些使用模块打包工具在2016年增加了 20%,达到 68% 。 Webpack 是最为流行,占 31% ,Browserify 为 11% ,RequireJS 为 8% 。
我很惊讶,“其他”模块打包工具占不到 4%,当有几个任务运行器插件可以更简单的管理依赖关系,例如 gulp-deporder 。也许因为每个开发人员都在使用JavaScript 转译器
这其中不包括es5/es6/coffescript/TypeScript等其他变异版本的js所使用的工具和特定方法,这些技术又会是另一个话题
4) 该学一些什么
实际上将前端工程分离出来成为一个独立的岗位,也是近年来的事情,在这之前应该称为大前端,因为不是说会写js,会切页面,会使用样式表就可以完成工作,毕竟之前的网页效果不像现在复杂多样,功能也没有现在纷繁复杂。目前来看,前后端分离对很多工作的细分确实提高了不小的工作效率,前端只负责页面,后台负责数据输出。这对协同工作带来的好处可能要多于从业者本身的受益。
如果你是一个想要继续前进的并且不想冒充UI工程师的前端开发者,那么你需要掌握的知识体系应该是大前端的知识体系。前端工程师,假使你不懂一些后端的知识,你永远写不出来高性能可扩展的前端代码。举个例子来说,如果你只会使用ajax请求数据,而不懂得ajax发送后数据是如何被传递出去的,是如何被加工的,是如何控制不同的数据填充的,是如何防范安全问题的等等,搞不明白这么些问题,应付简单业务尚可,处理高级应用,大规模任务将显得捉襟见肘。
那么我们该如何学习呢?学习什么技术呢?现在的前端已日臻复杂,下图是目前前端高阶阶段需要学习和掌握的一些方向,仅供参考,勿要模仿。大前端前端基础架构,如下图所示,
知识点太多,每一个展开说,将是无法完尽的篇幅,本文仅仅说一部分概览,详情请自行琢磨。
5) 前端技术概览
o 浏览器内核
♣ IE6/7/8/9/10/11 (Trident) / Edge (EdgeHTML)
♣ Firefox (Gecko)
♣ Chrome/Chromium (Blink)
♣ Safari (WebKit)
♣ Opera (Blink)
o 编程语言
♣ JavaScript/Node.js
♣ CoffeeScript
♣ TypeScript
o 页面布局编译
♣ HTML/HTML5
♣ CSS/CSS3
♣ Sass/LESS/Stylus/postCSS
♣ PhotoShop/Paint.net/Fireworks/GIMP/Sketch
o 开发工具
♣ 编辑器和IDE
♣ VIM/Sublime Text2
♣ Notepad++/EditPlus
♣ WebStorm
♣ Emacs EmacsWiki
♣ Brackets
♣ Atom
♣ Lime Text
♣ Light Table
♣ Codebox
♣ TextMate
♣ Neovim
♣ Komodo IDE / Edit
♣ Eclipse
♣ Visual Studio
♣ Visual Studio Code
♣ NetBeans
♣ Cloud9 IDE
♣ HBuilder
♣ Nuclide
♣ 调试工具
♣ Firebug/Firecookie
♣ YSlow
♣ IEDeveloperToolbar/IETester
♣ Fiddler
♣ Chrome Dev Tools
♣ Dragonfly
♣ DebugBar
♣ Venkman
♣ Charles
♣ 版本管理
♣ Git/SVN/Mercurial
♣ Github/GitLab/Bitbucket/Gitorious/GNU Savannah/Launchpad/SourceForge/TeamForge
o 代码质量
♣ Coding style
♣ JSLint/JSHint/jscs/ESLint
♣ CSSLint
♣ Markup Validation Service
♣ HTML Validators
♣ 单元测试
♣ QUnit/Jasmine
♣ Mocha/Should/Chai/Expect
♣ Unit JS
♣ 自动化测试
♣ WebDriver/Protractor/Karma Runner/Sahi
♣ phantomjs
♣ SourceLabs/BrowserStack
o 前端库/框架
♣ jQuery/Underscore/Mootools/Prototype.js
♣ YUI3/Dojo/ExtJS/KISSY
♣ Backbone/KnockoutJS/Emberjs
♣ AngularJS
♣ Batarang
♣ Bootstrap
♣ Semantic UI
♣ Juice UI
♣ Web Atoms
♣ Polymer
♣ Dhtmlx
♣ qooxdoo
♣ React
♣ Brick
♣ vue.js
o 前端标准/规范
♣ HTTP/1.1: RFCs 7230-7235
♣ HTTP/2
♣ ECMAScript3/5
♣ ECMAScript6
♣ W3C: DOM/BOM/XHTML/XML/JSON/JSONP/...
♣ CommonJS Modules/AMD
♣ HTML5/CSS3
♣ Semantic Web
♣ MicroData
♣ RDFa
♣ Web Accessibility
♣ WCAG
♣ Role Attribute
♣ WAI-ARIA
o 性能
♣ JSPerf
♣ YSlow 35 rules
♣ PageSpeed
♣ HTTPWatch
♣ DynaTrace's Ajax
♣ 高性能JavaScript
o SEO
o 编程知识储备
♣ 数据结构
♣ OOP/AOP
♣ 原型链/作用域链
♣ 闭包
♣ 编程范型
♣ 设计模式
♣ Javascript Tips
o 部署流程
♣ 压缩合并
♣ YUI Compressor
♣ Google Clousure Complier
♣ UglifyJS
♣ CleanCSS
♣ 文档输出
♣ JSDoc
♣ Dox/Doxmate/Grunt-Doxmate
♣ 项目构建工具
♣ make/Ant
♣ GYP
♣ Grunt
♣ Gulp
♣ Yeoman
♣ FIS
♣ Mod
♣ ES6+ 转换器
♣ Traceur
♣ Babel
o 代码组织
♣ 类库模块化
♣ CommonJS/AMD
♣ YUI3模块
♣ webpack
♣ 业务逻辑模块化
♣ bower/component
♣ 文件加载
♣ LABjs
♣ SeaJS/Require.js
♣ 模块化预处理器
♣ Browserify
o 安全
♣ CSRF/XSS
♣ CSP
♣ Same-origin policy
♣ ADsafe/Caja/Sandbox
o 移动Web
♣ HTML5/CSS3
♣ 响应式网页设计
♣ Zeptojs/iScroll
♣ V5/Sencha Touch
♣ PhoneGap/Cordova
♣ jQuery Mobile
♣ W3C Mobile Web Initiative
♣ W3C mobileOK Checker
♣ Open Mobile Alliance
♣ React Native
♣ ionic
o 前沿技术社区/会议
♣ D2/WebRebuild
♣ NodeParty/W3CTech/HTML5梦工厂
♣ JSConf/沪JS(JSConf.cn)
♣ QCon/Velocity/SDCC
♣ JSConf/NodeConf
♣ CSSConf
♣ YDN/YUIConf
♣ HybridApp
♣ WHATWG
♣ MDN
♣ codepen
♣ w3cplus
♣ CNode
o 计算机知识储备
♣ 编译原理
♣ 计算机网络
♣ 操作系统
♣ 算法原理
♣ 软件工程/软件测试原理
o 软技能
♣ 知识管理/总结分享
♣ 沟通技巧/团队协作
♣ 需求管理/PM
♣ 交互设计/可用性/可访问性知识
o 可视化
♣ SVG/Canvas/VML
♣ SVG: D3/Raphaël/Snap.svg/DataV
♣ Canvas: CreateJS/KineticJS
♣ WebGL/Three.JS
网友评论