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

目录

前言

项目地址

项目初始化

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.mzph.cn/news/75992.shtml

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

相关文章

FastChat

Fast Chat是一个用于训练/部署和评估基于大型语言模型的聊天机器人的开发平台。其核心功能包括&#xff1a; 最先进模型的权重/训练代码和评估代码(例如Vicuna/FastChat-T5)基于分布式多模型的服务系统&#xff0c;具有Web界面和与OpenAI兼容的RESTful API。 安装 pip instal…

在Cisco设备上配置接口速度和双工

默认情况下&#xff0c;思科交换机将自动协商速度和双工设置。将设备&#xff08;交换机、路由器或工作站&#xff09;连接到 Cisco 交换机上的端口时&#xff0c;将发生协商过程&#xff0c;设备将就传输参数达成一致&#xff0c;当今的大多数网络适配器都支持此功能。 在本文…

八路DI八路DO,开关量远程IO模块,Modbus TCP数据采集模块 YL90-RJ45

特点&#xff1a; ● 八路开关量输入&#xff0c;八路开关量输出 ● DI状态变化自动发送状态数据&#xff0c;可以捕获脉冲 ● 采用Socket自由协议编程简单、轻松应用 ● 开关量毫秒级响应速度适应多种场合 ● 内置网页功能&#xff0c;可以通过网页查询与控制 ● 同时也…

星际争霸之小霸王之小蜜蜂(十二)--猫有九条命

系列文章目录 星际争霸之小霸王之小蜜蜂&#xff08;十一&#xff09;--杀杀杀 星际争霸之小霸王之小蜜蜂&#xff08;十&#xff09;--鼠道 星际争霸之小霸王之小蜜蜂&#xff08;九&#xff09;--狂鼠之灾 星际争霸之小霸王之小蜜蜂&#xff08;八&#xff09;--蓝皮鼠和大…

练习接口测试详细步骤

最近一段时间学了Python语言&#xff0c;重新学了 Java&#xff0c;js&#xff0c;html语言&#xff0c;CSS&#xff0c;linux&#xff0c;一堆测试工具&#xff1b;唉&#xff5e; 在接触接口测试过程中补了很多课&#xff0c; 终于有点领悟接口测试的根本&#xff1b; 偶是…

Beats:安装及配置 Metricbeat (二)- 8.x

这篇文章是继文章 “Beats&#xff1a;安装及配置 Metricbeat &#xff08;一&#xff09;- 8.x” 的续篇。你可以先阅读之前的那篇文章再继续阅读这篇文章。我们在这篇文章中继续之前的探讨。 使用 fingerprint 来代替证书 在实际的使用中&#xff0c;我们需要从 Elasticsear…

SB树,看这一篇就够了

算法拾遗三十九SB树及跳表 SB树SB树四种违规类型总结 SB树Code 跳表 SB树 SB树是基于搜索二叉树来的&#xff0c;也有左旋和右旋的操作&#xff0c;只是不同于AVL树&#xff0c;它也有它自己的一套平衡性方法。 任何以叔叔节点为头的子树的节点个数不小于自己任何一个侄子树的…

如何自己开发一个前端监控SDK

最近在负责团队前端监控系统搭建的任务。因为我们公司有统一的日志存储平台、日志清洗平台和基于 Grafana 搭建的可视化看板&#xff0c;就剩日志的采集和上报需要自己实现了&#xff0c;所以决定封装一个前端监控 SDK 来完成日志的采集和上报。 架构设计 因为想着以后有机会…

【软考】系统集成项目管理工程师(三)信息系统集成专业技术知识③

一、云计算 1、定义 通过互联网来提供大型计算能力和动态易扩展的虚拟化资源&#xff1b;云是网络、互联网的一种比喻说法。是一种大集中的服务模式。 2、特点 &#xff08;1&#xff09;超大规模&#xff08;2&#xff09;虚拟化&#xff08;3&#xff09;高可扩展性&…

UG\NX二次开发 计算一个向量的反向向量UF_VEC3_negate

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 简介: UG\NX二次开发 计算一个向量的反向向量UF_VEC3_negate 效果: 代码: #include "me.hpp"void ufusr(char* param, int* retcode, int paramLen) {UF…

什么是Docker和Docker-Compose?

Docker的构成 Docker仓库&#xff1a;https://hub.docker.com Docker自身组件 Docker Client&#xff1a;Docker的客户端 Docker Server&#xff1a;Docker daemon的主要组成部分&#xff0c;接受用户通过Docker Client发出的请求&#xff0c;并按照相应的路由规则实现路由分发…

服务器基准测试实践:SysBench的搭建与基本使用

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;AWS/阿里云资深使用…

VS编译.cu文件源文件无法打开matrix.h和mex.h问题

配置好cu和VS相关库文件后CUDA程序仍然报错&#xff1a;无法打开matrix.h和mex.h&#xff0c;解决办法&#xff1a; &#xff08;1&#xff09;这两个头文件是matlab中的&#xff0c;可能无法直接在VS中调用&#xff0c;可以通过添加外部依赖项的方法将matlab中的头文件的文件路…

【数据结构与算法系列4】长度最小的子数组 (C++ Python)

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度**。**如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&#xff1a; 输入&…

物理层-数据链路层-网络层-传输层-会话层-表示层-应用层

Go网络编程 网络协议 从应用的角度出发&#xff0c;协议可理解为“规则”&#xff0c;是数据传输和数据的解释的规则。假设&#xff0c;A、B双方欲传输文件。规定&#xff1a; 第一次&#xff0c;传输文件名&#xff0c;接收方接收到文件名&#xff0c;应答OK给传输方&…

JVM基础面试题

JDK、JRE、JVM的关系 JVM Java虚拟机&#xff0c;它只识别.class类型文件&#xff0c;它能将class文件中的字节码指令进行识别并调用操作系统向上的API完成动作。 JRE Java运行时环境。它主要包含两部分&#xff1a;Jvm的标准实现和Java的一些基本类库。相对于JVM来说,JRE多出来…

电阻和电容

目录 1、常见的电阻器 2、电容 ​编辑 1、常见的电阻器 对于电阻需要了解三个参数&#xff08;查询电阻的数据手册&#xff09;&#xff1a; 1、封装&#xff1a;就是电阻的尺寸或者大小&#xff0c;看焊在你的pcb板上是否合适。 2、标称&#xff1a;电阻的电阻大小、精度、…

Unity入门教程||创建项目(上)

一、介绍 目的&#xff1a;通过尝试制作一款使用玩家角色把小球弹飞的简单小游戏&#xff0c;熟悉使用Unity进行游戏开发的基本流程。 软件环境&#xff1a;Unity 2017.3.0f3&#xff0c;Visual Studio 2013 二、创建新项目 1&#xff0c;启动Unity后将出现一个并列显示Pro…

动静态库生成使用

&#x1f525;&#x1f525; 欢迎来到小林的博客&#xff01;&#xff01;       &#x1f6f0;️博客主页&#xff1a;✈️林 子       &#x1f6f0;️博客专栏&#xff1a;✈️ Linux       &#x1f6f0;️社区 :✈️ 进步学堂       &#x1f6f0…

Purple Pi OH(Debian/Ubuntu)使用python控制gpio

本文分享的是Purple Pi OH开源主板搭载Debian/Ubuntu系统如何使用python控制gpio。 Purple Pi OH作为一款兼容树莓派的开源主板&#xff0c;采用瑞芯微RK3566 (Cortex-A55) 四核64位超强CPU,主频最高达1.8 GHz,算力高达1Tops&#xff0c;支持INT8/INT16&#xff0c;支持Tensor…