一,概述

在已经有了HTML和JS,CSS的情况下,已经可以做一个非常完善的网站了。那我们为什么还需要Vue呢?

假设你要做一个待办事项列表,用户可以:

  • 输入新事项
  • 点击“添加”按钮,事项添加到列表
  • 点击事项旁的“删除”按钮,删除该项
  • 列表底部实时显示“共 X 条事项”

用原生 JS 实现大致需要:

<ul id="todo-list"></ul>
<div><span id="count">0</span></div>
<input id="input" type="text">
<button id="addBtn">添加</button>
let todos = [];
const listEl = document.getElementById('todo-list');
const countEl = document.getElementById('count');
const inputEl = document.getElementById('input');

function render() {
  // 手动清空列表
  listEl.innerHTML = '';
  // 循环生成每个li,并绑定删除事件
  todos.forEach((todo, index) => {
    const li = document.createElement('li');
    li.textContent = todo.text;
    const delBtn = document.createElement('button');
    delBtn.textContent = '删除';
    delBtn.onclick = () => {
      todos.splice(index, 1);
      render();  // 删除后又要手动重新渲染整个列表
    };
    li.appendChild(delBtn);
    listEl.appendChild(li);
  });
  // 手动更新计数
  countEl.textContent = todos.length;
}

document.getElementById('addBtn').onclick = () => {
  const val = inputEl.value.trim();
  if (val) {
    todos.push({ text: val });
    render();  // 添加后再次手动渲染
    inputEl.value = '';
  }
};

// 初始渲染
render();

这段代码暴露了三个缺点:

  1. 数据和DOM手动同步:每次数据变化(增删),都必须显式调用 render(),而且要自己操心怎么更新DOM(清空、重建、绑定事件)。
  2. 低效且易错:如果列表很大,清空重建性能差;如果忘记调用 render(),页面就会显示错误的数据。
  3. 逻辑分散:修改数据的代码(todos.pushsplice)和更新页面的代码(render)分离,维护起来很累。

而用 Vue,你可以这样写:

<template>
  <div>
    <ul>
      <li v-for="(todo, idx) in todos" :key="idx">
        {{ todo.text }}
        <button @click="todos.splice(idx, 1)">删除</button>
      </li>
    </ul>
    <div>共 {{ todos.length }} 条</div>
    <input v-model="newTodoText" @keyup.enter="addTodo">
    <button @click="addTodo">添加</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      todos: [],
      newTodoText: ''
    };
  },
  methods: {
    addTodo() {
      if (this.newTodoText.trim()) {
        this.todos.push({ text: this.newTodoText });
        this.newTodoText = '';
      }
    }
  }
};
</script>

你只需要关心数据 todosnewTodoText 的变化(调用 pushsplice、修改文本),Vue 会自动、高效地更新列表、计数、输入框。

Vue的主要作用是通过响应式的数据系统,将数据与页面内容的渲染进行声明式解耦。开发者只需要维护数据状态,Vue会自动高效地将数据状态映射到用户界面上。


二,环境搭建

1.方式一:CDN引入

CDN是什么?

CDN 的全称是 Content Delivery Network,中文叫内容分发网络。

核心思想是就近获取。

没有CDN的时候:用户访问一个网站,所有请求都要去网站原来的服务器(比如在北京)处理。如果你是广东的用户,也得千里迢迢去北京取数据,容易导致访问慢、卡顿。

有CDN时:网站会把图片、视频等静态内容提前复制并分发到全国各地甚至海外的众多“边缘节点”服务器上。广东用户访问时,系统会自动从离广东最近(比如深圳)的节点提供服务,速度飞快。

那么通过CDN引入Vue,就差不多是这种方式。

通过CDN引入Vue时,浏览器第一次会从CDN服务器下载文件并保存到本地硬盘缓存;在缓存有效期内(通常很长),第二次及以后访问时,浏览器直接从本地硬盘缓存读取,不再重新下载,除非缓存被清除或过期。

这里要说明一下缓存也是磁盘上的,关机之后不会丢失,和内存不一样,所以安全。

只需要在一个hmtl文件中加载vue3的cdn链接,就可以写vue代码了。

如下:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Vue3 CDN 示例</title>
    <!-- 1. 引入 Vue 3 全局构建版本 -->
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
    <!-- 2. 定义 Vue 将要控制的 DOM 区域 -->
    <div id="app">
        <p>{{ message }}</p>
        <button @click="changeMessage">点我</button>
    </div>

    <!-- 3. 编写 Vue 3 逻辑 -->
    <script>
        // 从全局 Vue 对象中拿到 createApp 和 ref
        const { createApp, ref } = Vue;

        // 创建应用
        createApp({
            setup() {
                // 响应式数据
                const message = ref('你好,Vue 3!');

                // 方法
                const changeMessage = () => {
                    message.value = '按钮被点击了!';
                };

                // 返回给模板使用
                return { message, changeMessage };
            }
        }).mount('#app');  // 挂载到 div#app
    </script>
</body>
</html>

常用的vue3的cdn链接:
开发版(带警告提示):https://unpkg.com/vue@3/dist/vue.global.js
生产版(体积更小,无警告):https://unpkg.com/vue@3/dist/vue.global.prod.js
ES 模块版(用于 type=“module”):https://unpkg.com/vue@3/dist/vue.esm-browser.js

2.使用脚手架创建一个工程化的vue3项目

前提:你需要先有Node.js。
Node.js 会自带 npm(包管理器),用来下载依赖和运行脚本。

使用以下命令验证:

node -v   # 应显示 v16.x.x 或更高
npm -v    # 应显示版本号

验证成功之后,我们进入创建好的项目文件夹,在文件的那个地址栏输入cmd,在命令窗口中输入以下内容:

npm create vue@latest

create-vue 是 Vue 官方推荐的脚手架工具,基于 Vite。

运行之后,会被问道几个选项:

问题 推荐选择(初学者)
Project name 输入项目名,例如 my-vue3-project
Add TypeScript? No(先不学 TypeScript)
Add JSX support? No
Add Vue Router? No(后面再学路由)
Add Pinia? No(状态管理,以后再说)
Add Vitest? No
Add an end-to-end testing solution? No
Add ESLint? No(代码检查,可先不要)

这里按照个人需要来就行。

之后我们可以看到在执行命令的文件夹之中多了刚刚创建的vue3项目。

现在我们还没有安装依赖,首先进入vue3项目之中。

cd my-vue3-project
npm install

之后启动开发服务器。

npm run dev

在浏览器中打开运行之后显示的地址,可以看到一个vue欢迎页面。

注意,这里并不能用vscode中的Live Server插件来启动,它只是一个轻量级的静态文件服务器,主要功能是把硬盘上的HTML,CSS,JS文件在本地提供一个HTTP地址来访问。
Live Server不理解Vue的代码。它无法处理 .vue 文件,也不能解析 import 这种现代JavaScript的模块语法,这些代码浏览器根本无法执行
总之,在项目的命令窗口中运行npm run dev才能运行vue项目。它不只是一个简单的HTTP文件服务器,还是一个开发环境发动机。它的核心任务就是处理那些现代前端项目(如Vue)特有的、浏览器无法直接理解的文件(比如 .vue 单文件组件),并提供一个热更新的开发环境。

假设在开发完成之后,需要把项目打包成纯粹的 HTML/CSS/JS 文件时运行。

运行以下命令:

npm run build

这会生成一个 dist 文件夹,里面的文件就是你可以部署到服务器的最终代码。

接下来说说这里脚手架生成的项目结构。

使用vscode打开项目文件,会看到已经有了以下内容:

在这里插入图片描述

文件 / 文件夹 属于哪一层 核心作用(大白话解释) 需要经常修改吗?
src/ 核心工作区 你的主战场。存放所有的源代码(JS、Vue组件、样式等)。 天天改
package.json 项目的地基 项目账本。记录了项目名称、版本以及安装了哪些第三方插件。 偶尔改(装新插件时)
index.html 项目的地基 唯一的舞台。单页面应用的入口 HTML,Vue 负责把内容塞进这里。 几乎不改
node_modules/ 项目的地基 依赖库房。存放下载好的第三方代码体积巨大,禁止手动修改。 绝不手动改
vite.config.js 工具配置 打包器配置。用来控制项目如何运行、打包、怎么处理路径。 极少改
public/ 工具配置 公共仓库。放不需要被编译的原生资源,如网页标签栏的图标。 极少改
jsconfig.json 工具配置 代码提示助手。给 VS Code 用的,让它写路径时能自动提示。 几乎不改
.vscode/ 工具配置 编辑器配置。存放只针对这个项目的 VS Code 专用设置。 几乎不改
.gitignore 工具配置 Git 忽略清单。告诉 Git 哪些文件(如 node_modules)不需要提交。 几乎不改
README.md 工具配置 项目说明书。用 Markdown 写的项目启动和开发指南。 偶尔改

代码应该写在哪里?
你未来 95% 的时间都在 src/ 文件夹里写代码。初学第一步,直接点开 src/App.vue,把你看到的所有默认内容删光,这里就是你写第一个组件、开始实现业务逻辑的地方。

更多推荐