Code前端首页关于Code前端联系我们

创建Vue3项目前,得准备哪些工具?

terry 3小时前 阅读数 6 #Vue
文章标签 Vue3;开发工具

想学Vue3却卡在项目创建?想从0到1搭建属于自己的Vue3项目,但对着命令行犯懵?工具选Vue CLI还是Vite?项目建好后目录咋看?代码规范、路由状态管理咋集成?别慌,这篇从基础到实战的指南,把Vue3项目创建的坑和技巧全拆明白,新手也能跟着一步步搞懂!

先解决“工欲善其事,必先利其器”的问题,创建Vue3项目前,得把基础工具备好,不然命令行一堆报错,心态直接崩。

为啥必须装Node.js?

Vue3项目依赖Node.js运行环境,不管用Vue CLI还是Vite,都得靠Node.js里的npm、yarn或pnpm来装依赖、跑脚本,建议装LTS长期支持版(比如现在的v20+),稳定性高,装完后打开终端,输入node -vnpm -v,能看到版本号就说明装对了。

包管理器选npm、yarn还是pnpm?

这仨都是Node.js的包管理器,但各有特点:

  • npm:Node.js自带,不用额外装,适合新手入门,但下载依赖时容易重复,体积大。
  • yarn:早年为了解决npm的痛点出现,锁版本更稳定(有yarn.lock),现在生态也成熟。
  • pnpm:近几年火起来的“超高效”管理器,用硬链接和符号链接减少重复下载,速度快、体积小,还能严格控制依赖版本。

新手可以先用npm试试,想追求效率就换pnpm(装完Node.js后,用npm install -g pnpm装)。

Vue CLI和Vite该怎么选?

这俩是创建Vue3项目的核心工具,但适用场景不同:

  • Vue CLI:基于Webpack,适合需要Webpack生态的项目(比如老项目迁移、需要复杂配置),优点是生态成熟,插件多;缺点是启动和热更新慢,尤其是大项目。
  • Vite:基于ES Module和Rollup,主打“快”!冷启动秒开,改代码热更新瞬间响应,配置还特简单,适合新项目,尤其是追求开发体验的前端同学。

如果是练手或做新项目,优先选Vite;如果团队里有Webpack老项目要升级Vue3,Vue CLI更稳。

用Vue CLI创建Vue3项目,步骤是怎样的?

如果选Vue CLI,跟着这几步走,别漏细节:

先装Vue CLI(没装过的话)

打开终端,输入npm install -g @vue/cli,装完后,输入vue --version,能看到版本号(得是4.x及以上,才支持Vue3)。

创建项目:选配置、选Vue版本

输入vue create my-vue3-appmy-vue3-app是项目名,自己改),接下来选配置:

  • Manually select features(手动选功能),回车。
  • 然后挑需要的功能:比如Babel(转ES6+语法)、TypeScript(可选,强类型爱好者选)、Router(路由)、Vuex(状态管理,不过现在更推荐Pinia)、CSS Pre-processors(比如Less/Sass),用空格选中,回车。
  • 选Vue版本:选x(别选2.x,不然白搞)。
  • 后面的选项(比如Babel和ESLint配置文件放哪、是否保存为预设),新手选默认项就行,回车到底。

启动项目,看效果

进入项目目录:cd my-vue3-app,然后跑npm run serve,终端会输出Local: http://localhost:8080/,打开浏览器访问,就能看到Vue3的默认页面啦!

重点:Vue3和Vue2的项目差异

打开src/main.js,Vue3是这么写的:

import { createApp } from 'vue'
import App from './App.vue'
createApp(App).mount('#app')

和Vue2的new Vue({...}).$mount('#app')不一样。createApp是Vue3的新API,全局配置(比如usemixin)都要挂在app实例上,更灵活也更隔离。

用Vite创建Vue3项目,优势和操作步骤是啥?

Vite现在是Vue3项目的“当红炸子鸡”,这部分得重点讲透优势和实操:

Vite到底好在哪?

  • 启动快到飞起:不用像Webpack那样先打包整个项目,直接启动开发服务器,冷启动秒开。
  • 热更新丝滑:改一行代码,页面瞬间更新,不用等半天(尤其是大组件,体验差距更明显)。
  • 配置超简单:配置文件vite.config.js比Webpack简洁太多,新手也能快速改代理、别名这些。

用Vite创建项目的步骤

现在Vite支持“一键初始化”,命令记好:

方式1:npm

npm create vite@latest my-vite-vue3 -- --template vue
my-vite-vue3是项目名,--template vue表示用Vue的基础模板)

方式2:yarn

yarn create vite my-vite-vue3 --template vue

方式3:pnpm

pnpm create vite my-vite-vue3 -- --template vue

选完工具和项目名后,终端会让你选框架(选Vue)和变体(比如选vue是JS版,vue-ts是TypeScript版),选好后,进入项目目录装依赖:cd my-vite-vue3 && npm install(或yarn/pnpm)。

然后启动开发服务器:npm run dev,终端会输出Local: http://localhost:5173/(Vite默认端口5173,和Vue CLI的8080不一样),打开浏览器,就能看到Vite+Vue3的初始页面~

Vite的配置文件咋玩?

打开vite.config.js,基础配置长这样:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
  plugins: [vue()],
  // 可以加别名、代理、CSS配置等
  resolve: {
    alias: {
      '@': '/src' // 配置@指向src目录,和Vue CLI的alias一样
    }
  },
  server: {
    proxy: {
      '/api': 'http://localhost:3000' // 代理后端API,解决跨域
    }
  }
})

想改端口、代理、别名,直接在这文件里加配置,比Webpack的vue.config.js简单太多!

Vue3项目创建后,目录里的文件都是干啥的?

项目建好后,一堆文件夹和文件,新手容易看晕,这里拆最关键的几个目录和文件:

src目录:项目核心代码区

  • main.js:项目入口文件!Vue3用createApp(App).mount('#app')创建根实例,所有全局配置(比如use路由、状态管理)都在这加。
  • App.vue:根组件!整个项目的“大容器”,里面能嵌套其他组件,Vue3的App.vue可以用<script setup>语法糖,写代码更简洁。
  • components:放公共组件(比如按钮、弹窗),每个组件是.vue文件,包含<template>(结构)、<script>(逻辑)、<style>(样式)。
  • views(如果装了Router):放页面级组件,比如HomeView.vueAboutView.vue,和Router配置对应。
  • router(如果装了Router):index.js里用createRouter配路由规则,决定哪个路径显示哪个组件。
  • store(如果用Vuex或Pinia):状态管理中心,Vuex 4的index.jscreateStore,Pinia则是createPinia+defineStore,后面详细讲。

public目录:放“不动”的静态资源

比如favicon.ico(网页小图标)、robots.txt(搜索引擎配置),这里的文件不会被打包工具处理,直接拷贝到dist目录,如果要引图片,用/xxx.png(根路径)的方式。

package.json:项目“身份证”

记录项目依赖(dependencies是生产依赖,devDependencies是开发依赖)和脚本(scripts里的devbuild就是启动和打包命令),比如Vue CLI的npm run serve对应vue-cli-service serve,Vite的npm run dev对应vite

想让团队代码风格统一,怎么配置ESLint和Prettier?

团队协作时,代码风格乱成粥?ESLint管语法错误,Prettier管代码格式,配好这俩,代码自动“整整齐齐”。

装依赖(一次性装全)

打开终端,进入项目目录,装这些包:

npm install eslint prettier eslint-plugin-vue @vue/eslint-config-prettier @vue/eslint-config-airbnb -D

解释下:

  • eslint:JS代码检查工具。
  • prettier:代码格式化工具。
  • eslint-plugin-vue:Vue的ESLint插件,能检查.vue文件的语法。
  • @vue/eslint-config-prettier:让ESLint和Prettier不打架(比如Prettier负责格式化,ESLint负责语法,冲突的规则以Prettier为准)。
  • @vue/eslint-config-airbnb:Airbnb的代码规范(业界流行的严格规范,也可以选standard等)。

配ESLint规则:.eslintrc.js

在项目根目录新建.eslintrc.js,写:

module.exports = {
  extends: [
    'plugin:vue/vue3-recommended', // Vue3的推荐规则
    '@vue/airbnb', // Airbnb规范
    '@vue/prettier' // 让ESLint和Prettier协同
  ],
  rules: {
    // 自己定制规则,比如开发时允许console.log
    'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
    'vue/multi-word-component-names': 'off' // 关闭组件名必须多单词(新手写单单词组件时方便)
  }
}

配Prettier规则:.prettierrc.json

新建.prettierrc.json,配置格式偏好:

{
  "semi": true, // 句尾加分号
  "singleQuote": true, // 用单引号
  "trailingComma": "es6", // 对象/数组最后一个元素加逗号
  "printWidth": 100, // 一行最多100字符
  "tabWidth": 2, // 缩进2个空格
  "arrowParens": "always" // 箭头函数参数必加括号
}

VSCode里自动格式化

装两个插件:ESLintPrettier - Code formatter,然后打开VSCode设置,搜“format on save”,勾上“Editor: Format On Save”,这样每次保存文件,ESLint和Prettier会自动帮你修语法、调格式,再也不用手动对齐代码啦~

Vue3项目里怎么快速加路由和状态管理?

路由(Vue Router)管页面跳转,状态管理(Pinia或Vuex)管数据共享,Vue3推荐用Vue Router 4和Pinia,这部分讲实操:

集成Vue Router 4(路由)

步骤1:装依赖

npm install vue-router@4(一定是@4版本,对应Vue3)

步骤2:配路由规则(router/index.js

新建src/router/index.js,写:

import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue' // 导入页面组件
const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL), // history模式(URL好看,没有#)
  routes: [
    {
      path: '/',
      name: 'home',
      component: HomeView
    },
    {
      path: '/about',
      name: 'about',
      component: () => import('../views/AboutView.vue') // 懒加载,访问时再加载组件
    }
  ]
})
export default router

步骤3:在main.js里用路由

打开src/main.js,引入并use

import { createApp } from 'vue'
import App from './App.vue'
import router from './router' // 引入路由配置
createApp(App)
  .use(router) // 挂载路由
  .mount('#app')

步骤4:在App.vue里加路由出口

打开src/App.vue,在模板里加<router-view>(路由组件的显示位置)和<router-link>(跳转链接):

<template>
  <div id="app">
    <router-link to="/">首页</router-link> | 
    <router-link to="/about">lt;/router-link>
    <router-view></router-view> <!-- 路由组件显示在这 -->
  </div>
</template>

对比Vue Router 3:Vue3用createRoutercreateWebHistory,而Vue2是new VueRouter({ mode: 'history' }),配置更简洁了~

集成Pinia(状态管理,替代Vuex)

Vuex还能用,但Pinia更轻量、API更简单,Vue官方推荐。

步骤1:装依赖

npm install pinia

步骤2:创建Store(src/store/index.js

import { createPinia } from 'pinia'
const store = createPinia()
export default store

步骤3:在main.js里用Store

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store' // 引入Pinia
createApp(App)
  .use(router)
  .use(store) // 挂载Pinia
  .mount('#app')

步骤4:写第一个Store模块(比如counter.js

新建src/store/counter.js,用defineStore定义状态:

import { defineStore } from 'pinia'
// 第一个参数是Store的唯一ID
export const useCounterStore = defineStore('counter', {
  state: () => ({ 
    count: 0 
  }), // 状态(类似Vuex的state)
  actions: { 
    increment() { 
      this.count++ 
    } 
  } // 方法(类似Vuex的actions,Pinia没有mutations,直接改state)
})

步骤5:在组件里用Store

比如在HomeView.vue里:

<template>
  <div>
    <p>计数:{{ count }}</p>
    <button @click="increment">+1</button>
  </div>
</template>
<script setup>
import { useCounterStore } from '../store/counter'
import { storeToRefs } from 'pinia' // 把Store里的状态转成响应式ref
const counterStore = useCounterStore()
const { count } = storeToRefs(counterStore) // 解构count,保持响应式
const { increment } = counterStore // 解构方法
</script>

Pinia的优势:不用写mutations,直接在actions里改state;支持组合式API,写复杂逻辑更灵活;对TypeScript友好到飞起~

从0到1开发个简单功能,Vue3项目实战咋做?

光说不练假把式,做个“Todo列表”功能,涵盖组件、响应式、交互,新手能跟着复刻:

需求:Todo列表,能添加、删除、标记完成

步骤1:创建TodoList组件(src/components/TodoList.vue

<template>
  <div class="todo-container">
    <h2>我的待办清单</h2>
    <!-- 输入新任务,按回车或点按钮添加 -->
    <input 
      v-model="newTodo" 
      placeholder="输入新任务" 
      @keyup.enter="addTodo" 
    />
    <button @click="addTodo">添加</button>
    <!-- 渲染Todo列表 -->
    <ul>
      <li v-for="todo in todos" :key="todo.id">
        <!-- 标记完成 -->
        <input type="checkbox" v-model="todo.completed" />
        <!-- 任务文本,完成时加删除线 -->
        <span :class="{ completed: todo.completed }">{{ todo.text }}</span>
        <!-- 删除按钮 -->
        <button @click="

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门