vue3 + vite 项目笔记

1,076 阅读4分钟

创建项目遇到的问题

下载vite创建项目

# 使用 npm
npm create vite@latest
# 使用 yarn
yarn create vite
# 使用 pnpm
pnpm create vite

一. 在路由中添加引入文件

const router = createRouter({
    history: createWebHashHistory('./'),
    routes: [
        {
            path: '/login',
            name: 'login',
            component: () => import('@/pages/login/login.vue')
        }
    ]
});

需要配置@ 配置步骤

  1. 在vite.config.ts 中添加
"compilerOptions":{
    "baseUrl":"./",
    "paths":{
      "@/*": ["./src/*"],
    },
  },
  resolve: {
    alias: {
      '@': path.resolve(__dirname, "./src")
    }
  }
  1. 在 vite + typescript 中配置路径别名时需要注意, 直接使用__dirname的话, typescript 会报错cannot find name '__dirname', 这时候需要拉取依赖
npm install -D @types/node

在vscode 中import('@/pages/login/login.vue') 会报红线# Cannot find module ‘@/views/test/index.vue‘ or its corresponding type declarations.ts(2307)的原因

解决办法: 在src 目录下创建 vue-shims.d.ts 文件 内容为

declare module '*.vue' {
    import { Component } from 'vue';
    const component: Component;
    export default component;
  }

下载element-plus 并在项目中引入

import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
app.use(ElementPlus)

在项目中从 vue 引入 内容 报红线

Cannot find module ‘vue‘. Did you mean to set the ‘moduleResolution‘ option to ‘node‘, or to add ali

解决办法:

image.png

在项目中引用 ts 文件时 报红线 如Cannot find module '@/stores/user.ts' or its corresponding type declarations.ts

解决办法:

  1. 暂时没解决, 去掉 @ 后 使用 ../ 的方式 不出现红线
  2. 在tsconfig.json 文件中配置 @
"baseUrl": ".",
"paths": {
  "@/*": ["src/*"]
}

image.png

项目中使用 scss 全局变量

  1. 定义一个 scss 文件
  2. 添加解析全局变量插件
npm i @vitejs/plugin-vue
  1. 配置scss全局变量
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
export default () => {
    return defineConfig({
        plugins: [
          vue(),
        ],
        css: {
            preprocessorOptions: {
              scss: {
                additionalData: '@import "./src/var.scss";' // 加载全局样式,使用scss特性
              }
            },
        }
    })
}

提示 # An import path can only end with a ‘.ts‘ extension when ‘allowImportingTsExtensions‘ is enabled.

表示引入的 ts 文件扩展名可不写

vite 自定义环境变量

Vite内置了dotenv这个第三方库, dotenv会自动读取.env文件, 在根目录下创建 .env .env.development .env.production

默认情况下

  • npm run dev 会加载 .env 和 .env.development 内的配置
  • npm run build 会加载 .env 和 .env.production 内的配置
  • mode 可以通过命令行 --mode 选项来重写。

加载的环境变量也会通过 import.meta.env 以字符串形式暴露给客户端源码。为了防止意外地将一些环境变量泄漏到客户端,只有以 VITE_  为前缀的变量才会暴露给经过 vite 处理的代码。

我们在项目的根目录下,创建.env文件,写入测试内容;

HELLO = "小伙子,我是base数据" VITE_HELLO = "小伙子,我是base数据" 创建 .env.development 文件,写入测试内容;

HI = "小伙子,我是development数据" VITE_HI = "小伙子,我是development数据" 创建 .env.production 文件,写入测试内容;

MD = "小伙子,我是production数据" VITE_MD = "小伙子,我是production数据" 然后再main.js中打印一下

加载自定义的.env文件

假如,我们自定义一个test环境,想加载.env.test内的环境变量,要怎么做吗?

"scripts": {
    "test": "vite --mode test",
    "dev": "vite",
    "build": "vite build"
  },

根目录创建.env.test文件

env 文件有多个的时候 可以创建env 目录,将env 文件放入文件目录中,在 vite.config.js中配置

import { defineConfig } from "vite";
export default defineConfig( {
  envDir:"env"
});

更改环境变量的VITE_前缀

使用envPrefix配置来改变 以 envPrefix 开头的环境变量会通过 import.meta.env 暴露在你的客户端源码中。

  • 类型:  string | string[]
  • 默认:  VITE_

piain 使用以及持久化

  • 参考文档
  1. pinia.web3doc.top/
  2. www.npmjs.com/package/pin…

安装

yarn add pinia
# or
npm i pinia

在main.js中挂载pinia

import { createApp } from 'vue'
import App from './App.vue'

import { createPinia } from 'pinia'
const pinia = createPinia()

createApp(App).use(pinia).mount('#app')

新建文件store/counter.js

import { defineStore } from 'pinia'
// 创建store,命名规则: useXxxxStore
// 参数1:store的唯一表示
// 参数2:对象,可以提供state actions getters
const useCounterStore = defineStore('counter', {
  state: () => {
    return {
      count: 0,
    }
  },
  getters: {
   
  },
  actions: {
    
  },
})

export default useCounterStore

在组件中使用

<script setup>
import useCounterStore from './store/counter'

const counter = useCounterStore()
</script>

<template>
  <h1>根组件---{{ counter.count }}</h1>
</template>

<style></style>

如果直接从pinia中解构数据,会丢失响应式, 使用storeToRefs可以保证解构出来的数据也是响应式的

<script setup>
import { storeToRefs } from 'pinia'
import useCounterStore from './store/counter'

const counter = useCounterStore()
// 如果直接从pinia中解构数据,会丢失响应式
const { count, double } = counter

// 使用storeToRefs可以保证解构出来的数据也是响应式的
const { count, double } = storeToRefs(counter)
</script>

store模块化

import useUserStore from './user'
import useCounterStore from './counter'

// 统一导出useStore方法
export default function useStore() {
  return {
    user: useUserStore(),
    counter: useCounterStore(),
  }
}

pinia 数据持久化

yarn add pinia-plugin-persistedstate
or
npm i  pinia-plugin-persistedstate

使用插件 在main.ts中注册

import { createApp } from "vue";
import App from "./App.vue";
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'

const pinia = createPinia();
pinia.use(piniaPluginPersistedstate);
createApp(App).use(pinia);

模块开启持久化

const useHomeStore = defineStore("home",{
  // 开启数据持久化
  persist: true
  // ...省略
});

可以用配置式写法,按需缓存某些模块的数据。

import { defineStore } from 'pinia'

export const useStore = defineStore('main', s{
  state: () => {
    return {
      someState: 'hello pinia',
      nested: {
        data: 'nested pinia',
      },
    }
  },
  // 所有数据持久化
  // persist: true,
  // 持久化存储插件其他配置
  persist: {
    // 修改存储中使用的键名称,默认为当前 Store的 id
    key: 'storekey',
    // 修改为 sessionStorage,默认为 localStorage
    storage: window.sessionStorage,
    // 部分持久化状态的点符号路径数组,[]意味着没有状态被持久化(默认为undefined,持久化整个状态)
    paths: ['nested.data'],
  },
})