谈前端框架的『御剑之道』菜鸟教程下载_前端零基础入门

编者按:本文作者 Berwin,W3C性能工作组成员,360导航高级前端工程师。《深入浅出Vue.js》(正在出版)作者。
你在使剑,是的,但是你的目的是杀人,直追你的目标,忘记手中长剑,才能使出最高的剑法… 而这世上又有多少剑客, 拘泥于手中快剑而落入俗套,终究无法到达登峰造极的境界… —-阿莱克西斯前言剑,是剑客的武器,而现代前端工程师的剑可以理解

谈前端框架的『御剑之道』菜鸟教程下载

前言

剑,是剑客的武器,而现代前端工程师的剑可以理解为前端框架(当然不止是前端框架,但今天我们只谈前端框架)。

谈前端框架的『御剑之道』菜鸟教程下载_前端零基础入门

所谓御剑之道,指的是如何驾驭所有前端框架。对,你没有看错,是所有,而不是某一个。

如果是介绍如何驾驭某一个框架,那么本文的标题可能就要改成“御剑之术”,但本文介绍的是“御剑之道”。

现代前端程序员刚一入行就要选择一款前端框架来作为自己的技术栈,比如Vue,React,Angular等。包括各种公司的招聘信息上也会写上自己希望应聘者掌握至少一种前端框架。所以很多人就会有一种困惑:我应该选择哪款框架作为我的技术栈?

image

如果你存在下面这些困惑,那么本篇文章会帮助到你:

  1. 你是初学者,不知道应该学习哪款框架来入门。

  2. 你是有经验的程序员,对于不断出现的新东西感到困惑,不知道应该“投资”哪种技术。

  3. 刚学会一个新东西,然后就发现过时了。累觉不爱,求别更新老子学不动了。

  4. 你的团队为使用哪个框架而争论不休,甚至发生宗教斗争。

我本人对Vue是最熟的,熟悉到什么程度呢?几个月前我就已经写完了一本介绍Vue原理的书(《深入浅出Vue.js》)还没上市,但我并不觉得自己是Vue阵营的人。我觉得自己是无阵营的,或者换一种角度来讲,“框架并不是我的剑”。

对于初学者来说,开局能够掌握一把绝世好剑,固然会在前期得到很大的帮助,一招练成,出手就能伤人。但也正是这把剑,如果不能在合适的阶段把它丢掉,那么它会限制自己无法到达登峰造极的境界。

独孤求败被称为『剑魔』,而他最终的境界是无剑。

《天龙八部》中描述段誉无形有质的六脉神剑时,曾写道:“使剑全仗手腕灵活,但出剑收剑,不论如何迅速,总是有数尺的距离,他以食指运那无形剑气,却不过是手指在数寸范围内转动,一点一戳,何等方便?(没错,前端工程师的剑也是同样的道理)

1. 重视框架特性,而不是框架语法

很多人在学习前端框架时,会进入到一个误区,这个误区是太过在意框架提供的语法(API)。并且喜欢对各种框架孰优孰劣要争论个高低

在实际工作中我从来不和人争论这些,但有一次和朋友们聊天刚好聊到这个话题,我说所有框架都一样用,只不过语法有点区别。其中一个朋友可能并没有理解我这句话的意思,然后发了一篇文章说Vue和React在设计理念上是有一些区别的,不只是语法。

设计理念不同导致提供的语法不同,但再怎么不同,差异再怎么大,它们要解决的问题是相同的。现在这些框架其实没有什么React能做到的事换成Vue就做不了。反而是React能做的事,使用Vue都能做,反之亦然。那么对于我来说,这两把剑就是一样的,只是使用起来手感不太一样。还是那句话,要直追我们的目标,不要拘泥于手中的剑。

站在“术”的角度看,它们确实不一样,而且可以说几乎没有一样地方。但是站在道的角度看,它们是一样的。

所以你会发现,我关注的根本就不是框架提供的语法,我关注的是框架的特性。我说的框架特性,指的不是React提供了JSX,或者Vue提供了模板语法。这些不是我所说的特性,这些其实还是语法。

那么框架的特性到底指的是什么呢?我们举两个例子来感受一下。

1.1 声明式 & 数据驱动渲染

更深一步思考,React提供的JSX和Vue提供的模板,它们的目的是什么?目的是为了实现声明式渲染的功能。不论是JSX,或者是Vue中的模板,本质上都是描述了『状态』与『视图』之间的映射关系。

所以声明式渲染是框架的特性。

声明了映射关系之后,可以得到一个公式:

UI = render(state)

状态与视图之间的映射关系,等同于render函数。熟悉React的同学对这个公式应该并不陌生。JSX与Vue的模板在这一点上是相同的。在框架的内部,不论是JSX还是Vue的模板,最终会编译成render函数。

上面这个公式,输入的是state,输出的是DOM。所以输入变了输出就变了。

这个特性就是我们常说的数据驱动视图。

这里会引出一个问题,框架必须要知道Web应用在运行时”状态“是否发生了变化,然后才能使用前面提到的公式重新输出一个新的UI。所以如何知道Web应用的状态在运行时是否发生了变化这个问题是所有框架必须去解决的。

解决方案有很多种。不同框架,或者同一个框架的不同版本对这个问题的解决方案都不同,但相同的是都可以解决问题。关于这个问题如何解决,我在曾在我的文章、分享的PPT以及目前还未上市的书中都有详细的介绍。这个问题不是本文所讨论的重点,感兴趣的同学可以点击这里了解更多信息1。

不同的解决方案,导致的直接结果就是它所提供给用户的上层语法或API完全不一样。

1.2 组件

现代主流框架都具备的一个特性是“组件”,它们都会以“组件”作为一个基本的抽象单元。

可能不同的框架,它所提供的操控组件的方式不一样,但概念上是相似的。

之前听过一次尤雨溪的知乎Live,他将实际应用中的组件分为四种类型并依次介绍了四种组件之间的区别:

  • 展示型组件
  • 接入型组件
  • 交互型组件
  • 功能型组件
    功能型组件是比较抽象的组件。用Vue举例,路由的和Vue自带的都属于功能型组件。它本身不渲染任何内容,它是一个逻辑型的组件。它通常作为一个扩展或一种抽象机制存在。

不同框架操控组件的方式可能不一样,但使用组件的“心法”永远是一样的。这就是关注特性带来的好处,你可以切换到任意一个框架,使用组件或封装组件时,总是上面列出的几种类型。

掌握了“心法”的程序员在切换框架时,他的状态通常是这样的:我现在想写一个交互型组件,这个框架都提供了哪些API?去翻翻文档看一下。然后就可以写出一个很优雅的组件出来,哪怕刚使用这个框架才不到一天。

如果没有掌握“心法”,用了一个框架写出的代码很糟糕,那么换了一个框架也不会写出更好的代码,甚至更糟糕。

1.3 其他特性

前面详细介绍了两个特性给大家感受下为什么要重视特性。框架的特性太多不能每一个都详细介绍,下面列出一些大家比较熟悉的通用特性:

  • 路由
  • 状态和数据流管理
  • CLI工具
  • 同构/服务端渲染
  • CSS 管理方案
  • 。。。。。

1.4 小结

对于初学者不知道应该学哪种框架的问题,其实大可不必这么纠结,随便选一个去学(当然是学特性),以后切换到其他框架也是很轻松的事情。

有经验的程序员也无需担心投资了一个框架,刚学会就过时了。框架虽然过时了,但内功心法却深深地扎在你的脑袋里。

为团队选择技术栈所考虑的因素与人不一样。就目前来看,各大主流框架所提供的能力与社区的繁荣程度并没有明显的差距,所以框架是否靠谱等问题基本上不需要考虑,更多要考虑的因素反而是:

  1. 团队大部分成员的口味更倾向于哪种。

  2. 技术栈是否容易招人。

  3. 团队内是否存在该技术栈的专家。

  4. 其他因素。

当团队确定好了技术栈之后,最重要的是统一。一个团队内部只存在一种技术栈并打磨出成熟的架构与工作流之后,会大幅提升团队内的生产效率。

2.自己动手实现框架特性

在学会了框架的特性之后,若想达到“无剑”的境界,那就需要具备实现这些特性的能力。只有具备了这样的能力,你才能完全理解一种“特性”,从而达到人剑合一的境界。否则这些特性对你来说是一个黑盒,你永远不知道它内部发生了什么,你就只是这把剑的使用者,无法真正的驾驭它们。你会被框架的设计者牵着鼻子走,然后无奈地说一句:求别更新,老子学不动了。

注意,前面提到的是实现这些“特性”的能力,当然如果能实现一个完整的框架更好。但一个框架通常会有很多很繁琐的东西会消耗掉很多精力,而那些东西其实并不是很关键,就像我们平时写代码一样,总是有很多没什么技术含量的体力活。

举例来说,真正能让我们完全理解“声明式 & 数据驱动渲染”这个特性的方式就是亲自动手去实现它。当然,不同框架或者同一个框架的不同版本对这个特性的实现方式都不太一样。但这都没关系,当我们亲自动手用某一种方式实现它之后,我们就能真正理解不同的实现方式之间各自有什么取舍,只有亲自动手实现了某个特性之后我们才能知道不同的实现方式有哪些优势,为了得到它而付出的代价(舍弃的)是什么。

对“声明式 & 数据驱动渲染”这个特性的实现方式感兴趣的同学可以看我的另一篇文章《聊聊我对现代前端框架的认知》,在这篇文章中,有一个小节“现代前端框架对渲染的处理”对这个问题进行了相关的介绍。

3. 总结

本文说了这么多,但其实只讲了一个道理,就是要重视『特性』,而不是语法与API。

还有就是本文开头的那句话,如果想达到登峰造极的境界,就不要过于专注手里的剑。框架既是神兵利器,也是枷锁。既赋予我们力量,也束缚着我们。

若想挣脱这个枷锁,就要达到“手中无剑,心中有剑”的境界。

初学者最开始学武往往急于求成,学了一招出手就想伤人。但殊不知真正的高手很少杀人。

中前期学发,中后期学收,收发自如,神功乃成。

海计划公众号
(0)
上一篇 2020/04/03 19:41
下一篇 2020/04/03 19:41

您可能感兴趣的内容

  • 人们需要担心的7种云计算攻击技术菜鸟指南_云计算基础教程

    人们需要担心的7种云计算攻击技术菜鸟指南 安全专家对网络攻击者针对企业云计算环境实施的常见和相关的攻击方法进行了阐述和分析。 随着越来越多的企业将业务迁移到云计算环境,寻求攻击的网…

    2020/03/20
  • Typescript 严格模式有多严格?基础教程_模式小白常识

    前言”use strict” 指令在 JavaScript 1.8.5 (ECMAScript5) 中新增。至今,前端 er 们基本都默认开启严格模式敲代码。那么,你知道 Typescript 其实也有属于自己的严格模式吗?1. Typescript 严格模式规则当 Typescript 严格模式设置为 on 时,它将使用 strict 族下的严格类型规则对

    2020/03/23
  • mobilebone.js入门基础知识_单页切换骨架

    mobilebone.js入门基础知识 官方网址:http://www.mobilebone.org GitHub:https://github.com/zhangxinxu/mo…

    2020/03/06
  • Composer攻略教程_Packagist / Composer中国全量镜像

    Composer攻略教程 官方网址:https://pkg.phpcomposer.com/ 简介描述:Packagist / Composer中国全量镜像 Packagist /…

    2020/03/06
  • 软件开发教给我们的7个生活指南菜鸟教程网_开发小白知识

    我们在做软件开发时学到的很多思维、方法、工具、模型、算法……其实可以迁移到生活中使用,让我们生活得更美好哦。我这里暂举 7 个,以后有时间,慢慢补坑,争取补到 60 个。大家有兴趣的,可以留言补充你最有感觉的。1. 网络协议应用于人际沟通在网络编程中,客户端和服务器要通信,必须寻找特定端口,建立链接,遵守一定的协议,才能传输数据。比如 http、ftp、te

    2020/04/03
  • JS设计模式:单例模式使用帮助_模式小白基础

    单例模式单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。 ———来自维基百科 一个很典型的应用是在点击登录按钮,弹出登录浮窗,不论点击多少次登录按钮,页面始终只会弹出一个登录浮窗。实现单例模式思路很简单,用一个变量记录是否已经为某个类创建过对象,如果没有则返回新建的对象,反之则返回之前创建的对象。在构

    2020/03/29
  • 6种JavaScript继承方式及优缺点基础知识教程_继承小白常识

    友情提示:想要更好的理解JS继承方式,须了解构造函数、原型对象、实例化对象、原型链等概念第一种:原型链继承利用原型链的特点进行继承function Parent(){
    this.name = ‘web前端’;
    this.type = [‘JS’,’HTML’,’CSS’];
    }
    Parent.prototype.Say=function(){

    2020/03/20
  • 学习掌握小白攻略proto与prototype_prototype攻略教程

    一,前言对一个知识点是否完全把握,最好的校验方法就是能否用自己的语言将其表述出来。 原型与原型链一直是学习 JS 绕不过的知识点,其中proto 与 prototype 最为让人头疼,这里简单的写下我自己的理解,从原型与原型链中拆解 proto 与 prototype ,希望能对大家有所帮助。一,原型1,定义在javascript中,函数可以有属性。 每个

    2020/03/24
  • Typr.js使用教程_用于处理字体(TTF,OTF)的Js解析器

    Typr.js使用教程 GitHub:https://github.com/photopea/Typr.js 简介描述:用于处理字体(TTF,OTF)的Js解析器 Typr.js是…

    2020/03/10
  • 网站web服务器个人博客站开通那些端口合适?入门基础_博客使用帮助

    一般网站服务器,只需要开通80 443,(ssh端口默认22,,建议修改)ping命令没有端口,因为ICMP 协议没有到tcp层,仅走ip层,由于IP层协议是一种点对点的协议,而非端对端的协议,它提供无连接的数据报服务,没有端口的概念。端口 服务 说明21 FTP FTP 服务所开放的端口,用于上传、下载文件。22 SSH SSH 端口,用于通过命令行模式

    2020/03/22
  • Canvasjs小白入门一款易用的 HTML5 & JavaScript 图表库

    Canvasjs基础入门 官方网址:https://canvasjs.com/ 简介描述:一款易用的 HTML5 & JavaScript 图表库 CanvasJS…

    2020/03/05
  • 基于框架搭建与布局系统基础指南_框架入门基础教程

    前言我们在开发一个系统的时候,最重要的就是选择系统开发框架,其次选择UI,有了框架会使我们接下来的开发就游刃有余,大大提升我们的开发效率。那么我们如何选择框架?如何基于框架搭建系统?系统如何布局呢?一、框架简介1.框架与架构什么是框架框架是实体,是系统或子系统的半成品什么是架构架构是抽象的重要策略,是技术整合、扩展如果把开发一个系统比作造房子,那么架构是地基

    2020/03/23
  • 前端BEM命名方式的思考小白常识_命名菜鸟教程网

    最初的思考思考来源于要给切图网 qietu.com 改一次版,作为前端开发服务商,我觉得应该要有自己的一款前端CSS框架,并且这个框架不应该只是随便写写,最好能够用在官网上,拿官网做背书,于是在研究了火狐、adobe、微软、google amp等官网以后,写了一款quickly.css响应式前端框架并且开源,并且用在了新版网站上。问题?在写框架的时候,定义了

    2020/03/22
  • layaair基础指南_开源游戏引擎

    layaair基础指南 官方网址:http://ldc.layabox.com/ GitHub:https://github.com/layabox/layaair 简介描述:开源…

    2020/03/06
  • Js将十进制转换为十六进制?入门基础教程_进制入门基础

    JavaScript中有很多内置函数可以帮我们进行数(进)制转换。那么给定一个十进制数字,如何将数字从十进制转换为十六进制?下面本篇文章就来给大家介绍一个使用JavaScript将十进制转换为十六进制的方法 。想要使用JavaScript将十进制转换为十六进制,可以通过使用toString()方法来完成。该方法接受转换进制基数的参数,这种情况下基数是16。语

    2020/03/24
  • JS操作符、控制流程、循环、字符串/数组方法基础教程_操作基础知识

    操作符算术运算符:+ 、- 、 * 、 / 、 %、++、–赋值运算符:= 、+=、-=、 *=、/=、%=比较运算符:>、>=、<、<=、!=、==、===(全等,数据类型也会去比较)逻辑运算符:&&(与)、||(或)、! (非)流程控制以下在进行判断的时候为假0nullundefinedNaN"" 空字符串falseif elseif (…) {.

    2020/03/23