vite.config.ts配置别名、环境变量、svg图标配置

1、配置别名

1.1、在 vite.config.ts 内部添加 path、resolve等代码

import { defineConfig } from 'vite'

import vue from '@vitejs/plugin-vue'

import path from 'path'

// https://vitejs.dev/config/

export default defineConfig({

  plugins: [vue()],

  resolve: {

    alias: {

      "@": path.resolve("./src")  // 相对路径别名配置,使用 @ 代替 src

    }

  }

})

1.2、TypeScript编译配置 tsconfig.json,在内部添加 baseUrl 与 paths

{

  "compilerOptions": {

    "baseUrl": "./",  // 解析非相对模块的基地址,默认是当前目录

    "paths": {  // 路径映射,相对与 baseUrl

      "@/*": [

        "src/*"

      ]

    }

  },

}

2、项目环境变量的配置

2.1、在项目根目录创建 开发、生成和测试环境的文件

.env.development

.env.production

.env.test

2.2、在任意文件内部编写如下例子

# 变量必须以 VITE_ 为前缀才能暴露为外婆读取

NODE_ENV = "test"

VITE_APP_TITLE = "CRM"

VITE_APP_BASE_API = '/test-api'

VITE_SERVE = "http://zzzz.com"

2.3、配置运行命令:package.json

通过 import.meta.env获取环境变量

"scripts": {

    "dev": "vite --open",

    "build:test": "vue-tsc -b && vite build --mode test",

    "build:pro": "vue-tsc -b && vite build --mode production",

    "preview": "vite preview",

  },

3、svg图标配置

3.1、安装SVG依赖插件

pnpm install vite-plugin-svg-icons -D

3.2、在 vite.config.ts 中配置插件

import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'

import path from 'path'

// https://vitejs.dev/config/

export default defineConfig({

  plugins: [

    createSvgIconsPlugin({

      // Specify the icon folder to be cached

      iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],

      // Specify symbolId format

      symbolId: 'icon-[dir]-[name]',

    })

  ],

})

3.3、入口文件导入 main.ts

import 'virtual:svg-icons-register'

3.4、使用。将所有svg文件放入到  src/assets/icons/  下面。

svg:图标外层容易节点,内部需要与 use 标签结合使用。

xlink:href 执行用哪一个图标,属性值务必 #icon-图标名称

use 标签 fill 属性可以设置图标的颜色

<svg style="width: 30px;height: 30px;">

    <use xlink:href="#icon-green" fill="red"></use>

</svg>

3.5、注册全局组件

3.5.1、在 src/components下面创建一个 index.ts 写入如下例子代码

// 引入项目中全部的全局鞍

import SvgIcon from "@/components/SvgIcon/index.vue"

import Example from "@/components/Example/HelloWorld.vue"

// 全局对象

const allGloblComponent = { SvgIcon, Example }

// 对外暴露插件对象

export default {

    // 必须叫 install方法

    install(app: any) {

        // 注册项目全部的全局组件

        Object.keys(allGloblComponent).forEach(key => {

            // 注册为全局组件

            app.component(key, (allGloblComponent as any)[key]);

        })

    }

}

3.5.2、在 main.ts 引入并使用

import { createApp } from 'vue'

import App from '@/App.vue'

// 引入全局组件

import gloalComponent from "@/components"

app.use(gloalComponent)

app.mount('#app')

4、继承 sass

项目中可以使用 scss样式,因为配置 styleLint 工具的时候,项目中安装过 sass sass-loader 因此组件内不可以使用 scss语法 !!!需要加上 lang="scss"

<style scoped lang="scss">

4.1、在 src/styles 目录下创建 index.scss 文件,如果项目中需要用到 清除默认样式,就需要在index.scss 内引入 reset.scss。

从 npm官网搜索reset.scss,找到code直接赋值。并在 src/styles/reset.scss 粘贴

@import './reset.scss'

4.2、在 入口文件引入 main.ts

import '@/styles/index.scss'

4.3、如果想要使用 $变量,需要在 src/styles/ 下创建 variable.scss 。且在 vite.config.ts 配置。

注意:'@import "./src/styles/variable.scss";' 后面的 ; 不要忘记,不然会报错

export default defineConfig({

  css: {

    preprocessorOptions: {

      scss: {

        javascriptEnabled: true,

        additionalData: '@import "./src/styles/variable.scss";'

      }

    }

  }

})

5、mock数据

5.1、安装依赖:https://www.npmjs.com/package/vite-plugin-mock

pnpm install -D vite-plugin-mock mockjs

5.2、在 vite.config.js 配置文件启动插件

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

export default defineConfig(({ command }) => {
  return {
    plugins: [
      vue(),
      viteMockServe({
        mockPath: 'mock', // mock文件夹路径
        enable: command === 'serve' // 只有开发环境才开启mock
      }),
    ],
  }
})

5.3、在 根目录 下创建 mock 目录,后续的mock接口都创建在mock目录下

function createUserList() {

    return [

        {

            userId: 1,

            avatar: "https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg",

            userName: "admin",

            password: "111111",

            desc: "平台管理员",

            roles: ['平台管理员'],

            buttons: ["cuser.detail"],

            routes: ["home"],

            token: "Admin Token"

        }

    ]

}


 

export default [

    {

        url: '/api/user/login',

        method: 'post',

        response: ({ body }) => {

            const { userName, password } = body;

            const checkUser = createUserList().find(item => item.userName == userName && item.password == password)

            if (!checkUser) {

                return { code: 201, data: { message: "账号或密码不正确" } }

            }

            const { token } = checkUser

            return { code: 200, data: { token } }

        }

    },

]

5.4、axios测试mockjs

// 测试 mockjs 使用 axios

import axios from 'axios'

axios({

  url: '/api/user/login',

  method: "post",

  data: {

    userName: "admin",

    password: "111111"

  }

})

6、封装 axios

6.1、安装 axios 依赖

pnpm install axios

6.2、在src文件夹下新建utils/request.ts

// utils/request.ts

import axios from "axios";

//创建一个axios实例
const request = axios.create({
    baseURL: '',
    timeout: 20000,
});


// 添加请求拦截器
request.interceptors.request.use(
    function (config) {
        // 请求地址携带时间戳
        const _t = new Date().getTime()
        config.url += `?${_t}`
        
        // 请求头携带token
        config.headers['token'] = localStorage.getItem('token') || ''

        // 在发送请求之前做些什么
        // console.log('我要准备请求啦------')
        // console.log(config, '请求配置')
        
        return config;
    },
    function (error) {
        // 对请求错误做些什么
        return Promise.reject(error);
    }
);

// 添加响应拦截器
request.interceptors.response.use(
    function (response) {
        // 对响应数据做点什么
        // console.log('我接收到响应数据啦------')
        // console.log(response, '响应配置')
        if (response.status === 200) {
            return Promise.resolve(response.data)
        } else {
            return Promise.reject(response)
        }
    },
    function (error) {
        // 对响应错误做点什么
        if (error && error.response) {
            switch (error.response.status) {
                case 400:
                    error.message = '错误请求';
                    break;
                case 401:
                    error.message = '未授权,请重新登录';
                    break;
                case 403:
                    error.message = '拒绝访问';
                    break;
                case 404:
                    error.message = '请求错误,未找到该资源';
                    break;
                case 405:
                    error.message = '请求方法未允许';
                    break;
                case 408:
                    error.message = '请求超时';
                    break;
                case 500:
                    error.message = '服务器端出错';
                    break;
                case 501:
                    error.message = '网络未实现';
                    break;
                case 502:
                    error.message = '网络错误';
                    break;
                case 503:
                    error.message = '服务不可用';
                    break;
                case 504:
                    error.message = '网络超时';
                    break;
                case 505:
                    error.message = 'http版本不支持该请求';
                    break;
                default:
                    error.message = `未知错误${error.response.status}`;
            }
        } else {
            error.message = "连接到服务器失败";
        }
        return Promise.reject(error);
    }
);


/*
 *  get请求:从服务器端获取数据
 *  url:请求地址
 *  params:参数
 * */
export function get(url:string, params = {}) {
    return new Promise((resolve, reject) => {
        request({
            url: url,
            method: 'get',
            params: params
        }).then(response => {
            resolve(response);
        }).catch(error => {
            reject(error);
        });
    });
}

/*
 *  post请求:向服务器端提交数据
 *  url:请求地址
 *  params:参数
 * */
export function post(url:string, params = {}) {
    return new Promise((resolve, reject) => {
        request({
            url: url,
            method: 'post',
            data: params
        }).then(response => {
            resolve(response);
        }).catch(error => {
            reject(error);
        });
    });
}

// 对外暴露请求方法
export default {
    get,
    post
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值