一篇文章教小白学会搭建 vite + ts + vue3 项目,手把手教程,不会算我输

news2024/9/27 9:26:56

目录

一、基础环境和工具

1. 使用 pnpm 代替 npm

2. 使用 pinia 代替 vuex

3. 使用 windicss

4. 使用 vscode

5. 使用 sourcetree

6. 了解 vite + ts + vue

二、项目搭建

1. 流程图

2. 初始化项目

2.1 使用命令初始化项目

2.2 项目结构

3. 使用 git

3.1 创建本地的 git 仓库

3.2 新建远端 gitee 仓库

3.3 本地仓库绑定到 git 远端仓库

4. 增加 .nvmrc

5. 增加工程化插件

5.1 使用 scss 

5.2 使用 autoprefiexer

5.3 使用 windicss

5.4 使用 antd

5.5 使用 pinia

5.6 使用 vue-router 

5.7 设置路径别名

5.8 使用 polyfill 

5.9 使用 prettier + eslint

总结​


在开始之前,我们应该有一个共识,任何新技术,官方文档都优于任何博客,所以在学习之前,强烈建议你好好的阅读官方文档,在本篇文章的实践中,应该看的是 vite 官网。

一、基础环境和工具

1. 使用 pnpm 代替 npm

建议使用 pnpm 代替 npm,pnpm 速度更快,基本上可以满足所有小型项目的需求。

pnpm 的用法和 npm 一致,唯一的区别是 npm 是 node 自带的包管理工具,所以在安装好 node 之后就可以使用 npm。但是 pnpm 在首次使用之前需要用 npm 全局安装。(重点1: 要全局安装哦!)

npm i pnpm -g

安装成功后,打开命令行,在任意目录下,执行 pnpm -v 如果可以显示版本号,就没有问题了。注意是任意目录下,这就是全局安装的意义。

2. 使用 pinia 代替 vuex

Pinia 是Vue 的专属状态管理库,基本可以满足小型项目的需求,而且用法简单,所以可以尝试使用 pinia 代替 vuex。

3. 使用 windicss

使用 windicss 框架可以提升在项目中写 css 代码的效率。一开始用起来可能觉得很别扭,但是等你习惯了,会发现真的很好用。

4. 使用 vscode

vscode 很好用,有很多使用技巧可以注意一下,比如关于换行符、配置文件、eslint、.nvmrc、插件的使用、找回代码。

当然,还可以使用其他好用的编辑器,但是我没有用过,如果你有好用的编辑器也欢迎在评论区推荐给我。

5. 使用 sourcetree

使用 sourcetree 作为 git 的图像化管理工具,可以大大的提高我们的工作效率,请参考。

6. 了解 vite + ts + vue

需要掌握 vue3 的基本使用,你可以参考我的 vue 专栏中《跟着官网学习vue3》的系列文章,应该可以让你基本学会使用 vue3。

然后学习 typescript ,ts 很简单的,即便既没有接触过,只要找一个 ts 写的项目看一下,你就可以照葫芦画瓢了。

最后,使用 vite 作为打包工具,代替了 webpack,vite 更加简单,而且天生的支持很多类型比如 scss 文件,无需我们手动配置。当然如果你没有用过,那么没关系,学习这篇文章你就相当于学习了 vite 的基本使用方法。

二、项目搭建

1. 流程图

整个项目的搭建过程是很简单,而且清晰明了的,下面是完成后,我的 git 的提交记录,项目的搭建过程就是从下往上依次进行的。建议每次写完一个新功能都提交一下,尽量保证每个提交只有一个功能,类似我这种,看起来很清晰。

如果你不想看这篇磨磨叽叽的超级长的文档,那么我建议你直接克隆这个项目,然后跟着提交记录,一步一步的自己操作也很方便,本篇文章的仓库地址如下:

learn-vite: 搭建简单的vite+ts+vue框架

我是用了gitee 仓库,原因很简单,它不用翻墙!

2. 初始化项目

2.1 使用命令初始化项目

首先,让我们打开 vite 的官网,依照指示使用命令行,初始化一个 vite 作为打包工具的项目。

打开命令行,运行如下命令,使用 vue + ts 的模版,创建一个名称为  learn-vite 的项目

pnpm create vite learn-vite --template vue-ts

2.2 项目结构

新建的项目结构和普通的vue项目基本无差别 ,但是注意项目中自动创建了一个 .gitignore 文件,这样我们就不用手动添加了。

由于我们全局安装了 pnpm 所以我们使用 pnpm 创建的项目,在运行的时候要继续使用 pnpm,如 pnpm install 、pnpm run dev 等。

并且,在 install 之后创建了一版本文件是 pnpm-lock.yaml ,文件名称这点是有别于 npm 的package-lock.json, 但是文件的功能都是一致的。

关于package.json 和 package-lock.json【本例中是pnpm-lock.yaml】的关系和区别,请参考这篇文章。

3. 使用 git

我们使用 sourcetree 来管理本地的git 仓库。在上一步,我们已经有了一个项目文件夹,现在我们需要把它交给 git 管理。

3.1 创建本地的 git 仓库

 

3.2 新建远端 gitee 仓库

3.3 本地仓库绑定到 git 远端仓库

在命令行,执行如下命令

git remote add origin https://gitee.com/yangjihong2113/learn-vite.git git push -u origin "master"

其实如果记不住这些命令不要紧,因为我们在 giteee 随意新建仓库之后,下面有提示的

到此,我们的项目初始化+版本管理第一步已经完成,有一个 master 本地分支和远端分支,现在我们可以进行下一步了。

4. 增加 .nvmrc

在项目的根目录,新建 .nvmrc 文件,输入初始化时 node 的版本号,用来避免每次切换项目都手动切换 node 版本。

5. 增加工程化插件

项目已经初步成型,下面我们需要增加一些提高我们工作效率的插件。

5.1 使用 scss 

其实现在我们的项目已经完全可以运行起来了,但是项目中有一个 style.css 显然不是我们想要的,vite可以原生的支持 scss 文件,我们一般都是使用 scss 写样式。

增加 common.scss 文件,并在 main.ts 中引入

 但是此时我们 npm run dev 运行起来的项目提示错误

这是因为 sass 模块是使用 scss 文件必备的工具,所以我们需要安装 sass,注意:

  1. 要继续使用 pnpm 命令安装
  2. 增加 -D 参数,在开发环境中才使用 sass,因为生产环境,scss 文件会被编译成 css 文件,这个插件是用不到的
pnpm install sass -D

现在我们可以安心的使用 scss 了,别忘了把代码提交一下,我们在开发过程中最好尽量保证每个提交都是一个简单的功能。

5.2 使用 autoprefiexer

autoprefixer 是 postcss 的功能插件,给 web 项目自动增加 css 前缀,兼容各种浏览器。

(1)安装 autoprefixer 插件

pnpm install autoprefixer -D

(2)在配置文件 vite.config.ts 中配置

(3)源代码

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import autoprefixer from 'autoprefixer'

// https://vitejs.dev/config/
export default defineConfig({
  css: {
    postcss: {
      plugins: [
        autoprefixer({
          overrideBrowserslist: ['Chrome > 40', 'ff > 31', 'ie 11'],
        })
      ]
    }
  },
  plugins: [vue()],
})

(4)提交代码

5.3 使用 windicss

(1) 安装 vite-plugin-windicss 和 windicss

pnpm i vite-plugin-windicss windicss -D

(2)在 vite.config.js 中配置

(3)在 main.ts 中引入

(4)增加 windi.config.ts 配置文件

import { defineConfig } from 'vite-plugin-windicss'

export default defineConfig({
    attributify: true
})

(5)在 app.vue 中试用

<div class="text-pink-500">text windicss</div>

(6)提交代码

5.4 使用 antd

组件库,我们使用 ant-design-vue,在 vue2 中我们经常使用 element-ui,但是升级到 vue3,虽然可以使用 element-plus 依旧会有很多兼容性问题,所以我们不如换一个使用。当然也可以使用其他的好用比如 vant-ui 就是针对移动端的很好用的库。

还有我们不要自己写组件库,因为会很浪费时间而且也写不好,所以不要自己造轮子,现在的组件库基本可以满足我们的需求,拿过来改一下样式就行了。

(1)安装 ant-design-vue

注意这个安装的时候不需要加 -D,因为在生产环境也需要使用。

pnpm i ant-design-vue

(2)在 main.ts 中引入 antd 的样式

(3)在 app.vue 中试用一下

(4)提交代码

5.5 使用 pinia

(1)安装 pinia

pnpm i pinia

(2)在 main.ts 中引用

(3)在 src 路径下增加 store/index.ts

import { defineStore, acceptHMRUpdate } from "pinia";

export const useStore = defineStore({
  id: "index",
  state: () => ({
    name: "old name",
  }),
  getters: {
    myName: (state) => {
        return `getters ${state.name}`
    }
  },
  actions: {
    changeName(name: string) {
        this.name = name
    }
  },
});

if (import.meta.hot) {
    import.meta.hot.accept(acceptHMRUpdate(useStore, import.meta.hot))
}

(4)在 app.vue 试用一下

(5)提交代码

5.6 使用 vue-router 

(1)安装 vue-router

pnpm i vue-router

(2)在 src 路径下新建 pages 文件夹

新建 account.vue

<template>
    <div @click="toLogin">toLogin</div>
    <router-view></router-view>
</template>
<script lang="ts" setup>

import { useRoute, useRouter } from 'vue-router'

const router = useRouter()
function toLogin() {
    router.push({
        name: 'login'
    })
}
</script>

 新建 login.vue

<template>
    <div @click="toAccount">toAccount</div>
    <router-view></router-view>
</template>
<script lang="ts" setup>

import { useRoute, useRouter } from 'vue-router'

const router = useRouter()
function toAccount() {
    router.push({
        name: 'account'
    })
}
</script>

(3)在 src 路径下新建 router/index.ts 

import { createRouter, createWebHistory,  } from 'vue-router'

export const routes = [
    {
        path: '/',
        redirect: '/login',
    },
    {
        name: 'login',
        path: '/login',
        component: () => import("../pages/login.vue")
    },
    {
        name: 'account',
        path: '/account',
        component: () => import("../pages/account.vue")
    }

]

const router = createRouter({
    scrollBehavior: () => ({ left: 0, top: 0 }),
    history: createWebHistory(),
    routes,
})


router.beforeEach((to,from, next) => {
    next()
})


export default router

(4)在 main.ts 中引用

 

 

(5)在 app.vue 设置 routerview

删掉之前没啥用的代码

<script setup lang="ts">
</script>

<template>
    <RouterView/>
</template>

<style lang="scss"></style>

(6)结果

点击可以切换路由了

(7)提交代码

5.7 设置路径别名

(1)安装 @types/node

@types/node 模块在我们使用 node 方法(比如 path.resolve)时提供 ts 类型声明,否则编辑器会报错,虽然不影响代码运行,但是会有红线很影响心情。

pnpm i @types/node -D

(2)在 tsconfig.json 中设置 path

(3)在 vite.config.ts 中设置

(4)在 main.ts 中试试

(5)提交代码

5.8 使用 polyfill 

polyfill 是 web 项目兼容低版本浏览器的插件。

(1) 安装 core-js 和 @vitejs/plugin-legacy

pnpm i @vitejs/plugin-legacy -D 
pnpm i core-js

(2)在 src 路径下新建 polyfill/polyfill.ts

import 'core-js/stable'

 (3)在 main.ts 中引入 polyfill.ts

(4)在vite.config.ts中配置

(5)提交代码

5.9 使用 prettier + eslint

(1)安装相关插件

pnpm i @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint eslint-config-prettier eslint-plugin-prettier prettier eslint-plugin-vue -D

(2)在 packagejson 中去掉 "type": "module",

这句话,在项目初始化的时候默认有,但是在我们后续运行的时候会因为它报错,所以我们需要手动去掉。关于模块相关的知识,可以参考这篇文章。

(3)在 packagejson 中增加配置

(4)新增 .eslintrc.js

module.exports = {
    root: true,
    parser: 'vue-eslint-parser',
    parserOptions: {
        parser: '@typescript-eslint/parser',
    },
    extends: ['plugin:vue/vue3-recommended', 'plugin:prettier/recommended'],
    rules: {
        'vue/no-v-html': 0,
        'vue/v-on-event-hyphenation': 0,
        'vue/no-template-shadow': 0,
        'vue/multi-word-component-names': 0,
    },
}

 (5)新增 .eslintignore

/dist
/node_modules
tsconfig.json
*.svg
*.png
*.jpg
*.jpeg
*.scss
*.gif
*.webp
*.ttf
index.html
*.md

(6)新增 .prettierrc.js

module.exports = {
    singleQuote: true, // 使用单引号代替双引号
    printWidth: 200, // 超过最大值换行
    semi: false, // 结尾不用分号
    useTabs: true, // 缩进使用tab, 不使用空格
    tabWidth: 4, // tab 样式宽度
    bracketSpacing: true, // 对象数组, 文字间加空格 {a: 1} => { a: 1 }
    arrowParens: 'avoid', // 如果可以, 自动去除括号 (x) => x 变为 x => x
    proseWrap: 'preserve',
    htmlWhitespaceSensitivity: 'ignore',
    trailingComma: 'all',
}

(7)新增 .prettierignore

/dist
/node_modules
/deploy
*.yml
*.yaml
tsconfig.json
*.svg
*.png
*.jpg
*.jpeg
*.scss
*.gif
*.webp
*.ttf
index.html
*.md

(8)在vite-env.d.ts 中加入声明

在 vite + vue3 的项目中这几句类型声明很重要,否则编辑器会提示 ts 错误【TS 提示 ”无法找到 *.vue 声明文件“】参考这篇文章。

/// <reference types="vite/client" />

declare module '*.vue' {
    import type { DefineComponent } from 'vue'
    const component: DefineComponent<{}, {}, any>
    export default component
}

(9)重启编辑器,格式化文件

逐一格式化文件,可以使用命令,不用傻瓜式的一个文件一个文件手动格式化!请参考这篇文章。

pnpm eslint --fix ./src/**/*.vue

(10)提交代码

总结​

项目已经构建完成,包含所有的需要的基本的插件,现在你可以使用这个项目学习或者实现任何你想要的功能了。

最后说明一下,你可以按照我的仓库的提交记录,一步一步的构建你的项目,没必要跟着这篇文档,文档中的截图和代码可能有一些差错。

仓库地址是

learn-vite: 搭建简单的vite+ts+vue框架

有任何问题都可以在评论区评论!我们一起讨论解决。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/127125.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaSE成神之路】数组思考题讲解

哈喽&#xff0c;我是兔哥呀&#xff0c;今天就让我们继续这个JavaSE成神之路&#xff01; 这一节啊&#xff0c;咱们要学习的内容是数组的思考题讲解&#xff0c;也就是上一节我留下的两个小作业。 数组是非常重要的知识点&#xff0c;也是我们后续学习各种数据结构的基础&am…

【MMC子系统】 一、MMC/SD/SDIO介绍

个人主页&#xff1a;董哥聊技术我是董哥&#xff0c;嵌入式领域新星创作者创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01;文章目录1、前言2、MMC/SD/SDIO介绍3、总线接口4、参考文章1、前言 该节学习Linux Kernel的MMC子系统&#xff…

JVM学习笔记(3)—— 运行时数据区—— 程序计数器、虚拟机栈、本地方法栈

程序计数器、虚拟机栈、本地方法栈都是线程私有的&#xff0c;jvm中每个线程都有一份 一、程序计数器 JVM中的程序计数器是一个与PC寄存器功能类似的逻辑结构&#xff0c;用于记录当前线程要执行的下一条jvm指令的地址&#xff0c;解释器读取到对应的jvm指令后将其翻译成机器指…

解决ubuntu(Linux)桌面/应用不插电掉帧问题

解决ubuntu(Linux)桌面/应用不插电掉帧问题 笔记本安装的ubuntu的gnome桌面&#xff0c;插电状态下触摸板动画丝滑&#xff0c;翻看浏览器文章的时候也不会有延迟掉帧的情况&#xff0c;但是离开了充电器&#xff0c;电池供电就会掉帧。 思路&#xff1a;在插电模式下&#x…

Spring Boot三种跨域解决方案与Spring Security跨域解决方案

跨域解决方案1、什么是跨域2、Spring Boot跨域解决方案1、服务端代码2、前端页面3、运行服务3、Spring Security跨域解决方案1、什么是跨域 什么是跨域&#xff0c;首先可以参考我之前写的这篇文章&#xff1a;JavaWeb跨域问题及解决方案 &#xff0c;另外我下面会做补充。 很…

unreal中actor的property replicate简单小节

首先参考的网址是官网中的&#xff1a; https://docs.unrealengine.com/5.1/en-US/multiplayer-programming-quick-start-for-unreal-engine/ unreal引擎的版本是5.1 还原的过程相对比较简单&#xff0c;主要的精力花在了编译报错和调试的过程。 属性复制的流程如下&#xff…

尚医通-MongDB简介-安装-概念-操作(十六)

目录 &#xff08;1&#xff09;MongDB-简介和安装 &#xff08;2&#xff09;MongDB-概念和操作 &#xff08;1&#xff09;MongDB-简介和安装 1、NoSQL简介 MongDB为什么要用呢&#xff1f;之前我们用MySQL数据库&#xff0c;如果数据达到一定的量级&#xff0c;或者有高…

QT 之SQLite数据库

文章目录一、windows下使用命令行方法操作db文件1、 安装sqlite2、 使用sqlite二、QT操作sqlite1、 建立数据库2、 打开数据库3 、关闭数据库4、 创建数据表5 、插入数据6、 删除表数据7、 修改表数据8、 查询数据——遍历查询、条件查询一、windows下使用命令行方法操作db文件…

计算机网络期中考试部分题目

1. &#xff08;1&#xff09;以太网帧的数据部分是IP数据报&#xff0c;只要数出相应字段所在的字节即可。由图可知以太网帧头部有6&#xff0b;6214字节&#xff0c;IP数据报首部的目的P地址字段前有4x4 16字节&#xff0c;从帧的第1字节开始数141630字节&#xff0c;得目的P…

java怎么完成输出语句

我们在前面的文章和案例中&#xff0c;其实早就知道Java是如何实现输出功能的了。没错&#xff0c;就是利用System.out.println()语句来实现的&#xff01;接下来壹哥就给大家详细解读一下这个语句的作用及其含义。 1. System 我们先来看看System是个什么东东。 System是Jav…

不推荐别的了,IDEA 自带的数据库工具就很牛逼!

MySQL 等数据库客户端软件市面上非常多了&#xff0c;别的栈长就不介绍了&#xff0c; 其实 IntelliJ IDEA 自带的数据库工具就很牛逼&#xff0c;不信你继续往下看。 本文以 IntelliJ IDEA/ Mac 版本作为演示&#xff0c;其他版本的应该也差距不大&#xff01; 1、打开数据库…

JPE驱动器维修印刷机驱动器维修JV4-380-1410

印刷机水辘/墨辘/墨斗辊电机马达驱动器维修、墨控电机驱动器维修、JPE驱动器维修。 三菱印刷机电路板维修范围&#xff1a;东洋变频器维修&#xff0c;油墨电机维修&#xff0c;水辊变频器维修&#xff0c;电眼控制板维修&#xff0c;接口板维修&#xff0c;电源维修等。 小森…

【结构型】外观模式(Facade)

目录外观模式(Facade)适用场景外观模式实例代码&#xff08;Java&#xff09;外观模式(Facade) 为子系统中的一组接口提供一个一致的界面&#xff0c;外观模式 (Facade) 定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。 适用场景 要为一个复杂子系统提…

【C++】初级面试整理

C基础 四种类型转换 static_cast&#xff1a;用于良性转换&#xff0c;一般不会导致意外发生&#xff0c;风险很低。常用于基本类型转换到 void&#xff0c;转换父类指针到子类不安全&#xff1b; const_cast&#xff1a;一般用于去掉const属性以及volatile&#xff0c;但是…

如何进行深度数据恢复?分享详细的恢复方法

有时我们会发现保存已久的照片&#xff0c;因为某些误操作导致它们消失了。通过多种方法都没有办法找回&#xff0c;这时该怎么办&#xff1f;不妨尝试下深度数据恢复的方法。它可以帮助我们找到更深层次的数据&#xff01; 一、恢复数据前的一些问题 很多人都会遇到数据丢失的…

windows环境下安装RocketMQ

文章目录前言一、下载二、环境变量配置三、启动RocketMq1.启动nameserver2.启动broker四、RocketMq控制台安装1.下载2.修改配置文件3.打包4.启动前言 环境要求&#xff1a;JDK1.8Maven 3.2x;64为操作系统 一、下载 官网下载地址&#xff1a;https://rocketmq.apache.org/zh/…

xxljob 的路由策略如何理解,他的选择逻辑是什么(小白阅读)

目录 1 需求2 路由策略2.1 第一个 FIRST2.2 最后一个 LAST2.3 ROUND 轮询2.4 RANDOM :随机2.5 CONSISTENT_HASH:一致性HASH2.6 LEAST_FREQUENTLY_USED:最不经常使用2.7 LEAST_RECENTLY_USED :最近最久未使用2.8 FAILOVER :故障转移2.9 BUSYOVER :忙碌转移1 需求 xxljob …

Ansible变量定义和使用

剧本中使用变量 在playbook中,可以直接定义变量,如下所示: vars&#xff1a;变量名变量值&#xff0c;也可以写在下一级将改成冒号空格值的形式 debug&#xff1a;debug模块&#xff0c;msg消息 引用变量&#xff1a;使用两对{{ }} vim juben.yml - hosts: allvars:bianliang…

extern关键字以及加了头文件引用的作用

0.前言 xdm&#xff0c;今天是阳了的第一天&#xff0c;昨天是高烧&#xff0c;浑身酸痛&#xff0c;今天好多了。。。祝大家健康。 推荐一首歌《不是因为寂寞才想你》。看了《阿凡达2》&#xff0c;感觉没第一部好看哎。 1.extern 之前写过一篇博客extern关键字。今天讲一下和…

fpga实操训练(ip ram和ip fifo)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 所有的fpga ip当中&#xff0c;用的最多的ip一般有pll、rom、ram和fifo。前面&#xff0c;我们讨论过了rom&#xff0c;rom相比较ram和fifo而言&am…