从零开始搭建Layout框架 --- vue3 + webpack + element-plus

本文涵盖axios封装 环境变量 动态路由表 登陆鉴权 

1. 使用vue-cli创建项目

确保电脑已安装node.js

在命令窗口 使用 node -v查看是否已安装

使用 vue creare <项目名称> 创建项目

....

2.创建环境变量 

在根目录下创建.env.development .env.production连个文件分别用来保存开发环境和测试环境的环境变量

3.配置跨域代理

在vue.config.js中写入

const { defineConfig } = require('@vue/cli-service')

module.exports = defineConfig({
	//开发服务,build后的生产模式还需nginx代理
	devServer: {
		open: false, //运行后自动打开浏览器
		port: process.env.VUE_APP_PORT, //挂载端口
		proxy: {
            //匹配的接口前缀地址
			'/api': {
				target: process.env.VUE_APP_API_BASEURL,
				ws: true,
				pathRewrite: {   
					'^/api': '/' //将前缀替换为/
				}
			}
		},
		headers: {
			'Access-Control-Allow-Origin': '*',
		}
	}
})

4. 路由配置

在src下创建 router文件夹

创建 router/index.js router/systemRouter.js文件 

systemRouter.js用于保存公共路由 即无需登录也能直接访问的路由

router/index.js

import {createRouter, createWebHashHistory} from 'vue-router';
import systemRouter from './systemRouter';

//系统路由
const routes = systemRouter

const router = createRouter({
	history: createWebHashHistory(),
	routes: routes
})

export default router

router/systemRouter.js

//系统路由
const routes = [
	{
		path: "/login",
		component: () => import('@/views/login'),
		meta: {
			title: "登录"
		}
	},
    ....
]

export default routes;

之后在main.js中注册完成路由基础配置

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

const app = createApp(App);

app.use(router);

//挂载app
app.mount('#app');

5.axios封装

在src下创建 utils/request.js文件

import axios from 'axios';
import router from '@/router';

axios.defaults.baseURL = ''

axios.defaults.timeout = 5000

// HTTP request 拦截器 在请求发送之前进行必要操作处理 例如添加统一cookie 请求体加验证设置请求头等等
axios.interceptors.request.use(
	(config) => {
        let token = "*******"
		config.headers.token =  token
		return config; //必须要在最后return config
	},
	(error) => {
		return Promise.reject(error);
	}
);

// HTTP response 拦截器 响应拦截器 在请求得到响应之后对响应体的一些处理通常是数据统一处理 判断登陆失效 错误判断等等
axios.interceptors.response.use(
	(response) => {
		return response;  //在此不做处理可根据自己需要自行配置
	},
	(error) => {
        //错误处理 根据项目自行配置

		return Promise.reject(error);
	}
);

var http = {

	/** get 请求
	 * @param  {接口地址} url
	 * @param  {请求参数} params
	 * @param  {参数} config
	 */
	get: function(url, params={}, config={}) {
		return new Promise((resolve, reject) => {
			axios({
				method: 'get',
				url: url,
				params: params,
				...config
			}).then((response) => {
				resolve(response.data);
			}).catch((error) => {
				reject(error);
			})
		})
	},

	/** post 请求
	 * @param  {接口地址} url
	 * @param  {请求参数} data
	 * @param  {参数} config
	 */
	post: function(url, data={}, config={}) {
		return new Promise((resolve, reject) => {
			axios({
				method: 'post',
				url: url,
				data: data,
				...config
			}).then((response) => {
				resolve(response.data);
			}).catch((error) => {
				reject(error);
			})
		})
	},

	/** put 请求
	 * @param  {接口地址} url
	 * @param  {请求参数} data
	 * @param  {参数} config
	 */
	put: function(url, data={}, config={}) {
		return new Promise((resolve, reject) => {
			axios({
				method: 'put',
				url: url,
				data: data,
				...config
			}).then((response) => {
				resolve(response.data);
			}).catch((error) => {
				reject(error);
			})
		})
	},

	/** patch 请求
	 * @param  {接口地址} url
	 * @param  {请求参数} data
	 * @param  {参数} config
	 */
	patch: function(url, data={}, config={}) {
		return new Promise((resolve, reject) => {
			axios({
				method: 'patch',
				url: url,
				data: data,
				...config
			}).then((response) => {
				resolve(response.data);
			}).catch((error) => {
				reject(error);
			})
		})
	},

	/** delete 请求
	 * @param  {接口地址} url
	 * @param  {请求参数} data
	 * @param  {参数} config
	 */
	delete: function(url, data={}, config={}) {
		return new Promise((resolve, reject) => {
			axios({
				method: 'delete',
				url: url,
				data: data,
				...config
			}).then((response) => {
				resolve(response.data);
			}).catch((error) => {
				reject(error);
			})
		})
	},

	/** jsonp 请求
	 * @param  {接口地址} url
	 * @param  {JSONP回调函数名称} name
	 */
	jsonp: function(url, name='jsonp'){
		return new Promise((resolve) => {
			var script = document.createElement('script')
			var _id = `jsonp${Math.ceil(Math.random() * 1000000)}`
			script.id = _id
			script.type = 'text/javascript'
			script.src = url
			window[name] =(response) => {
				resolve(response)
				document.getElementsByTagName('head')[0].removeChild(script)
				try {
					delete window[name];
				}catch(e){
					window[name] = undefined;
				}
			}
			document.getElementsByTagName('head')[0].appendChild(script)
		})
	}
}

export default http;

在src下创建 api文件夹

创建 api/***.js 用于存储接口数据

示例

import http from "@/utils/request"

export default {
    login:{
        // /api为跨域代理匹配字段 此处无需再写完整地址
		url: '/api/login',
		name: "",
		get: async function(data={}){
			return await http.get(this.url, data);
		}
	}
}

6.引入vuex  vuex模块化

npm install vuex

在src下创建 store文件夹

创建 store/modules文件夹 用于存储各个模块

创建 store/index.js文件 

创建store/modules/user.js 模块 存储用户信息等内容

export default {
	state: {
		
	},
    getters:{
    
    },
	mutations: {
		
	},
	actions: {
		
	}
}

在store/index.js中引入

import { createStore } from 'vuex';
import user from './modules/user.js'


export default createStore({
	modules:{
        user
    }
});

自动导入所有模块代码

import { createStore } from 'vuex';

const files = require.context('./modules', false, /\.js$/);
const modules = {}
files.keys().forEach((key) => {
	modules[key.replace(/(\.\/|\.js)/g, '')] = files(key).default
})

export default createStore({
	modules
});

7. 封装localStorage 工具并全局注册

创建 utils/tool.js 用来存储各种工具函数

const tool = {}

/* localStorage */
tool.data = {
	set(key, data, datetime = 0) {
        let cacheValue = {
            content: data,
            datetime: parseInt(datetime) === 0 ? 0 : new Date().getTime() + parseInt(datetime) * 1000
        }
        return localStorage.setItem(key, JSON.stringify(cacheValue))
	},
	get(key) {
        try {
            const value = JSON.parse(localStorage.getItem(key))
            if (value) {
                let nowTime = new Date().getTime()
                if (nowTime > value.datetime && value.datetime != 0) {
                    localStorage.removeItem(key)
                    return null;
                }
                return value.content
            }
            return null
        } catch (err) {
            return null
        }
	},
	remove(key) {
		return localStorage.removeItem(key)
	},
	clear() {
		return localStorage.clear()
	}
}


export default tool

此处为localStorage 增加了超时功能可自行选择

8.引入 element-plus

npm install element-plus --save

 element-plus/icons-vue需要单独引入并注册

 npm install @element-plus/icons-vue
import ElementPlus from "element-plus";
import "element-plus/dist/index.css";
import "element-plus/theme-chalk/display.css";
import * as elIcons from '@element-plus/icons-vue'
import router from "./router";
import store from "./store";
import { createApp } from "vue";
import App from "./App.vue";

const app = createApp(App);

app.use(store);
app.use(router);
app.use(ElementPlus);
for(let icon in elIcons){
	app.component(`ElIcon${icon}`, elIcons[icon])
}

//挂载app
app.mount("#app");

至此准备工作结束

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于搭建 Vue 3 + TypeScript + Vite + Element Plus 的环境,并进行 Vite 的优化,可以按照以下步骤进行操作: 1. 确保已安装 Node.js 首先确保你的电脑已经安装了 Node.js,可以在命令行中输入 `node -v` 来检查是否安装成功。 2. 创建新项目 打开命令行,进入到你想要创建项目的目录中,执行以下命令创建新的 Vue 3 项目: ``` npm init @vitejs/app my-vue-app --template vue-ts ``` 3. 安装 Element Plus 进入到项目目录,执行以下命令安装 Element Plus: ``` npm install element-plus --save ``` 4. 配置 Element Plus 在 `src/main.ts` 中引入 Element Plus 的样式和组件: ```typescript import { createApp } from 'vue'; import App from './App.vue'; import elementPlus from 'element-plus'; import 'element-plus/lib/theme-chalk/index.css'; const app = createApp(App); app.use(elementPlus); app.mount('#app'); ``` 5. Vite 的优化 Vite 是一个基于 ES Modules 的构建工具,它的特点是快速的冷启动和开发时的实时模块热更新。但在生产环境中,我们需要对 Vite 进行一些优化。 - 使用生产模式构建 在 `package.json` 文件中的 `scripts` 中添加以下命令: ```json "scripts": { "build": "vite build" } ``` 然后执行 `npm run build` 命令进行构建。 - 优化打包体积 在 `vite.config.ts` 中可以配置一些优化选项,例如: ```typescript import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' export default defineConfig({ plugins: [vue()], build: { target: 'es2015', terserOptions: { compress: { drop_console: true, drop_debugger: true } } } }) ``` 上述配置中,`target` 指定了构建的目标浏览器环境为 ES2015,`terserOptions` 中的配置会在压缩代码时移除控制台输出和调试器。 - 配置静态资源路径 默认情况下,Vite 会将静态资源放在根目录下,可以通过配置 `base` 选项来指定静态资源的路径。在 `vite.config.ts` 中添加以下配置: ```typescript export default defineConfig({ base: '/your-base-path/' }) ``` - 优化生产环境加载速度 在生产环境中,可以通过配置 `build.assetsInlineLimit` 来控制是否将小于指定大小的文件转换为 base64 格式内联到 HTML 中。在 `vite.config.ts` 中添加以下配置: ```typescript export default defineConfig({ build: { assetsInlineLimit: 4096 } }) ``` 这些只是一些常用的优化选项,你可以根据具体需求进行配置。 希望以上步骤对你有所帮助!如果你有更多问题,可以继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值