前端三大套件:JavaScript,HTML,CSS,单独写其中一个不会觉得繁琐,但三个一起写简直就是折磨人的。

JavaScript

JavaScript 就是屎一样的语言,尽管新的 ECMAScript 标准让 JavaScript 越来越完善,但不得不向前兼容。这意味着不可能修补 JavaScript 任何一处让人恶心的语法。

再加之是浏览器的兼容问题,为了让 JavaScript 在大多数的浏览器上能够运行,前端框架的转译器会将现代的 JavaScript 语法转译成比较古老的 JavaScript 代码。比如在 WebPack 使用的 Babel 中会将 class 关键字定义的类转译成对象,类里的字段方法通过中括号符号调用。这是为了让不支持 class 关键字的上古浏览器运行。

https://wtfjs.com/ ,这个项目里讲述了 JavaScript 里迷惑的语法,这些都是 JavaScript 的缺陷。规避这些缺陷最好的方式就是尽可能使用现代的语法,完全不使用有缺陷的语法。

比如 var 关键字定义的变量会让变量在定义之前就能够使用,值是 undefined。这是因为 JavaScript 的缺陷,在执行 JavaScript 代码前就将 var 定义的变量扫描进了符号表,而导致这些变量一直都全局存在,这就是 JavaScript 的缺陷,就不应该使用 var 关键字,而是使用 let 来代替。然而这类的缺陷却被美化成 JavaScript 的特性,叫做变量提升,还经常出现在考察 JavaScript 的题目中。

这些缺陷造成了 JavaScript 极易写出 BUG。

规避 JavaScript 语法缺陷的方式就是不要使用 JavaScript,转而去写 TypeScript,并配置严格的 Lint。 TypeScript 最终也是编译为 JavaScript,借助 TypeScript 的类型系统和 null 检查能够极大完善语法缺陷。

HTML

HTML 是一个声明式的标记语言,用于标记界面。HTML 本身能做的事情是有限的,依赖于浏览器的实现。我曾经认为 HTML 是用于写界面最好的方式,写界面需要所见即所得,所以需要使用声明式。但是 HTML 重复性太高,即使是两个元素完全一摸一样也需要写两遍。好处是 HTML 对界面比较友好。

在 Flutter 中使用 Dart 来描述界面,Dart 解决了重复的问题,可以将重复的 Widget 包装成一个 Dart 类,在使用时赋予给不同的组件,而不用编写多个重复的代码。

使用前端框架能够解决这种重复工作。