一、搭建基础项目

vite详解

vue3API详解

1、vite创建项目

使用 vite 搭建项目

npm init @vitejs/app
or
yarn create @vitejs/app

根据步骤选择:

  1. 项目名称
  2. 框架(vue,react…)
  3. js或ts

3、运行项目

cd 项目目录
npm install
npm run dev

2、环境变量设置介绍

vite serve 时是development开发模式, vite build时是production生产模式。

分别创建配置文件: .env.development 、.env.production

注意: 命名规范 VITE_为前缀的变量才会暴露给经过vite处理的代码

.env.development

# .env.development
VITE_APP_TITLE = MY PROJECT

.env.production

# .env.production

NODE_ENV = development

#base api
VITE_APP_BASE_API = 'http://vitetest.com'

读取环境变量

读取环境变量使用import.meta.env.xxx,可在 main.js中测试

// base api
console.log(import.meta.env.VITE_APP_BASE_API); // title
console.log(import.meta.env.VITE_APP_TITLE);

vite配置多环境打包

  1. 安装cross-env

    • cross-env 通过js在平台设置不同的环境变量的工具
    npm install --save-dev cross-env
  2. 配置环境

    在项目打包的时候,我们通常需要根据环境变量来区分不同的环境,以请求不同的后台接口

    那么我们在项目的根目录下创建如下的环境配置文件,以production为例,在项目根目录下创建.env.production,并新增环境变量VITE_PROJECT_ENV = 'production',需要注意的是,环境变量必须以VITE开头
# .env.production
NODE_ENV = development
#base api
VITE_APP_BASE_API = 'http://vitetest.com'
#环境变量
VITE_PROJECT_ENV = 'production'
  1. 配置打包

    修改package.json (根据自己的实际情况增减)
"scripts": {
"serve": "cross-env vite --mode development",
"product": "cross-env vite --mode production", "build": "cross-env vite build --mode development",
"build:product": "cross-env vite build --mode production"
}

二、配置Router

1、安装路由

这里要注意我们安装的要是4以上的所有采用@next进行安装

npm i vue-router@next -S

2、配置路由

在 src 下新建 router 文件夹,并在文件夹内创建 index.ts

vue-router 参数

  1. 创建router实例:createRouter
  2. router的模式分为:

    - createWebHistory -- history模式

    - createWebHashHistory -- hash模式
  3. routes的约束类型是:RouteRecordRaw
import { createRouter, createWebHashHistory } from 'vue-router';
import Home from '../views/Home.vue';
const router = createRouter({
history: createWebHashHistory(),
routes: [
{
path: '/',
name: 'Home',
component: Home,
},
{
path: '/about',
name: 'About',
component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
}
]
}); export default router

扩展路由额外属性

在实际项目开发中,常常会遇到这么一个场景,某一个路由是不需要渲染到侧边栏导航上的,此时我们可以给该路由添加一个hidden属性来实现。

在ts的强类型约束下,添加额外属性就会报错,那么我们就需要扩展RouteRecordRaw类型。

// 联合类型

import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
type RouteConfig = RouteRecordRaw & {hidden?: boolean}; //hidden 是可选属性
import Home from '../views/Home.vue';
const routes: Array< RouteRecordRaw > = [
{
path: '/',
name: 'Home',
component: Home,
},
{
path: '/about',
name: 'About',
component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
}
]; const router = createRouter({
history: createWebHistory(),
routes
}); export default router;

3、引入

我们在main.ts文件中引入Vue-Router,如下所示。

import router from './router';
createApp(App).use(router).mount("#app");

最后和vue2一样在App.vue中写入挂在渲染的组件

<router-view/>

三、配置Vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具 devtools extension (opens new window),提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。

1、安装vuex

使用Vuex之前,需要先安装Vuex插件,如下所示。

npm install vuex@next --save

2、配置vuex

安装完成之后,需要先初始化Vuex。首先,创建一个store/index.ts文件,添加如下代码

import { createStore } from 'vuex'
export default createStore({
state: {
},
mutations: {
},
actions: {
},
modules: {
}
})

封装一下

不同模块执行不同的业务逻辑。

以用户模块为例

  1. 新建user.ts
import REQUEST_DATA from "@/api/requestHandler";
const state = {
userInfo:[]
};
const mutations = {
setStateItem(state:any, data:any) {
state[data.key] = data.value;
}
}; const actions = { async getUserData({ commit }:any, data?:any):Promise<any> {
try {
const res = await REQUEST_DATA('userInfoUri', data);
if (res.data.code == 200) {
commit("setStateItem", {
key: "reasonList",
value: res.data.data
});
data.cb && data.cb(res.data.data.satisfaction_status)
} else {
//给出错误提示toast
return false;
}
} catch (e) {
return false;
}
},
}; export default {
state,
actions,
mutations,
namespaced: true
};
  1. index.ts中调用
import { createStore } from 'vuex'
import user from './modules/user'
const store = createStore({
modules: {
user,
},
}) export default store

3、引入

我们在main.ts文件中引入Vuex,如下所示。

import { createApp } from 'vue'
import App from './App.vue'
import router from './router';
import store from './store' createApp(App).use(store).use(router).mount("#app");

4、页面调用

  1. import { useStore } from 'vuex';
  2. const store = useStore();
  • store中的方法:

    方法|介绍

    :--|:--

    store.state.xxx|访问 state

    store.getters.xxx |访问 getter

    store.xxx |访问 Store 的函数

    store.commit("xxx", payload?) |调用 (优化约束,以强化提示)

    store.commits.xxx(payload?) |调用 commit

    store.dispatch("xxx", payload?) |调用 (优化约束,以强化提示)

    store.dispatchs.xxx(payload?) |调用 dispatch

    store.subscribe(fn) | 优化约束,以强化提示

    store.subscribeAction(fn) | 优化约束,以强化提示

    store.mapState({...}) | 映射 state

    store.mapStateOfKeys(...) |映射 state

    store.mapGetters({...}) |映射 getters

    store.mapGettersOfKeys(...) | 映射 getters

    store.mapActions({...}) | 映射 actions

    store.mapActionsOfKeys(...) | 映射 actions

    store.mapMutations({...}) | 映射 mutations

    store.mapMutationsOfKeys(...) | 映射 mutations
<template>
<h1>Home Page</h1>
<h2>{{count}}</h2>
<button @click="handleClick">click</button>
</template> <script lang="ts">
import { defineComponent, computed } from 'vue';
import { useStore } from 'vuex'; export default defineComponent({
setup () {
const store = useStore();
const count = computed(() => store.state.home.count);
const handleClick = () => {
store.commit('user/add');
};
return {
handleClick,
count
};
}
})
</script>

四、alias起别名

  1. vite.config.ts

    在过去使用vue-cli的时候,我们总是使用@去引入某些文件,由于Vite没有提供类似的配置,所以我们需要手动的对其进行相关配置,才能继续使用@符号去快捷的引入文件。首先,我们需要修改vite.config.ts的配置。

    核心代码
 resolve: {
alias: [
{
find: '@',
replacement: '/src',
},
{ find: 'views', replacement: '/src/views' },
{ find: 'components', replacement: '/src/components' },
]
}

完成代码

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
resolve:{
alias:[
{
find:'@',
replacement:'/src'
},
{
find:'views',
replacement:'/src/views'
},
{
find:'components',
replacement:'/src/components'
}, ]
}
})
  1. tsconfig.json

    然后,我们在修改tsconfig.json文件

    核心代码
 "types": ["vite/client", "jest"],
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}

完成代码

{
"compilerOptions": {
"target": "esnext",
"useDefineForClassFields": true,
"module": "esnext",
"moduleResolution": "node",
"strict": true,
"jsx": "preserve",
"sourceMap": true,
"resolveJsonModule": true,
"esModuleInterop": true,
"lib": [
"esnext",
"dom"
],
"types": ["vite/client", "jest"],
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
},
"include": [
"src/**/*.ts",
"src/**/*.d.ts",
"src/**/*.tsx",
"src/**/*.vue"
]
}

五、基础语法

1、定义data

  1. script标签上:lang="ts"
  2. 定义一个类型type或者接口:interface来约束data
  3. 定义响应式数据:可以使用ref或者toRefs来
  4. 使用ref在setup读取的时候需要获取xxx.value,但在template中不需要
  5. 使用reactive时,可以用toRefs解构导出,在template就可以直接使用了
<script lang="ts">
import { defineComponent, reactive, ref, toRefs } from "vue"; type Todo = {
id: number;
name: string;
completed: boolean;
}; export default defineComponent({
setup() {
const data = reactive({
todoList: [] as Todo[],
});
const count = ref(0);
console.log(count.value);
return {
...toRefs(data),
};
},
});
</script>

2、定义props

props需要使用PropType泛型来约束

<script lang="ts">
import { defineComponent, PropType } from "vue"; interface UserInfo {
id: number;
name: string;
age: number;
} export default defineComponent({
props: {
userInfo: {
type: Object as PropType<UserInfo>, // 泛型类型
required: true,
},
},
});
</script>

3、定义methods

<script lang="ts">
import { defineComponent, reactive, ref, toRefs } from "vue"; type Todo = {
id: number;
name: string;
completed: boolean;
}; export default defineComponent({
setup() {
const data = reactive({
todoList: [] as Todo[],
});
// 约束输入和输出类型
const newTodo = (name: string): Todo => {
return {
id: 1,
name,
completed: false,
};
};
const addTodo = (todo: Todo): void => {
data.todoList.push(todo);
};
return {
...toRefs(data),
newTodo,
addTodo,
};
},
});
</script>

Vue3.x全家桶+vite+TS-构建Vue3基本框架的更多相关文章

  1. Vue3.x全家桶+vite+TS-搭建Vue3.x项目

    目录 一.搭建基础项目 1.vite创建项目 3.运行项目 2.环境变量设置介绍 vite配置多环境打包 二.配置Router 1.安装路由 2.配置路由 3.引入 三.配置Vuex 1.安装vuex ...

  2. 使用Vite快速构建Vue3+ts+pinia脚手架

    一.前言 vue3的快速更新,很多IT发展快的地区在22开始都已经提上日程,小编所在的青岛好像最近才有点风波.vue3的人才在青岛还是比较稀缺的哈,纯属小编自己的看法,可能小编是个井底之蛙!! vue ...

  3. 不想用Spring全家桶?试试这个国产JFinal框架

    前言 逃离北上广从广州回老家南宁,入职这家公司用的技术是JFinal,借此机会得以学习这个国产的MVC框架,经过一段时间的学习,基于之前的经验搭建一个通用项目jfinal-demo jfinal-de ...

  4. 开箱即用 yyg-cli(脚手架工具):快速创建 vue3 组件库和vue3 全家桶项目

    1 yyg-cli 是什么 yyg-cli 是优雅哥开发的快速创建 vue3 项目的脚手架.在 npm 上发布了两个月,11月1日进行了大升级,发布 1.1.0 版本:支持创建 vue3 全家桶项目和 ...

  5. 基于 vite 创建 vue3 全家桶项目(vite + vue3 + tsx + pinia)

    vite 最近非常火,它是 vue 作者尤大神发布前端构建工具,底层基于 Rollup,无论是启动速度还是热加载速度都非常快.vite 随 vue3 正式版一起发布,刚开始的时候与 vue 绑定在一起 ...

  6. vue3 vite2 封装 SVG 图标组件 - 基于 vite 创建 vue3 全家桶项目续篇

    在<基于 vite 创建 vue3 全家桶>一文整合了 Element Plus,并将 Element Plus 中提供的图标进行全局注册,这样可以很方便的延续 Element UI 的风 ...

  7. Vue3 Vite3 多环境配置 - 基于 vite 创建 vue3 全家桶项目(续篇)

    在项目或产品的迭代过程中,通常会有多套环境,常见的有: dev:开发环境 sit:集成测试环境 uat:用户接收测试环境 pre:预生产环境 prod:生产环境 环境之间配置可能存在差异,如接口地址. ...

  8. vite + ts 快速搭建 vue3 项目 以及介绍相关特性

    博客地址:https://ainyi.com/98 Vue3.0,One Piece 接下来得抽空好好学习了 vite 尤大在 Vue 3.0 beta 直播中推荐了 vite 的工具,强调:针对Vu ...

  9. 助你上手Vue3全家桶之Vue-Router4教程

    目录 1,前言 1,Router 2.1,跳转 2.2,打开新页面 3,Route 4,守卫 4.1,onBeforeRouteLeave 4.2,onBeforeRouteUpdate 4.3,路由 ...

随机推荐

  1. NodeJS 中的事件循环,读了这篇就全懂了

    事件循环是 NodeJS 处理非阻塞 I/O 操作的和核心机制.NodeJS 的事件循环脱胎于 libuv 的事件循环,因此,要搞清楚 NodeJS 的事件循环,还需要先了解 libuv 的事件循环是 ...

  2. Use Module and Function instead of Class in Python

    The following scripts run in ipython demonstrate the differences between instance method and static ...

  3. 漏洞复现|Dubbo反序列化漏洞CVE-2019-17564

    01漏洞描述 - Apache Dubbo支持多种协议,官方推荐使用Dubbo协议.Apache Dubbo HTTP协议中的一个反序列化漏洞(CVE-2019-17564),该漏洞的主要原因在于当A ...

  4. Ubuntu本地提权适配不同小版本内核(CVE-2017-16995)

    朋友在执行的时候说有的会出现提权不成功,内核crash掉的现象.因为cred结构体的偏移量可能因为内核版本不同.内核编译选项不同而出现差异,作者给的exp偏移量是写死的,所以exp里面对应的偏移地址也 ...

  5. git根据项目地址使用不同代理服务器

    问题 由于公司访问GitHub只能走代理,但是内网gitlab服务器又不能走代理. 因此想找到一种方案,可以支持git自动根据项目地址使用不同代理. 方案 如下所示,可以指定GitHub地址使用指定的 ...

  6. ECDSA—模加减模块

    如果a,b GF(P),则加法运算a+b=r (mod p),其中r满足0<r<p-1,即a+b除以p的余数,该操作成为模p加法.对于模减运算可以视为另类的模加运算,即a+(-b)=k ( ...

  7. 常见web中间件漏洞(三)Nginx漏洞

    nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,有  开源,内存占用少,并发能力强,自由模块化,支持epoll模型,可限制连接数,支持热部署,简单 ...

  8. Python数学建模系列(一):规划问题之线性规划

    @ 目录 前言 线性规划 样例1:求解下列线性规划问题 scipy库求解 样例2:求解下列线性规划问题 pulp库求解 样例3.运输问题 说明 结语 前言 Hello!小伙伴! 非常感谢您阅读海轰的文 ...

  9. docker 安装mysql设置不区分表名大小写,创建minio,设置开机自启动

    环境deepin mysql : docker run -p 3306:3306 --name tyer-mysql --restart=always -v $PWD/conf:/etc/mysql/ ...

  10. NOIP 模拟 $18\; \rm 导弹袭击$

    题解 \(by\;zj\varphi\) 一道凸包题 对于每个导弹,它的飞行时间就是 \(tim=\frac{A}{a_i}+\frac{B}{b_i}\) 我们设 \(x=\frac{1}{a_i} ...