08、vite+vue3+ts初始化项目遇到的坑

1、确保node版本

node版本:v16+
vite官网也给出了建议:

Vite 需要 Node.js 版本 14.18+,16+。然而,有些模板需要依赖更高的 Node 版本才能正常运行,当你的包管理器发出警告时,请注意升级你的 Node 版本。

2、使用命令行创建vite项目

我一般是使用yarn,然后根据命令给出的提示一步一步选择自己要的配置就行了

npm create vite@latest
//or
yarn create vite

这样一个项目就初始化完成了,下面我们来对项目进行一些基础配置

3、配置less或者scss

在这里我选择的是less,首先安装less

//安装less
yarn add less

安装之后,可以直接使用less文件和在style里面使用less.

4、自定义ant-design-vue主题

yarn add ant-design-vue

在main.ts里面引入

//main.ts
import { createApp } from 'vue'
import Antd from 'ant-design-vue';
import './assets/styles/global.less'
import './assets/styles/theme-file.less' //这里是自定义主题的less文件
import App from './App.vue'

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

//theme-file.less
@import 'ant-design-vue/dist/antd.less';
@primary-color: #5365e1;

注意:这样使用项目会报错导致无法运行,需要vite.config.ts里面加一个配置

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

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  css: {
    preprocessorOptions: {
      less: {
        javascriptEnabled: true //开启 JavaScript 就可以了
      }
    }
  },
})

这样主题色就可以修改了,效果如下:


image.png

5、引入App.vue文件会报错

需要在src/vite-env.d.ts里面加入下面的代码:

declare module '*.vue' {
  import type { DefineComponent } from 'vue'
  // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types
  const component: DefineComponent<{}, {}, any>
  export default component
}

image.png

6、直接引入ts文件报错

image.png

vite.config.ts里面加入下面的代码

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

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  css: {
    preprocessorOptions: {
      less: {
        javascriptEnabled: true
      }
    }
  },
  resolve: {
    //添加别名
    alias: {
        '@': resolve(__dirname, './src') 
    },
    extensions: ['.mjs', '.js', '.mts', '.ts', '.jsx', '.tsx', '.json'] //加入这段代码
  }
})

7、v-loading自定义指令封装

//loading.ts
import { render, VNode, createVNode,createApp  } from 'vue'
import Loading from './index.vue'
const vnode= createVNode(Loading) as VNode

 const vLoading = {
  // 在绑定元素的父组件 及他自己的所有子节点都挂载完成后调用
  mounted: (el: HTMLElement, binding: any) => {
    el.style.position = 'relative'
    render(vnode, el)
  },
  // 在绑定元素的父组件 及他自己的所有子节点都更新后调用
  updated: (el: HTMLElement, binding: any) => {
    if (binding.value) {
      vnode.component?.exposed.show()
      // vnode?.component?.exposed.show()
    } else {
      vnode?.component?.exposed.hide()
    }
  },
  // 绑定元素的父组件卸载后调用
  unmounted: () => {
    vnode?.component?.exposed.hide()
  },
}

export default vLoading

//loading.vue
<template>
  <div v-if="isShow" class="loading-box">
    <div class="mask"></div>
    <div class="loading-content-box">
      <img :src="loadingImg" />
      <div class="tip">加载中...</div>
    </div>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'
import loadingImg from '@/assets/images/loading.png'
// defineProps({
//   tip: {
//     type: String,
//     default() {
//       return '加载中...'
//     }
//   },
//   maskBackground: {
//     type: String,
//     default() {
//       return 'rgba(0, 0, 0, 0.8)'
//     }
//   },
//   loadingColor: {
//     type: String,
//     default() {
//       return 'rgba(255, 255, 255, 1)'
//     }
//   },
//   textColor: {
//     type: String,
//     default() {
//       return 'rgba(255, 255, 255, 1)'
//     }
//   }
// })
const isShow = ref(false)
const show = () => {
  isShow.value = true
}
const hide = () => {
  isShow.value = false
}
defineExpose({
  show,
  hide,
  isShow
})
</script>
<style lang="less" scoped>
.loading-box {
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  width: 100%;
  height: 100%;
  overflow: hidden;
  z-index: 9999;
  .n-spin {
    color: #ccc;
  }
  .mask {
    width: 100%;
    height: 100%;
    background: rgba(255, 255, 255, 0.5);
  }
  .loading-content-box {
    position: absolute;
    left: 0;
    top: 0;
    right: 0;
    bottom: 0;
    width: 100%;
    height: 100%;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    img {
      width: 30px;
      animation: rotate 1.5s linear infinite;
    }
  }
  .tip {
    font-size: 14px;
    margin-top: 8px;
  }
}
@keyframes rotate {
  to {
    transform: rotate(360deg);
  }
}
</style>

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

推荐阅读更多精彩内容