vite2.0+vue3移动端项目实战详解


Posted in Vue.js onMarch 03, 2021

一.涉及技术点

  • vite版本
  • vue3
  • ts
  • 集成路由
  • 集成vuex
  • 集成axios
  • 配置Vant3
  • 移动端适配
  • 请求代理

二.步骤

vite+ts+vue3只需要一行命令

npm init @vitejs/app my-vue-app --template vue-ts

配置路由

npm install vue-router@4 --save

在src下新建router目录,新建index.ts文件

import { createRouter, createWebHashHistory, RouteRecordRaw } from "vue-router";
const routes: Array<RouteRecordRaw> = [
 {
 path: "/",
 name: "Home",
 meta: {
  title: "首页",
  keepAlive: true
 },
 component: () => import("../views/Home/index.vue"),
 },
 {
 path: "/login",
 name: "Login",
 meta: {
  title: "登录",
  keepAlive: true
 },
 component: () => import("../views/Login/index.vue"),
 },
];
const router = createRouter({
 history: createWebHashHistory(),
 routes
});
export default router;

在main.ts挂载路由

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

配置数据中心vuex(4.x)

安装

npm i vuex@next --save

配置

在src下创建store目录,并在store下创建index.ts

import { createStore } from "vuex";
export default createStore({
 state: {
 listData:{1:10},
 num:10
 },
 mutations: {
 setData(state,value){
  state.listData=value
 },
 addNum(state){
  state.num=state.num+10
 }
 },
 actions: {
 setData(context,value){
  context.commit('setData',value)
 },
 },
 modules: {}
});

挂载

在main.ts挂载数据中心

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

Vant3

安装

npm i vant@next -S

vite版本不需要配置组件的按需加载,因为Vant 3.0 内部所有模块都是基于 ESM 编写的,天然具备按需引入的能力,但是样式必须全部引入137.2k

在main.ts全局引入样式

import { createApp } from 'vue'
import App from './App.vue'
import router from "./router";
import store from "./store";
import 'vant/lib/index.css'; // 全局引入样式
createApp(App)
.use(router)
.use(store)
.use(ant)
.mount('#app')

移动端适配

安装postcss-pxtorem

npm install postcss-pxtorem -D

在根目录下创建postcss.config.js

module.exports = {
 "plugins": {
 "postcss-pxtorem": {
  rootValue: 37.5, 
  // Vant 官方根字体大小是 37.5
  propList: ['*'],
  selectorBlackList: ['.norem'] 
  // 过滤掉.norem-开头的class,不进行rem转换
 }
 }
}

在根目录src中新建util目录下新建rem.ts等比适配文件

// rem等比适配配置文件
// 基准大小
const baseSize = 37.5 
// 注意此值要与 postcss.config.js 文件中的 rootValue保持一致
// 设置 rem 函数
function setRem () {
 // 当前页面宽度相对于 375宽的缩放比例,可根据自己需要修改,一般设计稿都是宽750(图方便可以拿到设计图后改过来)。
 const scale = document.documentElement.clientWidth / 375
 // 设置页面根节点字体大小(“Math.min(scale, 2)” 指最高放大比例为2,可根据实际业务需求调整)
 document.documentElement.style.fontSize = baseSize * Math.min(scale, 2) + 'px'
}
// 初始化
setRem()
// 改变窗口大小时重新设置 rem
window.onresize = function () {
 console.log("我执行了")
 setRem()
}

在mian.ts引入

import "./utils/rem"

配置网络请求axios

安装

npm i -s axios

配置axios

在src创建utils文件夹,并在utils下创建request.ts

import axios from "axios";
const service = axios.create({
 baseURL,
 timeout: 5000 // request timeout
});
// 发起请求之前的拦截器
service.interceptors.request.use(
 config => {
 // 如果有token 就携带tokon
 const token = window.localStorage.getItem("accessToken");
 if (token) {
  config.headers.common.Authorization = token;
 }
 return config;
 },
 error => Promise.reject(error)
);
// 响应拦截器
service.interceptors.response.use(
 response => {
 const res = response.data;
 
 if (response.status !== 200) {
  return Promise.reject(new Error(res.message || "Error"));
 } else {
  return res;
 }
 },
 error => {
 return Promise.reject(error);
 }
);
export default service;

使用

import request from "../utils/request";
request({url: "/profile ",method: "get"})
.then((res)=>{
 console.log(res)
})

配置请求代理

vite.config.ts

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path';
 
// https://vitejs.dev/config/
export default defineConfig({
 plugins: [vue()],
 base:"./",//打包路径
 resolve: {
 alias:{
  '@': path.resolve(__dirname, './src')//设置别名
 }
 },
 server: {
 port:4000,//启动端口
 open: true,
 proxy: {
  // 选项写法
  '/api': 'http://123.56.85.24:5000'//代理网址
 },
 cors:true
 }
 
})

 以上,一个最基本的移动端开发配置完成。

三. vite对<script setup> 和<style vars>的支持格外友好

正常写法

<script lang="ts">
import { defineComponent } from "vue";
import { useRouter } from "vue-router";
export default defineComponent({
 setup() {
 const router = useRouter();
 const goLogin = () => {
  router.push("/");
 };
 return { goLogin };
 },
});
</script>
<script setup>写法
<script lang="ts" setup="props">
import { useRouter } from "vue-router";
const router = useRouter();
const goLogin = () => {
 router.push("/");
};
</script>

是不是简洁了很多

<style vars>如何用?
<script lang="ts" setup="props">
const state = reactive({
 color: "#ccc",
});
</script>
<style >
.text {
 color: v-bind("state.color");
}
</style>

就这么简单!

代码

原文地址:zhuanlan.zhihu.com/p/351888882

线上预览:http://123.56.85.24/vite/#/

代码地址:github.com/huoqingzhu/vue3-vite-ts-Vant

vitejs中文网:https://cn.vitejs.dev/

到此这篇关于vite2.0+vue3移动端项目实战详解的文章就介绍到这了,更多相关vite2.0+vue3项目实战内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
vue3使用vue-count-to组件的实现
Dec 25 Vue.js
Vue ​v-model相关知识总结
Jan 28 Vue.js
Vue 实现可视化拖拽页面编辑器
Feb 01 Vue.js
vue实现拖拽进度条
Mar 01 Vue.js
vue实现倒计时功能
Mar 24 Vue.js
Vue中foreach数组与js中遍历数组的写法说明
Jun 05 Vue.js
Vue实现跑马灯样式文字横向滚动
Nov 23 Vue.js
Vue elementUI表单嵌套表格并对每行进行校验详解
Feb 18 Vue.js
Vue监视数据的原理详解
Feb 24 Vue.js
Vue中Object.assign清空数据报错的解决方案
Mar 03 Vue.js
Vue ECharts实现机舱座位选择展示功能
May 15 Vue.js
vue实现简易音乐播放器
Aug 14 Vue.js
Vue多选列表组件深入详解
Mar 02 #Vue.js
Vue2.x-使用防抖以及节流的示例
Mar 02 #Vue.js
Vue中避免滥用this去读取data中数据
Mar 02 #Vue.js
vue脚手架项目创建步骤详解
Mar 02 #Vue.js
vue-cli中实现响应式布局的方法
Mar 02 #Vue.js
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
Mar 01 #Vue.js
vue 使用饿了么UI仿写teambition的筛选功能
Mar 01 #Vue.js
You might like
使用Xdebug调试和优化PHP程序之[1]
2007/04/17 PHP
PHP单例模式详解及实例代码
2016/12/21 PHP
php pdo操作数据库示例
2017/03/10 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
jscript之Open an Excel Spreadsheet
2007/06/13 Javascript
JavaScript 动态改变图片大小
2009/06/11 Javascript
jquery.validate使用攻略 第三部
2010/07/01 Javascript
js使用for循环查询数组中是否存在某个值
2014/08/12 Javascript
JavaScript使用function定义对象并调用的方法
2015/03/23 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
2015/09/02 Javascript
jQuery获取当前点击的对象元素(实现代码)
2016/05/19 Javascript
js提交form表单,并传递参数的实现方法
2016/05/25 Javascript
AngularJS入门教程之模块化操作用法示例
2016/11/02 Javascript
JS小球抛物线轨迹运动的两种实现方法详解
2017/12/20 Javascript
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
详解微信小程序文件下载--视频和图片
2019/04/24 Javascript
JS实现选项卡效果的代码实例
2019/05/20 Javascript
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
vue实现登录、注册、退出、跳转等功能
2020/12/23 Vue.js
Python 创建新文件时避免覆盖已有的同名文件的解决方法
2018/11/16 Python
python控制nao机器人身体动作实例详解
2019/04/29 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
2019/08/19 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
2020/04/07 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
Python 如何批量更新已安装的库
2020/05/26 Python
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
高级电工工作职责
2013/11/21 职场文书
八年级英语教学反思
2014/01/09 职场文书
小学庆六一活动方案
2014/02/28 职场文书
承诺书的格式范文
2014/03/28 职场文书
悬空寺导游词
2015/02/05 职场文书
2015年教研组工作总结
2015/05/04 职场文书
2015年医务科工作总结范文
2015/05/26 职场文书
2016年大学迎新晚会工作总结
2015/10/15 职场文书