一、总论
因为我没有上过走软,所以这是我第一次接触 Web 应用开发,在感觉十分新奇有趣的同时,却在编程(其实大部分时候是提需求的产品经理)总感觉自己是浮在云端的。
当我写 C 的时候我是不会这样的,我知道我写的是一门高级语言,这门语言会通过编译器编译成二进制可执行文件,二进制文件会在流水线处理器上执行,处理器会根据指令进行计算和访存,最终通过写显示器的端口输出信息,在我写 Java 的时候,我知道 Java 会先编译成 .class
字节码,然后利用 JDK 环境在 JVM 上解释执行,解释器会调用各种库,最终完成效果。
但是当我在写 html, css, javasript
的时候,我是完全没有概念的,我知道最后成果可以在浏览器上显示,但是为啥?浏览器在我的理解里,就是一个和互联网沟通的应用程序,我点开它,然后互联网就冲我挥手了,感觉似乎没有浏览器,互联网它老人家也找得到我。当我去了解后端的时候,我知道了服务器,我之前理解的服务器,就是那种深埋地下,占地和鸟巢差不多大的东西,每天都要靠全太平洋的水去降温,从事的是计算世界末日啥时候发生的重要事件,关于 URL,我以为就是一个按钮,我点一下他,互联网就来了,贼灵。
这个其实一个计算机领域很常见的现象,“封装和抽象”,人们并不需要了解每个技术的具体实现细节,只需要享受这个技术暴露在外的接口构造的抽象即可。所以将互联网理解成一个宝库一样的东西,浏览器理解成一个探寻宝库的手电,甚至将其与电视做类比,并不是一件很奇怪的事情,谁也不是先学计组,后学 C 语言的,有一个虚假的抽象不丢人。不过这层抽象和以往的抽象不同的是,这层抽象需要被几乎所有人接受,而不是像 C 一样,只需要被一部分程序员接受即可。所以“互联网-浏览器”这层抽象才那么的厚重,那么的虚幻,因为他必须简单到被所有可以上网的人理解。
这篇文章不讨论具体的技术,我只是搜集了一些资料,在我这里完成了逻辑的自洽。但是由于我不求甚解,所以可能下面的内容是不严谨的,是错误的。实在是人力有限,大家担待。
二、网络
网络并非独一无二。我们用到网络,其实是万维网,也是一个需要特定服务器才能存在的网络,并不是像空气一样天然存在的。除了万维网,还有一些内网,是搭建在其他特定的服务器上的。总之,互联网是不具有“神性”的。
如果网络较难理解,或许从物理层面比较好理解。我们可以利用电流来传播数据,所以我们可以将一个电脑的数据传输到另一个电脑上,就像用 U 盘传递数据一样,这不难理解。不过这种点对点的传输是很低效的,比如两个人合写一篇文章,那么可能是张三先在自己电脑上敲,敲完后用 U 盘拷给李四,李四敲后半段,然后敲完后再给张三改,来来回回的,十分麻烦。于是人们就想到,可不可以把文章就放在一台电脑上,然后其他人轮流操作电脑呢?会发现这样变高效了,再进一步,如果可以在自己的电脑上操作这个保存文章的电脑,那么就更高效了。那个保存数据的电脑,就成了一个服务器。
所谓的服务器,就是一个“一直开着的电脑”,其本质就是个电脑,它担任着某种意义上的“中转站”或者“资源仓库”的作用。这时候如果王五也想写文章,那么就直接将自己的电脑与“文章服务器”连接就可以了。当参加的人多了,围绕这个服务器,就形成了一个网络,这个网络如果再加入别的网络(也就是服务器连接其他服务器),可以想象网络的规模会更加大,节点会更加多。
万维网就是一个“把所有人连接”起来的网络,他和上面讲的“文章网络”本质是一样的。不过当规模大了以后,新的问题就会产生。网络传输的规则应当是同一个(类似于车同轨,书同文),这就衍生了各种网络传输协议。网络是包容的,所以网络传输的内容就必须可以以一种让所有人都理解的方式显示,这就衍生了浏览器的渲染。网络是庞大的,所以就需要有索引来定位各个网络节点和资源,这就衍生了 IP地址、域名、URL。
总之网络是没有神性的,它就像我们学过的计组、操作系统、编译器一样,是人制造了它。它可以被了解、被掌握、被攻陷、被嘲讽、被批判。
三、Web 应用
我们的数据库大作业本质上就是个一个 Web 应用。这个 Web 应用遵循“服务器-客户端”模式,也就是“后端-前端”模式。
我的理解是这样的,我们之前写的程序是在自己电脑上跑的,是很难分享给别人的,除非其他人编译运行我们的源码,或者直接运行可执行文件。而 Web 应用是这样的一个东西,真正的程序是在自己的电脑上跑的,但是程序的结果却可以通过网络的形式发送给其他人,这样其他人就会有一个错觉,认为他真的运行了这个程序,这个错觉是一个很好的错觉。
为了达到这样的目的,我们必须按照网络的规则办事情。网络传输的东西是有一定规则的,不然我们直接网络传给他一个程序得了(也不是不行,但是这样很没必要)。正是因为要守规矩,所以我们才这么的局促。我们必须用不直观的 html
来描述我们的页面,不能使用 C
语言去当运行脚本,不能写完功能啥都不管,必须将这个功能形成一个 API,让网络方便使用。
总之基本上所有额外的努力,都是因为我们要使用网络,如果没有网络,很多知识是不需要的。
四、浏览器
我之前一直以为浏览器是一个窗口,就是一个显示器,本身是没有什么功能的,所有的功能都是互联网的,而浏览器只是一个没啥用的转述者。这种认识显然是错误的。更好的比喻是,浏览器是一个热闹的码头。
在网络上传输的东西大部分是超文本形式的,所以最基础的,浏览器一定是一个渲染器,所谓的渲染,就是把 <h1>标题</h1>
这种东西变成一个大的
其次,超文本里是有脚本的,比较常见的的是 JS 脚本。不管是什么脚本,反正是一门解释型语言,那么浏览器里面一定也有一个脚本语言的解释器。确实是这样的,他在浏览器中被叫做“引擎”(好中二的名字)。
上面的知识是为了自洽前端用的,这里基本上就够了。不过在开发中,我发现浏览器简直就是一个可视化的网络监视器,我可以用浏览器查看各种网络的请求,可以看网络的状态,甚至可以下载各种文件,缓存各种数据。总之确实浏览器集成了很多的功能,给人一种“瑞士军刀”的即视感。
五、html
语法还是很简单和好学的。不过需要明确的是,这不是一门编程语言,而是一门标记语言(Mark Language)。也就是说,这东西是静态的,是不会有“变量”这个概念的。总之它可能更和 Latex
或者 Markdown
相似。
不过如果仔细想一想,还是很有意思的,为了让用户看见更加自由的界面,应该用什么样子的数据结构去表示页面。线性结构肯定是不行的,因为线性结构的描述能力太有限了,比如说 Markdown
,连一个不符合 1NF 的表格都做不了。要是严格线性,数学公式也没法打。
那么必然是有嵌套结构的(就好像画画是一层层颜料堆出来的一样),那么比较简单的嵌套结构就是树结构,而确实 html
在浏览器中的结构就是一棵 DOM
树。用标签化的语言描述树结构,也是一个很有意思的东西。
六、CSS
这个东西我接触时间不长,不过感觉只能说,排版是讲理的,渲染本质是在 html 描述的树上腾挪。
七、JS
正如前面所说的,js 是可以运行在浏览器上的,不过在学习 JS 的时候,如果只用浏览器运行代码,总感觉不是那么的过瘾,所以可以用 nodejs
作为解释器,让 js 真正像一门图灵完备的语言一样运行。
js 的本义是避免一些简单繁琐的运算,因为在没有 js 的 Web 开发中,任何的运算都需要在服务器上进行,所以来回传输十分低效。所以利用 JS 在客户端完成一些简单运输。
不过怎么说呢,感觉脚本的书写者并没有把“简单”放在心里,运行在浏览器里的 JS 代码我个人觉得十分复杂,突破了我的承受能力。js 完全拜托了 html 的辅助地位,变成了一个真正掌握用户界面的王(因为浏览器提供了接口,让 JS 操作 html 树)。
另外 Vue 框架的搭建离不开 js,我猜了猜(猜测),Vue 应该是利用 JS 实现了一个 vue 语言(就是拓展的 html)的解释器,vue 拓展语言利用了 html
的标签自定义属性,通过解析某些规定的自定义属性,完成 dom 操作,让页面变得更加的“编程化”而非“标记化”。就是不知道这个解释器是运行在 node
上(后端),还是运行在浏览器(前端)上,如果运行在前端,那么真的前端的运算强度是真的大。