本文详细介绍了Vue3的基础入门知识,包括基本语法、组件化开发和响应式系统,并深入讲解了Vite的使用方法,如创建Vue3项目和配置Vite。通过实战案例,你将学会如何结合Vue3和Vite开发一个简单的待办事项应用。Vue3+Vite学习涵盖了从基础知识到实战项目的全流程。
Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。Vue 3 是 Vue.js 的最新版本,它在性能、API 和工具支持方面带来了显著的改进。Vue 3 引入了许多新特性和改进,如 Composition API、更小的包体积、更好的 TypeScript 支持等。
Vue 3 的基本语法与 Vue 2 非常相似,但引入了一些新的特性。下面是一个简单的 Vue 3 应用的基本结构:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue3 基本示例</title> <script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://unpkg.com/vue@next"></script> </head> <body> <div id="app"> {{ message }} </div> <script> const { createApp } = Vue const App = { data() { return { message: 'Hello, Vue3!' } } } createApp(App).mount('#app') </script> </body> </html>
在 Vue 3 中,组件化开发是一个核心概念。组件是可复用的 Vue 实例,可以组合成应用的结构。每个组件都有自己的作用域。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue3 组件示例</title> <script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://unpkg.com/vue@next"></script> </head> <body> <div id="app"> <my-component></my-component> </div> <script> const { createApp, h } = Vue const MyComponent = { render() { return h('div', this.message) }, data() { return { message: 'This is a custom component' } } } const App = { components: { MyComponent }, template: '<my-component></my-component>' } createApp(App).mount('#app') </script> </body> </html>
Vue 3 的响应式系统通过依赖追踪和变更通知机制来实现视图的自动更新。Vue 3 使用 Proxy 对象来实现响应式,使得响应式系统更加高效和灵活。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue3 响应式示例</title> <script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://unpkg.com/vue@next"></script> </head> <body> <div id="app"> {{ message }} <button @click="changeMessage">Change Message</button> </div> <script> const { createApp } = Vue const App = { data() { return { message: 'Hello, Vue3!' } }, methods: { changeMessage() { this.message = 'Message changed' } } } createApp(App).mount('#app') </script> </body> </html>
Vite 是一个由 Vue.js 官方团队推出的新的前端构建工具,它基于原生 ES 模块,具有极快的冷启动速度和开箱即用的热更新功能。Vite 在开发和生产环境中都提供了出色的性能和体验。
要使用 Vite 创建一个新的 Vue 3 项目,可以使用 vite create vue
命令。此命令会自动为你设置好一个基本的开发环境。
npm create vite@latest my-vue-app -- --template vue cd my-vue-app npm install npm run dev
Vite 的配置文件是 vite.config.js
。在这个文件中,你可以自定义项目的各种设置,如添加额外的构建选项、配置插件等。
// vite.config.js import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' export default defineConfig({ plugins: [vue()], server: { port: 3000, open: true, hmr: true } })
Vite 的开发服务器提供了一系列功能,如自动重启、热更新等,使得开发过程更加流畅。
// vite.config.js import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' export default defineConfig({ plugins: [vue()], server: { port: 3000, open: true, hmr: true } })
要创建一个新的 Vue 3 项目并集成 Vite,可以使用 npm
命令:
npm create vite@latest my-vue-app -- --template vue cd my-vue-app npm install npm run dev
一个典型的 Vue 3 + Vite 项目包含以下目录结构:
my-vue-app/ ├── node_modules/ ├── public/ │ └── index.html ├── src/ │ ├── assets/ │ │ └── logo.png │ ├── components/ │ │ └── HelloWorld.vue │ ├── App.vue │ └── main.js ├── vite.config.js └── package.json
在 vite.config.js
中,你可以进行一些配置优化,如配置代理服务器、添加环境变量等。
// vite.config.js import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' export default defineConfig({ plugins: [vue()], server: { port: 3000, open: true, proxy: { '/api': { target: 'http://localhost:3001', changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, '') } } }, define: { 'process.env.NODE_ENV': '"production"' } })
Vite 的热更新功能可以在开发过程中实时更新代码,而无需手动刷新页面。这使得开发过程更加高效。
// vite.config.js import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' export default defineConfig({ plugins: [vue()], server: { port: 3000, open: true, hmr: true } })
假设我们要开发一个简单的待办事项应用,包含以下功能:
我们将使用 Vue 3 和 Vite 来构建这个应用。此外,我们还将使用 CSS 来进行样式设计。
npm create vite@latest todo-app -- --template vue cd todo-app npm install npm run dev
我们将应用分为三个主要组件:App.vue
、TodoList.vue
和 TodoItem.vue
。
<!-- App.vue --> <template> <div id="app"> <TodoList /> </div> </template> <script> import TodoList from './components/TodoList.vue' export default { components: { TodoList } } </script> <!-- TodoList.vue --> <template> <div class="todo-list"> <TodoItem v-for="todo in todos" :key="todo.id" :todo="todo" @remove="removeTodo" /> <form @submit.prevent="addTodo"> <input type="text" v-model="newTodo" placeholder="Add a new todo" /> <button type="submit">Add</button> </form> </div> </template> <script> import TodoItem from './TodoItem.vue' export default { components: { TodoItem }, data() { return { todos: [], newTodo: '' } }, methods: { addTodo() { if (this.newTodo.trim()) { this.todos.push({ id: Date.now(), text: this.newTodo, completed: false }) this.newTodo = '' } }, removeTodo(todo) { this.todos = this.todos.filter(t => t.id !== todo.id) } } } </script> <!-- TodoItem.vue --> <template> <div class="todo-item" :class="{ completed: todo.completed }"> <input type="checkbox" v-model="todo.completed" /> <span>{{ todo.text }}</span> <button @click="removeTodo(todo)">Remove</button> </div> </template> <script> export default { props: { todo: { type: Object, required: true } }, methods: { removeTodo(todo) { this.$emit('remove', todo) } } } </script>
npm run dev
打开浏览器,访问 http://localhost:3000
,你可以看到待办事项列表,并且可以添加和删除待办事项。
安装 TypeScript 并配置 tsconfig.json
:
npm install typescript -D
{ "compilerOptions": { "target": "ESNext", "module": "ESNext", "moduleResolution": "node", "strict": true, "jsx": "preserve", "sourceMap": true, "baseUrl": "src", "paths": { "@/*": ["*"] } }, "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.vue", "src/**/*.js"], "exclude": ["node_modules"] }
安装 ESLint 并配置 .eslintrc.json
:
npm install eslint --save-dev
{ "env": { "browser": true, "es2021": true }, "extends": "eslint:recommended", "parserOptions": { "ecmaVersion": 12 }, "rules": { "no-console": "off", "no-unused-vars": "warn", "no-empty": "error", "no-use-before-define": "error" } }
错误:Module not found
TypeError: Cannot read property 'data' of undefined
data
函数返回的对象是正确的。问:Vue3 和 Vue2 有什么区别?
Vue 3 的新特性,如 Composition API,通常需要 Vite 的支持才能发挥最佳性能。然而,某些旧的 Vue 2 插件可能不兼容 Vue 3,需要进行适配。
通过本教程的学习,你已经掌握了如何使用 Vue 3 和 Vite 进行前端开发。Vue 3 和 Vite 的结合使用,可以大大提高开发效率和用户体验。
未来你可以进一步学习 Vue 3 的高级特性,如 Composition API,以及 Vite 的更多配置选项。此外,还可以学习其他前端技术,如 React、Angular 等。
通过不断学习和实践,你将能够更加熟练地使用 Vue 3 和 Vite 开发复杂的前端应用。