Vue.js简介与环境搭建

0 阅读11分钟

Vue.js简介与环境搭建

每一段伟大的旅程都始于第一步。今天,我们就来迈出Vue.js学习之旅的第一步。

一、Vue.js的诞生:一个程序员的"周末项目"

2013年的某个周末,Google工程师尤雨溪(Evan You)萌生了一个想法:能不能创造一个框架,既有Angular的数据绑定能力,又像React一样轻量灵活?于是,Vue.js诞生了。

有趣的是,Vue这个名字取自法语"vue",意为"视图"。尤雨溪希望这个框架能帮助开发者更直观地处理视图层。谁能想到,这个"周末项目"如今已成为全球最受欢迎的前端框架之一,GitHub星标超过18万,仅次于React。

Vue.js的核心特性

1. 渐进式框架——像搭积木一样学习

Vue最迷人的地方在于它的"渐进式"设计理念。什么意思呢?想象你在玩乐高积木:

  • 你可以从最简单的一块积木开始(只用Vue的核心库做简单的数据绑定)
  • 慢慢添加更多积木(引入Vue Router处理路由)
  • 最后搭建出宏伟的城堡(完整的Vue全家桶项目)

这种设计让初学者不会被庞大的概念吓跑,也让老手能够按需取用。

2. 响应式数据绑定——数据变了,界面自动更新

这是Vue最让人"上瘾"的特性。传统开发中,数据变化后你需要手动操作DOM更新界面:

// 传统方式:手动更新DOM
document.getElementById('name').innerHTML = newName;

而在Vue中,你只需要:

// Vue方式:数据驱动视图
this.name = newName;  // 界面自动更新,就这么简单!

背后的原理就像一个尽职尽责的管家——你只需要告诉它数据变了,它会自动帮你把所有相关的地方都更新好。

3. 组件化开发——像写HTML一样写代码

Vue的单文件组件(.vue文件)让前端开发变得无比直观:

<template>
  <button @click="count++">
    点击了 {{ count }} 次
  </button>
</template>

<script>
export default {
  data() {
    return { count: 0 }
  }
}
</script>

<style scoped>
button {
  color: #42b983;
}
</style>

模板、逻辑、样式,三个部分清晰分离,却又紧密协作。这种组织方式让代码的可读性和可维护性大大提升。

4. Vue 2 vs Vue 3 vs Vue 3 语法糖——三种写法的演变

为了让大家更直观地理解Vue的演进,我用一个简单的计数器组件展示三种写法的区别:

<!-- ============================================ -->
<!-- 方式一:Vue 2 选项式API (Options API) -->
<!-- ============================================ -->
<template>
  <div class="counter">
    <p>计数:{{ count }}</p>
    <button @click="increment">+1</button>
  </div>
</template>
<script>
export default {
  // data: 定义响应式数据
  data() {
    return {
      count: 0
    }
  },
  // methods: 定义方法
  methods: {
    increment() {
      this.count++
    }
  },
  // computed: 计算属性
  computed: {
    doubleCount() {
      return this.count * 2
    }
  },
  // watch: 监听器
  watch: {
    count(newVal) {
      console.log('count变化了:', newVal)
    }
  },
  // 生命周期钩子
  created() {
    console.log('组件创建完成')
  }
}
</script>
<!-- ============================================ -->
<!-- 方式二:Vue 3 选项式API (Options API) -->
<!-- ============================================ -->
<template>
  <div class="counter">
    <p>计数:{{ count }}</p>
    <button @click="increment">+1</button>
  </div>
</template>
<script>
export default {
  // Vue 3 仍然支持 Options API,语法基本相同
  data() {
    return {
      count: 0
    }
  },
  methods: {
    increment() {
      this.count++
    }
  },
  // Vue 3 新增的生命周期选项
  beforeMount() {
    console.log('即将挂载')
  }
}
</script>
<!-- ============================================ -->
<!-- 方式三:Vue 3 组合式API (Composition API) -->
<!-- ============================================ -->
<template>
  <div class="counter">
    <p>计数:{{ count }}</p>
    <button @click="increment">+1</button>
  </div>
</template>
<script setup>
import { ref, computed, onMounted } from 'vue'
// ref: 创建响应式数据
const count = ref(0)
// computed: 计算属性
const doubleCount = computed(() => count.value * 2)
// methods: 直接定义函数
const increment = () => {
  count.value++
}
// 生命周期钩子(函数式)
onMounted(() => {
  console.log('组件挂载完成')
})
</script>

三种写法对比

特性Vue 2 Options APIVue 3 Options APIVue 3 Composition API
语法风格传统选项对象传统选项对象函数式 +<script setup>
代码组织按选项分类按选项分类按功能/逻辑分组
类型支持一般
复用性MixinsMixins/ExtendComposable/Hooks
学习难度

什么时候用什么?

  • Vue 2 / Vue 3 Options API :适合小型项目、Vue新手,代码结构直观
  • Vue 3 Composition API :适合中大型项目,需要更好的类型推断和代码复用
  • <script setup> 语法糖 :Vue 3.2+ 推荐写法,代码更简洁

💡 小贴士 :虽然Vue 3兼容Vue 2的写法,但官方明确表示Composition API是Vue 3的未来。新项目建议直接使用 <script setup>语法糖。

5. 虚拟DOM——性能与开发体验的平衡

Vue使用虚拟DOM技术,在内存中维护一个DOM树的副本。当数据变化时,Vue会先在虚拟DOM上进行计算,找出最小的变更,然后批量更新真实DOM。这就像一个精明的采购员,先在清单上规划好要买什么,再去超市一次性买齐,而不是想到什么买什么。


二、Vue vs React vs Angular:框架界的"三国演义"

选择框架就像选择武器,各有千秋。让我们客观地对比一下:

特性Vue.jsReactAngular
学习曲线平缓,易上手中等,需理解JSX和函数式概念陡峭,概念繁多
核心思想渐进式、模板语法组件化、JSX全面、TypeScript优先
生态系统官方维护核心工具社区驱动,选择多样大而全,官方包办
适用场景中小型项目、快速原型大型应用、跨平台企业级大型项目
国内就业需求量大,尤其中小公司大厂偏好,国际化项目相对较少

我的个人建议

  • 新手入门 :从Vue开始。它的模板语法接近HTML,概念清晰,官方文档友好(而且有完整的中文版)。
  • 职业发展 :两个都学。Vue在国内市场占有率高,React在国际化和大厂中更受欢迎。掌握两者,职业道路更宽广。
  • 团队协作 :看团队技术栈。如果团队已有明确的技术选型,跟随团队是最明智的选择。

三、环境搭建:从零开始

好了,理论聊够了,让我们动手搭建开发环境吧!

3.1 安装Node.js

Node.js是JavaScript的运行环境,也是前端工程化的基础。

Windows系统安装步骤:

  1. 访问 Node.js官网
  2. 下载LTS(长期支持版)安装包
  3. 双击安装包,一路"Next"即可
  4. 打开命令行验证安装:
node -v    # 显示Node.js版本,如 v18.17.0
npm -v     # 显示npm版本,如 9.6.7

小贴士 :安装Node.js时会自动安装npm(Node Package Manager),它是JavaScript的包管理工具,类似于Python的pip。

3.2 配置npm镜像(国内用户必看)

由于网络原因,国内访问npm官方源可能很慢。我们可以切换到淘宝镜像:

# 切换到淘宝镜像
npm config set registry https://registry.npmmirror.com
# 验证是否切换成功
npm config get registry

或者使用nrm工具管理多个镜像源:

# 安装nrm
npm install -g nrm
# 查看可用镜像源
nrm ls
# 切换镜像源
nrm use taobao

3.3 包管理器选择:npm vs yarn vs pnpm

工具特点安装命令
npmNode.js自带,最常用无需安装
yarnFacebook出品,速度快npm install -g yarn
pnpm磁盘空间效率高npm install -g pnpm

个人推荐:新手用npm足够,进阶后可以尝试pnpm(它用硬链接的方式节省磁盘空间,项目多了能省好几G)。

3.4 创建Vue项目

Vue官方提供了两种创建项目的方式:

方式一:使用create-vue(官方推荐)

# 创建项目
npm create vue@latest my-first-vue-app
# 进入项目目录
cd my-first-vue-app
# 安装依赖
npm install
# 启动开发服务器
npm run dev

创建过程中会询问是否添加TypeScript、Router、Pinia等,新手可以先全部选"No",保持项目简洁。

方式二:使用Vite直接创建

npm create vite@latest my-vue-app -- --template vue
cd my-vue-app
npm install
npm run dev

两种方式的区别:create-vue会提供更多配置选项,适合需要完整项目结构的场景;Vite直接创建更简洁,适合快速实验。

3.5 项目结构一览

创建完成后,你会看到这样的目录结构:

my-first-vue-app/
├── node_modules/     # 依赖包(自动生成,勿手动修改)
├── public/           # 静态资源
├── src/              # 源代码目录
│   ├── assets/       # 资源文件(图片、样式等)
│   ├── components/   # 组件目录
│   ├── App.vue       # 根组件
│   └── main.js       # 入口文件
├── index.html        # HTML模板
├── package.json      # 项目配置文件
└── vite.config.js    # Vite配置文件

四、Hello World:你的第一个Vue应用

让我们来写一个经典的"Hello World",顺便体验Vue的响应式特性。

4.1 修改App.vue

打开 src/App.vue,替换为以下内容:

<template>
  <div class="container">
    <h1>{{ greeting }}</h1>
    <p class="subtitle">欢迎来到Vue的世界</p>
    <div class="input-group">
      <label>请输入你的名字:</label>
      <input 
        v-model="name" 
        placeholder="在这里输入..."
        @keyup.enter="updateGreeting"
      />
      <button @click="updateGreeting">打招呼</button>
    </div>
    <p v-if="name" class="message">
      你好,<span class="highlight">{{ name }}</span>!
      很高兴认识你!🎉
    </p>
    <div class="counter">
      <p>你已经点击了 <span class="highlight">{{ count }}</span> 次</p>
      <button @click="count++">+1</button>
      <button @click="reset">重置</button>
    </div>
  </div>
</template>
<script>
export default {
  name: 'App',
  data() {
    return {
      greeting: 'Hello, Vue!',
      name: '',
      count: 0
    }
  },
  methods: {
    updateGreeting() {
      if (this.name) {
        this.greeting = `你好,${this.name}!`
      }
    },
    reset() {
      this.count = 0
      this.name = ''
      this.greeting = 'Hello, Vue!'
    }
  }
}
</script>
<style scoped>
.container {
  max-width: 600px;
  margin: 50px auto;
  padding: 30px;
  text-align: center;
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
}

h1 {
  color: #42b983;
  font-size: 2.5em;
  margin-bottom: 10px;
}

.subtitle {
  color: #666;
  margin-bottom: 30px;
}

.input-group {
  margin: 20px 0;
}

.input-group label {
  display: block;
  margin-bottom: 10px;
  color: #333;
}

.input-group input {
  padding: 10px 15px;
  font-size: 16px;
  border: 2px solid #ddd;
  border-radius: 8px;
  margin-right: 10px;
  transition: border-color 0.3s;
}

.input-group input:focus {
  outline: none;
  border-color: #42b983;
}

.input-group button {
  padding: 10px 20px;
  font-size: 16px;
  background: #42b983;
  color: white;
  border: none;
  border-radius: 8px;
  cursor: pointer;
  transition: background 0.3s;
}

.input-group button:hover {
  background: #3aa876;
}

.message {
  margin-top: 20px;
  padding: 15px;
  background: #f0fdf4;
  border-radius: 8px;
  font-size: 18px;
}

.highlight {
  color: #42b983;
  font-weight: bold;
}

.counter {
  margin-top: 30px;
  padding-top: 20px;
  border-top: 1px solid #eee;
}

.counter button {
  margin: 0 5px;
  padding: 8px 16px;
  font-size: 14px;
  border: none;
  border-radius: 6px;
  cursor: pointer;
  transition: all 0.3s;
}

.counter button:first-of-type {
  background: #42b983;
  color: white;
}

.counter button:last-of-type {
  background: #f5f5f5;
  color: #666;
}

.counter button:hover {
  transform: translateY(-2px);
  box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
</style>

4.2 运行项目

在终端执行:

npm run dev

你会看到类似输出:

  VITE v5.0.0  ready in 300 ms
  ➜  Local:   http://localhost:5173/
  ➜  Network: use --host to expose

打开浏览器访问 http://localhost:5173/,你就能看到你的第一个Vue应用了!

4.3 代码解析

让我们来理解这段代码做了什么:

模板部分(template)

  • {{ greeting }}:双大括号是Vue的插值语法,会显示data中greeting的值
  • v-model="name":双向数据绑定,输入框的值和name变量自动同步
  • @click="updateGreeting":事件绑定,点击按钮调用updateGreeting方法
  • v-if="name":条件渲染,只有name有值时才显示这个元素

脚本部分(script)

  • data():定义组件的响应式数据
  • methods:定义组件的方法

样式部分(style)

  • scoped属性:样式只作用于当前组件,不会污染其他组件

五、开发工具推荐

工欲善其事,必先利其器。以下是我推荐的Vue开发工具:

5.1 VS Code扩展

  • Vue - Official :Vue官方扩展,提供语法高亮、智能提示
  • Vue VSCode Snippets :常用代码片段,输入 vbase快速生成组件模板
  • Volar :Vue 3专用扩展(已整合到Vue - Official)

5.2 浏览器扩展

  • Vue Devtools :调试神器,可以查看组件树、状态变化、性能分析

安装方法:在Chrome/Edge扩展商店搜索"Vue.js devtools"安装即可。


六、常见问题解答

Q:Vue 2和Vue 3该学哪个?

A:直接学Vue 3。Vue 2已于2023年12月31日停止维护(EOL),Vue 3是现在和未来的主流。好消息是,Vue 3的核心概念和Vue 2基本一致,迁移成本不高。

Q:需要先学JavaScript吗?

A:需要。Vue是JavaScript框架,你需要掌握:

  • ES6基础语法(let/const、箭头函数、解构赋值等)
  • 数组方法(map、filter、reduce等)
  • 模块化概念(import/export)

Q:TypeScript是必须的吗?

A:不是必须的,但强烈推荐学习。TypeScript能让你的代码更健壮,IDE提示更友好。Vue 3对TypeScript的支持非常好。

Q:Vue CLI和Vite有什么区别?

A:Vue CLI是Vue 2时代的官方脚手架,基于Webpack构建。Vite是新一代构建工具,开发时速度更快(利用浏览器原生ES模块)。现在官方推荐使用Vite。


七、总结

今天我们完成了:

  1. 了解了Vue.js的起源和核心特性
  2. 对比了Vue、React、Angular三大框架
  3. 搭建了完整的开发环境
  4. 编写了第一个Vue应用

Vue的学习曲线平缓,文档友好,社区活跃,是入门前端框架的绝佳选择。记住,学习编程最重要的是动手实践——光看不练假把式,赶紧打开编辑器敲起来吧!


下一站预告

在下一篇文章《Vue实例与数据绑定》中,我们将深入探讨:

  • Vue实例的生命周期
  • 数据绑定的原理与技巧
  • 计算属性vs侦听器的选择

敬请期待!


作者:洋洋技术笔记

原文链接: Vue.js简介与环境搭建