vue3项目搭建

使用vue-cli快速搭建项目

winpty vue.cmd create hello-world

选择

vue3
typescript
babel
CSS Pre-processors (sass)
router
vuex
linter (eslint+prettier)

创建.prettierrc文件

{
  "useTabs": false, // 使用tab
  "tabWidth": 2, // 缩进大小
  "printWidth": 80, // 一行的字符数,如果超过会进行换行,默认为80
  "singleQuote": false, // 使用单引号
  "trailingComma": "es5", // 是否使用尾逗号,有三个可选值"<none|es5|all>"
  "semi": true  // 行位是否使用分号,默认为true
}

创建.prettierignore文件

/dist/*
.local
.output.js
/node_modules/**

**/*.svg
**/*.sh

/public/*

安装依赖

npm install prettier -D

package.json 增加命令 进行统一格式化

"prettier": "prettier --write ."

vscode 保存时自动fix(设置setting.json)

ctrl+shift+p ==> setting.json

{
  "editor.formatOnSave": true,
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  },
  "eslint.run": "onSave",
  "files.autoSaveDelay": 3000,
}

提交代码前对代码进行eslint检测并且修复

执行 npx husky-init
修改.husky文件夹下面的pre-commit npm test改成npm run lint

npm install husky -D
npx husky install
package.json中添加命令 "prepare": "husky install"
修改.husky文件夹下面的pre-commit npm test改成npm run lint

规范提交信息(使用这个依赖可以生成更好的提交信息)

npm install commitizen -D
npx commitizen init cz-conventional-changelog --save-dev --save-exact

微信图片_20220526165653.png

提交时敲命令 npx cz 然后根据提示走完commit流程

强制要求 规范提交

npm i @commitlint/config-conventional @commitlint/cli -D

  • 配置commitlint.config.js
module.exports = {
  extends: ["@commitlint/config-conventional"],
};
  • 使用husky生成commit-msg文件, 验证提交信息

npx husky add .husky/commit-msg "npx --no-install commitlint --edit $1"

下载element-plus

npm install element-plus --save

  • 设置自动导入

npm install -D unplugin-vue-components unplugin-auto-import

  • 修改 vue.config.js
const { defineConfig } = require("@vue/cli-service");

const AutoImport = require("unplugin-auto-import/webpack");
const Components = require("unplugin-vue-components/webpack");
const { ElementPlusResolver } = require("unplugin-vue-components/resolvers");

module.exports = defineConfig({
  transpileDependencies: true,
  configureWebpack: {
    plugins: [
      AutoImport({
        resolvers: [ElementPlusResolver()],
      }),
      Components({
        resolvers: [ElementPlusResolver()],
      }),
    ],
  },
});

封装axios

文件结构

微信图片_20220529144727.png
  • service/index.ts
import myRequest from "./request";

export const myHttp = new myRequest({
  baseURL: process.env.VUE_APP_BASE_URL,
  timeout: 1000,
  // interceptors: {
  //   requestInterceptors(config) {
  //     console.log("拦截成功回调", config);
  //     return config;
  //   },
  //   responseInterceptors(res) {
  //     return res.data;
  //   },
  // },
});
  • service/request/index.ts
import axios from "axios";
import type { AxiosInstance } from "axios";
import type { myRequestInterceptors, myAxiosRequestConfig } from "./type";

import { ElLoading } from "element-plus";
import "element-plus/theme-chalk/el-loading.css";

const DEFAULE_LOADING = false; // 默认不展示全局loading

class myRequest {
  instance: AxiosInstance;
  interceptors?: myRequestInterceptors;
  myLoading?: { close: () => void };
  isShowLoading: boolean;
  constructor(config: myAxiosRequestConfig) {
    this.instance = axios.create(config);
    // 创建实例时传入
    this.interceptors = config.interceptors;

    this.isShowLoading = config.isShowLoading ?? DEFAULE_LOADING;
    // 单个实例拦截
    // this.instance.interceptors.request.use(
    //   this.interceptors?.requestInterceptors,
    //   this.interceptors?.requestErrorInterceptors
    // );
    // this.instance.interceptors.response.use(
    //   this.interceptors?.responseInterceptors,
    //   this.interceptors?.responseErrorInterceptors
    // );

    // 全部实例拦截
    this.instance.interceptors.request.use((config) => {
      if (this.isShowLoading) {
        this.myLoading = ElLoading.service({
          lock: true,
          text: "Loading",
          background: "rgba(0, 0, 0, 0.5)",
        });
      }
      return config;
    });

    this.instance.interceptors.response.use((res) => {
      this.myLoading?.close();
      return res.data;
    });
  }

  request<T>(config: myAxiosRequestConfig<T>): Promise<T> {
    return new Promise((resolve, reject) => {
      // 获取传入的loading
      if (config.isShowLoading) {
        this.isShowLoading = config.isShowLoading;
      }
      // 在这里可以做 单个请求的拦截 判断是否有interceptors
      // if (config.interceptors?.requestInterceptors) {
      //   config = config.interceptors.requestInterceptors(config);
      // }
      this.instance
        .request<any, T>(config)
        .then((res) => {
          // 这里可以做单个请求的 响应拦截
          // if (config.interceptors?.responseInterceptors) {
          //   res = config.interceptors.responseInterceptors(res);
          // }
          this.isShowLoading = DEFAULE_LOADING;

          resolve(res);
        })
        .catch((err) => {
          this.isShowLoading = DEFAULE_LOADING;
          reject(err);
          return err;
        });
    });
  }
}

export default myRequest;

  • service/request/type.ts
import type { AxiosRequestConfig, AxiosResponse } from "axios";

export interface myRequestInterceptors<T = AxiosResponse> {
  requestInterceptors?: (config: AxiosRequestConfig) => AxiosRequestConfig;
  requestErrorInterceptors?: (error: any) => any;
  responseInterceptors?: (response: T) => T;
  responseErrorInterceptors?: (error: any) => any;
}

export interface myAxiosRequestConfig<T = AxiosResponse>
  extends AxiosRequestConfig {
  interceptors?: myRequestInterceptors<T>;
  isShowLoading?: boolean;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容