创建vue3项目及基本常用配置

1、创建vue3项目

1.1 创建vue3项目

确保电脑中安装了nodejs,新建文件夹,输入以下命令:

npm create vue@latest


看是否为自己需要的vue版本,选择Y

各配置具体如下,根据自己的需求选择是或者否

npm create vue@latest
Need to install the following packages:
  create-vue@3.10.2
Ok to proceed? (y) y
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: 'create-vue@3.10.2',
npm WARN EBADENGINE   required: { node: '>=v16.20.0' },
npm WARN EBADENGINE   current: { node: 'v16.17.0', npm: '8.15.0' }
npm WARN EBADENGINE }

Vue.js - The Progressive JavaScript Framework

√ 请输入项目名称: ... practice-vue3
√ 是否使用 TypeScript 语法? ... 否 / 是
√ 是否启用 JSX 支持? ... 否 / 是
√ 是否引入 Vue Router 进行单页面应用开发? ... 否 / 是
√ 是否引入 Pinia 用于状态管理? ... 否 / 是
√ 是否引入 Vitest 用于单元测试? ... 否 / 是
√ 是否要引入一款端到端(End to End)测试工具? » 不需要
√ 是否引入 ESLint 用于代码质量检测? ... 否 / 是
√ 是否引入 Prettier 用于代码格式化? ... 否 / 是
√ 是否引入 Vue DevTools 7 扩展用于调试? (试验阶段) ... 否 / 是

将应用发布到生产环境时,运行以下命令:

npm run build

此命令会生成一个dist文件夹,用于生产环境

2、应用配置

在main.js中定义一个应用级的错误处理器,用来捕获所有子组件上的错误:

import vueErrorHandler from '@/utils/errorHandler'
app.config.errorHandler = vueErrorHandler

3、引入Element-UI

先安装element,然后在main.js中引入

npm i element-plus --save

在main.js中引入(全局注册)并使用

import ElementPlus from 'element-plus';
import 'element-plus/lib/theme-chalk/index.css';

const app = createApp(App);
app.use(ElementPlus);
app.mount('#app');

注意:element plus 的图标需要单独安装引入:

//安装
npm install @element-plus/icons-vue

//全局引入
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
 
const app = createApp(App)
 
// 注册所有图标为全局组件
Object.keys(ElementPlusIconsVue).forEach((iconName) => {
  app.component(iconName, ElementPlusIconsVue[iconName])
})

4、安装scss

npm install -D sass

 在vue组件中使用:

<style lang="scss">
.example {
  color: blue;
  font-size: 20px;
  margin: 20px;
  padding: 10px;
  border: 1px solid #ccc;
  .img{
      width: 20px;
  }
}
</style>

 全局SCSS样式,可以在vite.config.js文件中配置:

// vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
 
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  css: {
    preprocessorOptions: {
      scss: {
        additionalData: `@import "@/styles/variables.scss";`
      }
    }
  }
})

 vue3中scss样式穿透:

.elinput{
    :deep(.el-input__inner) {
         height: 38px;
    }
}

5、安装加密工具

 需要先安装jsencrypt,主要用于账号密码登录对密码加密

//安装命令
npm install jsencrypt

 在utils中新建js文件jsencrypt,内容如下

import { JSEncrypt } from 'jsencrypt'
export default function jsencrypt(data) {
  const encryptor = new JSEncrypt()
  const publicKey =
  `-----BEGIN PUBLIC KEY-----
  MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCs+s4mRTS8FQQo3z5ImgEDZ0xD
  OjqWGOJJAwwBK+P/BKbvoOiBBvnE2yGD5FN398zh7xS1QNQDGXpUS/qTpA6WLYDJ
  r3/rMINRQGr5P5OnypYnJbJwzVgHQDf3sMH5me9LsO+Z1ZuEQT8mvA98vCQ6+z9a
  Ac1e4RxMG+A2+266qQIDAQAB
  -----END PUBLIC KEY-----
  `

  // 设置公钥
  encryptor.setPublicKey(publicKey)// publicKey为公钥
 
  return encryptor.encrypt(data)// data就是需要加密的密码
}

 在需要使用的组件中引入jsencrypt,js

//引入
import jsencrypt from "@/utils/jsencrypt.js";

//使用
password: jsencrypt(this.signInFormData.password)

6、封装axios

6.1 安装并封装request

需要先安装axios

npm install axios

在utils下创建文件request.js

配置内容如下:

import { getToken } from '@/utils/auth';
import axios from 'axios';
import { Message } from 'element-ui';

if (import.meta.env.MODE === 'production') {
  const origin = window.location.origin
  const { serveIp, serveUrl, userCenterIp } = window.config
  window.config.serveIp = `${origin}${serveIp}`
  window.config.serveUrl = `${origin}${serveUrl}`
  window.config.userCenterIp = `${origin}${userCenterIp}`
  // window.config.redirectUrl = origin
}
// create an axios instance
const service = axios.create({
  baseURL: window.config.serveUrl,
  timeout: 600000 // request timeout
})
// 存储的HTTP请求
const pending = []
const cancelToekn = axios.CancelToken
let removeP = false
const removePending = (config, isAll) => {
  for (let i = 0; i < pending.length; i++) {
    if (isAll) {
      pending[i].fun()
      pending.splice(i, 1)
      i--
    } else {
      if (pending[i].name === config.url + JSON.stringify(config.data) + '&' + config.method) {
        pending[i].fun()
        pending.splice(i, 1)
        break
      }
    }
  }
}
// request interceptor
service.interceptors.request.use(
  config => {
    // 在HTTP请求前取消前面的所有请求
    removeP = config.removeP
    if (removeP) removePending(config, true)
    // 记录本次HTTP请求
    // eslint-disable-next-line new-cap
    config.cancelToken = new cancelToekn((c) => {
      pending.push({
        name: config.url + JSON.stringify(config.data) + '&' + config.method,
        fun: c
      })
    })
    // do something before request is sent
    if (getToken()) {

    }
    return config
  },
  error => {
    // do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  }
)
let errNum401 = 0
let errNum403 = 0
// let errNum404 = 0
// response interceptor
service.interceptors.response.use(

  response => {
    const data = response.data
    const codeList = [200, 201]
    if (!codeList.includes(data.code)) {
      switch (data.code) {
        case 401:
          
          break
        case 402:
          // 找不到资源
          break
        case 403:

          if (errNum403) {
            break
          }
          errNum403++
          // Message.error(data.msg)
          break
        case 404:

          break
        case 407:
          // 没有权限
          break
        case 502:
          // 连接服务器失败
          break
      }
    }
    return data
  },
  error => {
    console.log(error, 'error')
    if (error.response) {
      console.log('err' + error.response) // for debug
      switch (error.response.status) {
        case 401:

          break
        case 400:
          error.message = '请求错误'
          break
        case 403:
          error.message = '拒绝访问'
          break
        case 404:
          error.message = `请求地址出错: ${error.response.config.url}`
          break
        case 408:
          error.message = '请求超时'
          break
        case 422:
          Message.error('参数错误')
          break
        case 500:
          error.message = '服务器内部错误'
          break
        case 501:
          error.message = '服务未实现'
          break
        case 502:
          // 连接服务器失败

          Message.error('服务器内部错误')
          error.message = '网关错误'
          break
        case 503:
          error.message = '服务不可用'
          break
        case 504:
          error.message = '网关超时'
          break
        case 505:
          error.message = 'HTTP版本不受支持'
          break
        default:
          error.message = '连接服务器异常'
      }
      return error
    } else {
      if (removeP) {
        return
      }
      error.message = '连接服务器失败'
      Message.error('连接服务器失败')
      console.log(error.message)
    }
    return Promise.reject(error.message) // 返回接口返回的错误信息
  }
)

export default service

6.2 使用封装的request

在src根目录下新建api的文件夹,对接口进行分类(例如user.js、login.js等)

以user.js为例:

// 先引入封装的request
import request from '@/utils/request'

// 用户信息
export function userInfo(data) {
  return request({
    url: '/api/userinfo',
    method: 'post',
    data,
  })
}

在需要使用该接口的组件中引入方法,可以直接使用:

<script>  
import { userInfo } from "@/api/user";

methods: { 
        getuserInfo() {
            let params = {
                id: this.userId,
            };
            const res = await userInfo(params)
            console.log(res,code,data,'res');
        },
}

</script>

以上就是新建vue3项目的流程以及基本配置

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

内部类(来自类和对象的补充)

❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&a…

SON序列化解决方案

JSON&#xff08;JavaScript Object Notation&#xff09;是一种用于数据交换的轻量级数据格式。在我们日常Python编程中&#xff0c;通常可以使用内置的json模块来进行JSON序列化和反序列化。那么关于使用json模块进行JSON序列化和反序列化的问题解决方案&#xff0c;可以参考…

了解以太坊虚拟机(EVM)

了解以太坊虚拟机&#xff08;EVM&#xff09; 以太坊虚拟机&#xff08;Ethereum Virtual Machine&#xff0c;简称EVM&#xff09;是以太坊网络的核心组件之一&#xff0c;它承担着智能合约执行的重要任务 特点 智能合约执行环境&#xff1a;EVM提供了一个安全的环境&#xf…

mysql 运算符 语句 字符集 校队集

mysql 运算符 使用select语句可以输出运算的结果 mysql标识符不区分大小写 算数运算符 1./除法 得到的结果是一个小数 %是整数,省略小数 2、除以0不会报错,得到的结果是 null 3.数宇和字符串做加法运算,并不会拼接 比较运算符 1.mysql里面的=是比较运算符,而不是赋值运算…

电工技术学习笔记——直流电路及其分析方法

一、直流电路 电路的组成 1. 电压和电流的参考方向 电压&#xff08;Voltage&#xff09;&#xff1a;电压是电场力对电荷产生的作用&#xff0c;表示为电荷单位正电荷所具有的能量。在电路中&#xff0c;电压通常被定义为两点之间的电势差&#xff0c;具有方向性&#xff0c;…

(免费分享)基于springboot,vue房屋租赁管理系统

功能说明&#xff1a; * 普通用户角色&#xff1a; 1. 寻找房源功能--提供了两种寻找房源的功能&#xff0c;一种是普通用户在平台上搜索、筛选主动寻找房源的功能&#xff0c;另一种是用户填写征集房源的条件&#xff0c;系统会持续将最新符合条件的房源推送给用户。 2. …

【HBase】

什么是HBase HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据。 访问层次&#xff08;数据…

mac电脑安装redis教程

1、下载地址 Download | RedisRedisYou can download the last Redis source files here. For additional options, see the Redis downloads section below.Stable (7.2)Redis 7.2 …https://redis.io/download/#redis-downloads 2、安装 2.1 解压下载后的压缩文件 2.2 进入…

Redis数据库:持久化策略与性能管理

目录 前言 一、Redis持久化 1、Redis持久化功能 2、Redis持久化的两种方式 3、RDB持久化 3.1 触发条件 3.2 执行流程 3.3 启动时加载 4、AOF持久化 4.1 开启AOF 4.2 执行流程 4.2.1 执行流程详解 4.2.2 执行流程图 4.3 启动时加载 5、RDB与AOF持久化的优缺点 5…

【STM32】ST-LINK 下载时遇到的问题

如果出现“ST-Link USB communication error”ST-Link USB通信错误&#xff0c;则需要启动STM32 ST-LINK Utility&#xff0c;点击【ST-LINK】->【Firmaware】更新固件&#xff0c;然后打开Kei&#xff0c;点击魔术棒->->Debug->Settings&#xff0c;开到出现类似“…

2023年CSP-J第一轮题目讲解

大家好&#xff0c;我是极风。由于当年的初赛考的很差&#xff08;没考过70分&#xff09;&#xff0c;所以现在打算拿出来再细看一下。 一、 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 1. 在…

2024.04.04 健身打卡第 45 天

别让别人告诉你&#xff0c;你成不了才&#xff0c;如果你有梦想的话就要去捍卫它&#xff0c;那些一事无成的人&#xff0c;想告诉你你也成不了大器&#xff0c;如果你有理想的话&#xff0c;就要去努力实现。 2024.04.04 健身打卡第 45 天

电商系列之促销

> 插&#xff1a;AI时代&#xff0c;程序员或多或少要了解些人工智能&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家…

[实验报告]--基于端口安全

[实验报告] 目录 [实验报告] 一、项目背景 二、实验环境 三、项目规划设计 四、项目实施 五、验证项目成果 基于端口安全的 Jan16 公司网络组建 一、项目背景 Jan16 公司开发部为重要部门&#xff0c;所有员工使用指定的计算机工作&#xff0c;为防止员工或访客使 用个…

蓝桥杯真题:七段码

import java.util.Scanner; import java.util.ArrayList; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args){// 连接关系图int[][] map new int[][]{{0, 1, 0, 0, 0, 1, 0},{1, 0, 1, 0, 0, 0, 1},{0, 1, 0, 1, 0, 0…

如何保护IP地址不被泄露?

当互联网成为每个家庭的重要组成部分后&#xff0c;IP地址就成了你的虚拟地址。您的请求从该地址开始&#xff0c;然后 Internet 将消息发送回该地址。那么&#xff0c;您担心您的地址被泄露吗&#xff1f; 对于安全意识高或者某些业务需求的用户&#xff0c;如果您正在寻找保护…

数据结构——图的概念,图的存储结构,图的遍历(dfs,bfs)

目录 1.图的定义和术语 2.案例引入 1.六度空间理论 3.图的类型定义 4.图的存储结构 1.邻接矩阵 1.无向图的邻接矩阵表示法 2.有向图的邻接矩阵表示法 3.网&#xff08;有权图&#xff09;的邻接矩阵表示法 代码示例&#xff1a; 2.采用邻接矩阵表示法创建无向图…

SSM学习——Spring JDBC

Spring JDBC 概念 Spring的JDBC模块负责数据库资源管理和错误处理&#xff0c;简化了开发人员对数据库的操作。 Spring JDBC通过配置数据源和JDBC模板来配置。 针对数据库操作&#xff0c;Spring框架提供了JdbcTemplate类&#xff0c;它是Spring框架数据抽象层的基础&#…

基因组de novo组装

分以下几个部分&#xff1a; CLR组装 HIFI组装 ONT组装 二、三代数据矫正 组装结果评估 一、CLR组装 下机数据&#xff1a; 主要用那个bam文件 软件&#xff1a;wtdbg2 第一步&#xff1a;bam转fasta文件 参考&#xff1a;https://www.jianshu.com/p/03c7eb11102d # 进行基…

kali 渗透工具 - mestaploit

永恒之蓝漏洞的小知识&#xff1a; 黑客通过改造 永恒之蓝 制作 wannacry 制作病毒入侵高校内网。 mestaploit 攻击永恒之蓝流程&#xff1a; 使用模块 msfconsole配置required 模块参数运行&#xff0c;开始监听主机 msfconsole 主要模块 - 选择使用模块 search ms17_01…