【无标题】
一个初学者搞懂vue的过程
作为一个代码初学者,我花了一晚上才搞懂:天天见的 Vue,到底是个啥?
一篇没什么技术含量、但很真实的胡思乱想。
如果你也是初学者,也曾被「Vue 到底是什么」卡住过,这篇也许正好戳中你。
(文中很多是我作为初学者的理解,为了好懂做了简化,有不准确的地方欢迎指正。)
起因:我好像一直在「用」Vue,却从来不知道它是什么
最近学代码,我发现自己老是撞见一个词——Vue。
看教程,它在;看别人的项目,它在;招聘要求里,它也在。我跟着敲、跟着跑,页面是出来了,可心里一直有个疙瘩:
我到底在用一个什么东西?
直到有天我手贱按了 F12,想看看一个「用 Node.js 写的前端页面」底下到底是什么,结果——
我看到的还是 HTML。
那一刻我是懵的。我寻思:不对啊,这页面不是用 Vue 写的吗?那 Vue 呢?说好的 Vue 在哪?怎么扒到最后还是我最早学的那个 HTML?
那 Vue 到底是个什么东西?
这个问题像根刺一样扎在那儿,于是我决定,今晚必须把它刨明白。下面是我一层层追问、一次次「我以为…结果不是」的全过程。
疑问一:F12 看到的是 HTML,那 Vue 算什么?
我一开始的想法是:既然用了 Vue,那页面底下就不该是 HTML 了吧?应该是某种「更高级」的东西?
结果我想错了。
我后来才反应过来一件特别基础、但我一直没意识到的事:
浏览器从头到尾就只认识三样东西:HTML、CSS、JavaScript。
不管你用什么花里胡哨的框架,最后能塞进浏览器、能被显示出来的,永远只能是这三样。这是底线,没得商量。
所以我 F12 看到 HTML,根本不是出了问题,反而说明一切正常。
那 Vue 干嘛的?我打了个比方给自己听:
- HTML/CSS/JS 是砖、水泥、钢筋(浏览器唯一认的建材);
- Vue 不是要取代砖头,而是一套帮你又快又稳地把砖头码成楼的工具。
换句话说,Vue 的全部工作,就是为了更聪明地产出这些 HTML。我以为它会让 HTML 消失,其实它是 HTML 的「幕后生产者」。他俩压根不是竞争关系。
疑问二:那「框架」这个词,到底什么意思?
搞清楚上一条,新问题又冒出来了:大家老说 Vue 是个「框架」,React 也是「框架」……框架到底是个啥?
我之前对这词完全没概念,感觉就是个唬人的术语。后来我试着用「不用它会怎样」来理解,一下就通了。
假设我想做个最简单的功能:点一下按钮,页面上的数字加一。
如果不用任何框架,我得自己「找到那个数字、盯着按钮、点了之后亲手把新数字塞回页面」——一个数字还好,要是页面上几百个地方都依赖这个数字,我就得手动更新几百次,想想都崩溃。
而用了 Vue,我只要声明一句「这里显示这个数字」「点按钮就让它加一」,剩下的——数字一变,页面哪儿用到它,Vue 自动帮我全更新了。
那一刻我突然懂了:
框架 = 别人提前替你写好的一大坨代码,把那些又重复又容易出错的脏活累活包办了,你只管按它的规矩填空。
就像盖房子用的预制框架结构:最难的承重抗震骨架,别人已经搭好了,你只管往里砌墙装修,不用从「怎么让房子不倒」开始操心。
(后来我还了解到一个更精妙的区别:普通的「库」是你去调用它,而「框架」是它反过来调用你——你把代码交给它,它在合适的时机回头来用你。有个很形象的说法叫「别打给我们,我们会打给你」。这个我暂时还没完全消化,先记下了。)
疑问三:等等,Node.js 不是一门「语言」吗?
讲到这我又卡住了。因为我一直把 Node.js 当成一门编程语言,类似「前端用 Vue,后端用 Node 这门语言」。
结果又是我想当然了。
真相是:
JavaScript 才是语言。Node.js 是「让 JavaScript 能在浏览器之外运行」的环境。
我给自己这么理解的:JavaScript 像「普通话」这门语言,而——
- 浏览器:是一个会说普通话、但只在网页里干活的人(它能操作页面,但不能碰你电脑的文件);
- Node.js:是另一个也会说普通话、但在服务器/电脑上干活的人(它能读写文件、能开服务器,但它面前根本没有网页)。
同一门语言,换个地方说,能干的活就完全不同了。 原来所谓「前端」和「Node 写的后端」,用的其实是同一门语言 JS,只是跑的场合不一样。难怪当年 Node 火,因为前后端能用一种语言了。
疑问四:那 Node.js 是不是就等于 V8 引擎?
我继续往下挖,又听说了一个词叫 V8 引擎,据说浏览器和 Node 里都有它。我就寻思:那 Node 是不是就是把浏览器里的 V8 搬到了电脑上?Node 是不是就等于 V8?
还是不对。
V8 只是一个「负责执行 JavaScript」的零件,而 Node 是「用了 V8 这个零件、再加一堆别的能力」组装出来的整机。
我用汽车来理解:
- V8 = 发动机。它只干一件事:把 JS 跑起来。它不会读文件、不会开网络。
- 浏览器 = 一辆「网页用」的车:发动机(V8) + 显示和操作网页的能力。
- Node.js = 一辆「服务器用」的车:发动机(V8) + 读写文件、开服务器的能力。
所以浏览器和 Node 共用 V8 这同一款发动机,但它俩是两辆为不同用途造的车。V8 是它们的零件,不是它们本身。
疑问五:那 Node 到底懂不懂 Vue?
到这我自以为快通了,但马上撞上一个更绕的问题。
我之前隐约觉得:开发时我写的那个 .vue 文件,浏览器看不懂,得「翻译」一下——那这个翻译,是不是 Node 来干的?是不是 Node 懂 Vue?
答案让我有点意外:Node 也不懂 Vue。
我看了一眼 .vue 文件长啥样,瞬间理解了为什么——它把 HTML、JS、CSS 三种东西塞进了一个文件,后缀还是个自创的 .vue,这玩意儿浏览器不认识,Node 同样不认识,就是个「四不像」。
那到底谁翻译它?答案是一个单独的工具,叫 Vite(或者 Webpack 这类)。
真正「懂」Vue 的,是 Vite 这个工具的代码。Node 只是负责「让 Vite 这个工具能在我电脑上跑起来」而已。
我打了个比方:Node 不是翻译官,它是「让翻译官能上班的办公室」。 翻译官是 Vite。你不能说办公室会翻译,对吧?
(更狠的是,我后来发现连 V8 都不「懂」Vue——V8 只是无脑地、一条条地执行别人写好的指令,就像一个不懂法语、但能严格照菜谱操作的厨师。真正懂法语的,是写菜谱的人,也就是 Vite 的作者。「懂 Vue」这件事,既不在 Node 里,也不在 V8 里,而在 Vite 那帮程序员写下的代码里。)
疑问六:Vite 是不是也像 V8 一样,是 Node 里的零件?
既然 Vite 跑在 Node 上,我又自然地想:那 Vite 是不是也是 Node 的一个内置零件,跟 V8 一样?
不是。这俩根本不是一个层级的东西:
- V8:装 Node 时自带的,焊死在里面,拆不开——像车里出厂自带的发动机。
- Vite:要你单独安装才有的、跑在 Node 上面的一个软件——像你后来自己下载安装的一个 App。
我后来想到一个特别贴切的类比:
Node = 操作系统(Windows / macOS),Vite = 你装在上面的一个 App(比如 Photoshop)。
你不会说「Windows 本身就会修图」吧?是你装了 Photoshop,电脑才会修图。Vue 也一样:是我装了 Vite,Node 才能翻译 Vue。
疑问七:那「翻译」是不是就是把 .vue 拆成 HTML/CSS/JS 三个文件?
这是我自以为最有把握的一个猜测——.vue 里不是有 <template>、<script>、<style> 三块吗?翻译是不是就是把它们拆成三个文件:html、js、css?
结果这里有个最反直觉的点,让我印象最深:
那个看起来像 HTML 的
<template>,翻译完不是变成.html文件,而是变成了 JavaScript!
为啥?我想了一下就服了:
.html文件是死的、固定的。如果把内容写死成 HTML,那数据一变,页面就永远不会更新了。- 但 Vue 的全部意义就是「数据一变,页面自动更新」。要做到这点,模板就不能是死的 HTML,必须变成一段能反复执行、根据最新数据重新生成页面的 JS 代码。
所以真相是:<style> 抽成 CSS,<script> 留成 JS,而 <template> 被编译成了一段 JS 函数——最后打包出来的东西,绝大部分其实是 JavaScript。我 F12 看到的那些 HTML,是这些 JS 在浏览器里跑起来之后,才动态生成出来的。
到这我才终于把最开始那个谜解开了:怪不得我扒到底看到的是 HTML——因为那本来就是 JS 现场「画」出来的成品啊。
疑问八:那 Vite 为什么非得建在 Node 上?又为什么不干脆焊进 Node 里?
最后两个问题,已经有点「打破砂锅」了,但我觉得问得值。
为什么 Vite 要建在 Node 上? 因为 Vite 干的活——读我硬盘上的源文件、把翻译结果写回硬盘、开个本地服务器、监听文件改动——这些浏览器一样都干不了(浏览器被关在安全沙箱里,碰不了你的文件)。而能「在电脑上跑 JS + 又有权限碰文件和网络」的成熟环境,基本就只有 Node 一个。所以不是随便选的,是几乎没得选。
那为什么不把 Vite 直接焊进 Node、做得更底层? 这个我一开始觉得「越底层不是越厉害吗」,后来发现恰恰相反:
Node 要服务千万种用途(写后端、做爬虫、跑机器人……翻译 Vue 只是其中之一)。如果把 Vite 焊进去,那 React 的工具、各种数据库……是不是都得焊进去?Node 会臃肿到没法用。
还是那个操作系统的类比:你不会因为有人要修图,就把 Photoshop 焊死进 Windows。 操作系统保持通用、保持小,具体功能做成 App 按需安装——这样才轻量、灵活,工具还能互相竞争着进步。
原来「底层留一个小而通用的核心,具体功能叠在上面按需安装」,是一种很普遍的、聪明的设计思想。「在上面」不是退而求其次,而是故意为之。
一晚上下来,我到底搞懂了什么?
把这一串问题串起来,最后我脑子里终于有了一张清晰的图:
我写的
.vue源码(浏览器和 Node 都不认识)
→ 开发时 Node 跑起 Vite 这个翻译工具
→ Vite 把.vue翻译、打包成浏览器能认的标准 JS / CSS + 一个空壳 HTML
→ 浏览器下载后用自己的 V8 执行那些 JS
→ JS 在页面上动态生成出 HTML
→ 这就是我 F12 看到的东西。
但比这些具体概念更让我开心的,其实是我顺手捡到的两个看问题的角度:
- 「语言」和「运行它的环境」是两回事——JS 是语言,浏览器和 Node 是两个能执行它的不同环境,换环境,能干的事就变了。
- 系统是「分层」搭起来的——底层通用、上层具体,各管各的、各自进化。
说实话,作为一个还在入门的人,我不敢保证上面每个细节都百分百精确(欢迎大佬指正)。但从「F12 一脸懵」到能把整条链路讲给自己听,这个过程本身,比记住任何一个名词都让我有成就感。
如果你也曾经被同样的问题卡住过,希望这篇瞎琢磨,能帮你也通一通。
本文的概念是我在反复追问、不断纠正自己误解的过程中梳理出来的(其中借助了 AI 一问一答的帮助)。为了让初学者好懂,做了不少简化,严谨性上如有疏漏,欢迎在评论区拍砖。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)