从零开始搭建vite4.0-vue3.0项目

news2024/10/3 2:27:00

目录

前言

项目地址

项目初始化

git初始化

别名配置

解决vscode报错

vue-router安装

pinia安装

环境配置

axios安装

element-plus按需引入

eslint与prettier安装

scss安装

stylelint配置

代码提交规范配置

husky与lint-stage配置


前言

        pnpm和npm的命令行完全一样,如果不想用pnpm的同学可以直接用npm,点击这里看看npm和pnpm有什么区别。

项目地址

        如果在安装过程中遇到了什么问题,可以直接到克隆下我的项目去排查原因,欢迎star。

项目初始化

pnpm create vite

然后按照提示操作即可!

image.png

cd my-project
pnpm install
pnpm run dev

此时项目已经运行成功了。

image.png

git初始化

git init
git add .
# .gitignore文件添加node_modules/ 
node_modules/ 

        git初始化是为了提高项目容错率,以免我们删除错文件的时候可以直接撤回。.gitignore已经内置在项目,不需要再添加。接下来每当我们进行一步操作,都可以进行一次记录,这里就不重复演示了。

别名配置

// vite.config.ts 
import { resolve } from 'path' 
resolve: { 
    alias: { 
        '@': resolve(__dirname, 'src') 
    } 
} 

解决vscode报错

 1. vite.config.ts 

image.png

pnpm install --save-dev @types/node 

    报错原因:typescript 无法识别 node 内置模块类型,所以安装一个node的类型

2. main.ts文件中 

image.png

  在src文件夹下新建一个文件shims-vue.d.ts。

// shims-vue.d.ts 
declare module '*.vue' { 
    import { ComponentOptions } from 'vue' 
    const componentOptions: ComponentOptions 
    export default componentOptions 
}

        报错原因:typescript 只能理解 .ts 文件,无法理解 .vue 文件,所以必须得给vue文件声明类型模块。

vue-router安装

pnpm install vue-router@4

        src下新建router/index.ts用于配置路由,新建views/home/index.vue文件和views/my/index.vue文件用于路由区分。

import { Router, createRouter, createWebHistory } from 'vue-router' 
const router: Router = createRouter({ 
    history: createWebHistory(), 
    routes: [ 
        { 
            path: '/', 
            redirect: '/home' 
        }, 
        { 
            name: 'Home', 
            path: '/home', 
            component: () => import('@/views/home/index.vue') 
        }, 
        { 
            name: 'My', 
            path: '/my', 
            component: () => import('@/views/my/index.vue') 
        } 
    ] 
}) 
router.beforeEach((to, from, next) => { 
    /* 路由守卫逻辑 */ 
    next() 
}) 
export default router
// main.ts 
import Router from './router/index.ts' 
createApp(App).use(Router).mount('#app') 

pinia安装

pnpm i pinia

  在src文件夹下新建store/index.ts,store/count.ts。

// main.ts 
import { createPinia } from "pinia"
createApp(App).use(router).use(createPinia()).mount('#app')

到这里,pinia已经引入成功了。下面是测试代码,看pinia是否可以正常运行。

// store/modules/count.ts 
import { defineStore } from "pinia" 
import { ref } from 'vue' 
export const useCounterStore = defineStore('counter', () => { 
    const count = ref<number>(0) 
    function increment() { 
        console.log('count.value: ', count.value); 
        count.value++ 
    } 
    return { 
        count, increment 
    } 
})
<template> 
    <div @click="increment">{{ count }}</div> 
</template> 
<script setup lang="ts" name="My"> 
    import { useCounterStore } from '@/store/modules/count.ts' 
    import { storeToRefs } from 'pinia' 
    const store = useCounterStore() 
    const { count } = storeToRefs(store) 
    const { increment } = store 
</script>

 npm run dev正常运行。

 npm run build报错。

image.png

        通过以下配置 tsconfig.json 和 vite.config.ts 解决了报错,原因尚未清楚(懂的大佬请在评论区指点一下吧)。

// ts.config.json 新增以下内容 
"compilerOptions" { 
    "baseUrl": "./", 
    "paths": { 
        "@": ["src/*"], 
        "store/*": ["src/store/*"] 
    }, 
}
// vite.config.ts 
resolve: { 
    alias: { 
        '@': resolve(resolve(__dirname, 'src')), 
        'store': resolve(resolve(__dirname, 'src/store')), 
    } 
}
<template> 
    <div @click="increment">{{ count }}</div> 
</template> 
<script setup lang="ts" name="My"> 
    import { storeToRefs } from 'pinia' 
    import { useCounterStore } from 'store/count.ts' 
    // 这里不使用@,直接用store 

    const store = useCounterStore() 
    const { count } = storeToRefs(store) 
    const { increment } = store 
</script> 

环境配置

在根目录创建.env,.env.development,.env.production

.env # 所有情况下都会加载 
.env.local # 所有情况下都会加载,但会被 git 忽略 
.env.[mode] # 只在指定模式下加载 
.env.[mode].local # 只在指定模式下加载,但会被 git 忽略

在.env文件中配置环境变量时,必须以VITE_ 为前缀的变量才会暴露给经过 vite 处理的代码。

// .env.development 
VITE_APP_BASE_URL="dev"
// .env.production 
VITE_APP_BASE_URL="production" 
// .env 
VITE_APP_BASE_URL="env" 

axios安装

pnpm i axios

  src下创建api/index.js

import axios from 'axios' 
const baseURL = import.meta.env.VITE_APP_BASE_URL
const service = axios.create({ baseURL, timeout: 30000 }) 
service.interceptors.request.use(config => { 
    const token = localStorage.getItem('token') 
    if (token && !config.headers.Authorization) { 
        config.headers.Authorization = 'Bearer ' + token 
    } 
    /* 接口发送请求拦截器逻辑 */ 
    return config 
}, error => { 
    return error 
}) 
service.interceptors.response.use(response => { 
    /* 接口响应请求拦截器逻辑 */ 
    return response.data 
}, error => { 
    return error 
}) 
export default service

element-plus按需引入

pnpm i element-plus 
pnpm i -D unplugin-vue-components unplugin-auto-import
// vite.config.ts 
import AutoImport from 'unplugin-auto-import/vite' 
import Components from 'unplugin-vue-components/vite' 
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' 

plugins: [ 
    vue(), 
    AutoImport({ 
        resolvers: [ElementPlusResolver()], 
    }), 
    Components({ 
        resolvers: [ElementPlusResolver()], 
    }) 
] 

它会默认生成auto-imports.d.ts和components.d.ts,总是会提交代码的时候冲突,可以直接在.gitignore忽略它。

eslint与prettier安装

pnpm i eslint \
@typescript-eslint/parser \
@typescript-eslint/eslint-plugin \
eslint-config-airbnb-base \
eslint-config-prettier \
eslint-plugin-import \
eslint-plugin-prettier \
eslint-plugin-vue \
prettier \
vite-plugin-eslint -D \

根目录下创建.eslintrc.cjs

module.exports = { 
    env: { 
        browser: true, 
        es2021: true, 
        node: true 
    }, 
    globals: { 
        defineEmits: true, 
        document: true, 
        localStorage: true, 
        GLOBAL_VAR: true, 
        window: true, 
        defineProps: true, 
        defineExpose: true, 
        withDefaults: true 
    }, 
    extends: [ 
        'airbnb-base', 
        'plugin:@typescript-eslint/recommended', 
        'plugin:vue/vue3-recommended', 
        'plugin:prettier/recommended' // 添加 prettier 插件 
    ], 
    parserOptions: { 
        ecmaVersion: 'latest', 
        parser: '@typescript-eslint/parser', 
        sourceType: 'module' 
    }, 
    plugins: ['vue', '@typescript-eslint', 'import'], 
    rules: { 
        indent: [ 2, 2, { SwitchCase: 1 } ], 
        quotes: [2, 'single'], 
        // 要求尽可能地使用单引号 
        'no-plusplus': 'off', 
        'import/no-extraneous-dependencies': [ 
            'error', 
            { devDependencies: true } 
        ], 
        'vue/multi-word-component-names': 'off', 
        'import/no-unresolved': 'off', 
        'import/extensions': 'off', 
        'no-console': 'off', 
        'consistent-return': 'off', 
        'no-param-reassign': 'off', 
        'new-cap': 'off', 
        'no-shadow': 'off', 
        'no-underscore-dangle': 'off', 
        'vue/no-v-html': 'off', 
        'no-restricted-syntax': 'off', 
        'guard-for-in': 'off', 
        'import/prefer-default-export': 'off', 
        // 'no-redeclare': 'off', 
        'no-unused-expressions': 'off', 
        '@typescript-eslint/ban-types': 'warn' 
    } 
}

自定义一些 规则 ,使其更加符合规范的同时也更加符合我们的开发习惯。

根目录下创建.prettierrc

{ 
    "semi": false, 
    "endOfLine": "auto", 
    "singleQuote": true, 
    "trailingComma": "none", 
    "bracketSpacing": true, 
    "jsxBracketSameLine": false, 
    "vueIndentScriptAndStyle": false, 
    "jsxBracketSameLine:": true, 
    "htmlWhitespaceSensitivity": "ignore", 
    "wrapAttributes": true, 
    "overrides": [ 
        { 
            "files": "*.html", 
            "options": { "parser": "html" } 
        } 
    ] 
}

根目录下新建添加.eslintignore,让eslint忽略校验这些文件或者文件夹。

dist/ 
node_modules/ 
/public/ 
/src/assets/ 
components.d.ts

        在package.json的scripts中添加一些命令行,这样运行命令行也可以对这些代码进行校验或者自动化调整了。

{ 
    "lint": "eslint --ext .js,.vue", 
    "lint:fix": "eslint --fix --ext .js,.vue --ignore-path .eslintignore .", 
    "prettier": "prettier --check .", 
    "prettier:fix": "prettier --write .", 
}

这样eslint和prettier的配置就就大功告成了。

scss安装

依赖安装

pnpm i sass -D

vite4貌似已经支持直接导入scss。如果报错了可以尝试在vite.config.js里面添加配置。

{ 
    css: { 
        preprocessorOptions: { 
            scss: { 
                additionalData: '@import "src/style/index.scss";' 
            } 
        } 
    } 
}

stylelint配置

pnpm create stylelint

在根目录创建 .stylelintignore,用于忽略 stylelint 校验。

dist/ 
node_modules/ 
/src/assets *.js

同样,在package.json的scripts中添加两条自定义命令行,使其进行校验或者自动格式化。

{ 
    "stylelint:fix": "stylelint --fix src/**/*.{vue,scss,css,sass}", 
    "stylelint": "stylelint src/**/*.{vue,scss,css,sass}" 
}

代码提交规范配置

pnpm i commitizen git-cz -D

在根目录创建changelog.config.json

不允许配置js文件,因为当前项目已经配置了type:module。

{ 
    "disableEmoji": false, 
    "format": "{type}{scope}: {emoji}{subject}", 
    "list": [ 
        "test", 
        "feat", 
        "fix", 
        "chore", 
        "docs", 
        "refactor", 
        "style", 
        "ci", 
        "perf", 
        "global" 
    ], 
    "maxMessageLength": 64, 
    "minMessageLength": 3, 
    "questions": [ "type", "scope", "subject" ], 
    "scopes": [], 
    "types": { 
        "chore": { 
            "description": "Build process or auxiliary tool changes", 
            "emoji": "🤖", 
            "value": "chore" 
        }, 
        "ci": { 
            "description": "CI related changes", 
            "emoji": "🎡", 
            "value": "ci" 
        }, 
        "docs": { 
            "description": "Documentation only changes", 
            "emoji": "✏️", 
            "value": "docs" 
        }, 
        "feat": { 
            "description": "A new feature", 
            "emoji": "🎸", 
            "value": "feat" 
        }, 
        "fix": { 
            "description": "A bug fix", 
            "emoji": "🐛", 
            "value": "fix" 
        }, 
        "perf": { 
            "description": "A code change that improves performance", 
            "emoji": "⚡️", 
            "value": "perf" 
        }, 
        "refactor": { 
            "description": "A code change that neither fixes a bug or adds a feature", 
            "emoji": "💡", 
            "value": "refactor" 
        }, 
        "release": { 
            "description": "Create a release commit", 
            "emoji": "🏹", 
            "value": "release" 
        }, 
        "style": { 
            "description": "Markup, 
            white-space, 
            formatting, 
            missing semi-colons...", 
            "emoji": "💄", 
            "value": "style" 
        }, 
        "test": { 
            "description": "Adding missing tests", 
            "emoji": "💍", 
            "value": "test" 
        }, 
        "global": { 
            "description": "change global configuration", 
            "emoji": "🌏", 
            "value": "global" 
        }, 
        "messages": { 
            "type": "Select·the·type·of·change·that·you're·committing:", 
            "customScope": "Select the scope this component affects:", 
            "subject": "Write a short, imperative mood description of the change:\n", 
            "body": "Provide a longer description of the change:\n ", 
            "breaking": "List any breaking changes:\n", 
            "footer": "Issues this commit closes, e.g #123:", 
            "confirmCommit": "The packages that this commit has affected\n" 
        } 
    } 
}

package.json中新加一些配置和自定义命令

{ 
    "scripts": { 
        ... 
        "cm": "git cz" 
    }, 
    "config": { 
        "commitizen": { 
            "path": "git-cz" 
        } 
    } 
}

代码提交的时候,运行以下命令,然后根据命令提示即可。

git add . 
npm run cm

husky与lint-stage配置

代码风格自动化,会在用户提交代码的时候将修改的文件自动格式化一次。

pnpm install husky lint-staged -D
npm run prepare

在.husky文件夹下创建 pre-commit 文件

#!/usr/bin/env sh 
. "$(dirname -- "$0")/_/husky.sh"

npx lint-staged

在package.json添加一些husky和lint-staged的配置

{ 
    "scripts": { 
        "prepare": "husky install", 
    }, 
    "lint-staged": { 
        "src/**/*.{js,jsx,ts,tsx}": "npm run lint:fix", 
        "src/**/*.{vue,scss,css,sass}": "npm run stylelint:fix" 
    } 
}

        大功告成,现在要提交代码,就会先经过elint和stylelint的格式校验。如果像是格式化的问题会直接帮你修复,但一些需要删除代码的就需要自己手动去删除了。

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

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

相关文章

Ae 效果:CC Radial Blur、CC Radial Fast Blur

模糊和锐化/CC Radial Blur Blur & Sharpen/CC Radial Blur CC Radial Blur&#xff08;CC 径向模糊&#xff09;可以创建径向缩放以及径向旋转等模糊效果。 ◆ ◆ ◆ 效果属性说明 Type 类型 径向模糊的类型包括两大类&#xff1a;前三个属于径向缩放模糊&#xff0c;后…

Kubernetes----基于kubeadm工具在CentOS7.9虚拟机上部署一主两从类型的Kubernetes集群环境

【原文链接】Kubernetes----基于kubeadm工具在CentOS7.9虚拟机上部署一主两从类型的Kubernetes集群环境 文章目录 一、虚拟机环境准备1.1 准备三台CentOS操作系统的虚拟机1.2 修改主机名1.3 确认CentOS的版本符合要求1.4 配置地址解析1.5 配置时间同步1.6 关闭防火墙1.7 禁用se…

【用unity实现100个游戏之9】使用Unity制作类八方旅人、饥荒风格的俯视角2.5D游戏

前言 2.5D游戏 是一种介于二维和三维之间的游戏形式。它通常在二维平面上展示游戏内容&#xff0c;但利用三维技术来实现更加逼真的图像效果。 在2.5D游戏中&#xff0c;角色和环境通常是以平面的形式呈现&#xff0c;但可以在垂直方向上移动。这意味着玩家可以在一个相对较薄…

Vert.x 源码解析(4.x)——ClusteredEventBus入门使用和源码解析

目录 1. 简介 如果哪里有错误&#xff0c;欢迎指正。 如果哪里有不明白的地方&#xff0c;欢迎讨论 Vert.x集群器 Vert.x 集群管理器的可插拔性&#xff0c;可轻易切换至其它的集群管理器。 Vert.x 集群管理器包含以下几项功能&#xff1a; 发现并管理集群中的节点管理集…

node.js下载安装使用

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

WangEditor在Vue前端的应用

1、在Vue项目中安装WangEditor 对于Vue2&#xff1a; npm install wangeditor/editor-for-vue --save 或者 yarn add wangeditor/editor-for-vue 对于Vue3&#xff1a; npm install wangeditor/editor-for-vuenext --save 或者 yarn add wangeditor/editor-for-vuenext 2、将Wa…

站在AI大模型十字路口:实地探访2023服贸会

服贸会恰是一面镜子。小到针对蓝领市场的刷脸招聘机器&#xff0c;大到向政企展示的生活服务数据监测平台&#xff0c;无一不在折射出&#xff0c;中国的数字化服务已渗透到个人生活与企业管理的方方面面。 作者|思杭 出品|产业家 处暑过后的北京&#xff0c;仍留着夏天些…

DevEco Studio开发工具无法预览的问题处理

预览如上图报错信息 解决办法&#xff1a; 1. 首先打开 "SDK管理" 下载后即可解决

Docker使用及本地Yolov5打包教程

1. Docker的安装 注意&#xff1a;官方也提供了直接Pull Yolov5的渠道&#xff1a; docker pull ultralytics/yolov5 详见&#xff1a;https://hub.docker.com/r/ultralytics/yolov5 --------------------------------------------------以下正文------------------------…

QT之形态学操作

形态学操作包含以下操作&#xff1a; 腐蚀 (Erosion)膨胀 (Dilation)开运算 (Opening)闭运算 (Closing)形态梯度 (Morphological Gradient)顶帽 (Top Hat)黑帽(Black Hat) 其中腐蚀和膨胀操作是最基本的操作&#xff0c;其他操作由这两个操作变换而来。 腐蚀 用一个结构元素…

ABAP 一般采购申请创建、服务类型采购申请创建BAPI_REQUISITION_CREATE

前言 此文的示例同时可创建一般采购申请或服务采购申请&#xff0c;当采购类型为Z007时&#xff0c;触发服务采购申请相关字段填写 正文 创建服务类型采购申请的时候参数间互相绑定很绕&#xff0c;看了这篇博客才理明白&#xff0c;有兴趣的可以阅读原文 https://wiki.scn.…

Stable Diffusion插件:StyleSelectorXL 之七十七种绘画风格任君选择

本文给大家分享一个应用于 SDXL 的新插件&#xff1a;StyleSelectorXL。通过在UI界面上简单的选择&#xff0c;我们就可以生成多种多样的风格图片&#xff0c;如动漫、水彩、平面、3D、线稿、涂鸦、剪纸、朋克、童话等等。 基本介绍 用过 SDXL 的同学&#xff0c;应该能切身感…

算法leetcode|79. 单词搜索(rust重拳出击)

文章目录 79. 单词搜索&#xff1a;样例 1&#xff1a;样例 2&#xff1a;样例 3&#xff1a;提示&#xff1a;进阶&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 79. 单词搜索&#xff1a; …

提高设计效率,你还需要掌握FeatureManager这些小窍门

FeatureManager 设计树使多种选择和过滤器操作变得更为方便&#xff0c;并在处理模型时提供对多个文件夹和有用工具的访问。 FeatureManager 设计树和图形区域为动态链接。可在任一窗格中选择特征、草图、工程视图和构造几何线。 您可以分割 FeatureManager 设计树&#xff0c;…

力扣每日一题---2594. 修车的最少时间

文章目录 思路解题方法复杂度Code 思路 请注意&#xff0c;能力值越低&#xff0c;修车越快&#xff0c;应该翻译成「排名」&#xff0c;排名越靠前&#xff0c;修车越快。&#xff09;根据题意可以知道r * n * n < t 的&#xff0c;所以可以利用数学知识进行改变公式&#…

灰度变换与空间滤波

灰度变换与空间滤波 背景知识 空间域指包含图像像素的平面&#xff0c;灰度变换与空间滤波均在空间域进行&#xff0c;即直接在图像像素上操作&#xff0c;表示为 g ( x , y ) T [ f ( x , y ) ] g(x,y)T[f(x,y)] g(x,y)T[f(x,y)] &#xff0c;其中 T T T 是在点 ( x , y…

【SWT】 使 ScrolledComposite 中内容动态变化后依然可以滚动

引言&#xff1a; 在用户界面设计中&#xff0c;有时需要在有限的空间内显示大量内容。如果内容超过可视区域的大小&#xff0c;滚动功能可以帮助用户滚动并查看所有内容。本文将介绍如何使用 Eclipse SWT 库中的 ScrolledComposite 控件来实现在滚动区域中显示可滚动的标签。 …

Discuz论坛帖子标题随机高亮颜色,拒绝千篇一律!

DZ论坛帖子标题默认是没有高亮、加粗效果的&#xff0c;如果是要实现某篇帖子标题高亮、加粗&#xff0c;站长或是版主可以点开这篇帖子&#xff0c;在发帖的下方可以看到精华、高亮、图章、置顶等操作&#xff0c;然后点击高亮&#xff0c;可以选择高亮颜色&#xff0c;是否加…

直播预告 | 博睿学院 Bonree ONE接入zabbix数据源提高可观测运维能力

Zabbix是业界覆盖面非常普遍的监控工具。本课程将介绍目前公有云的基础监控体系的构建思路&#xff0c;讲述One产品对接Zabbix数据的必要性与可观测性赋能效果。 课程中会分享数据接入的过程&#xff0c;重点讲解zabbix工作机制&#xff0c;深入分析zabbix数据库表结构&#x…

TCP IP网络编程(四) 基于TCP的服务器端、客户端

文章目录 理解TCP、UDPTCP/IP协议栈链路层IP层TCP/UDP层应用层 实现基于TCP的服务器端、客户端TCP服务器端的默认函数调用顺序进入等待连接请求状态受理客户端连接请求TCP客户端的默认函数调用顺序基于TCP的服务器端、客户端函数调用关系 实现迭代服务器端、客户端实现迭代服务…