vite vue3下配置history模式路由的步骤记录

   2023-02-07 学习力0
核心提示:目录dev 模式pro模式nginx 配置后端配置补充几个文件总结dev 模式利用vite 配置代理,可以解决前端浏览器限制跨域问题(当然后端要自己配置好)export default defineConfig({// 配置在打包时,保障所有css\js能被找到base: './',//自带配置plugins: [vue()],

dev 模式

利用vite 配置代理,可以解决前端浏览器限制跨域问题(当然后端要自己配置好)

export default defineConfig({
    // 配置在打包时,保障所有css\js能被找到
    base: './',
    
    //自带配置
    plugins: [vue()],
    resolve: {
        alias: {
            '@': fileURLToPath(new URL('./src', import.meta.url))
        }
    },
    
    // 配置/api代理
    server: {
        proxy: {
            '/api': {
                target: 'http://localhost:8080',
                changeOrigin: true,
                rewrite: (path) => path.replace(/^\/api/, '')
            }
        }
    },

    //打包前先清空原有打包文件
    build: {
        emptyOutDir: true,
    }
})

配置.env

在dev 环境,默认会读取这个里面的内容

# .env.development

VITE_BASE_API=/api
VITE_BASE_URL=/vaccinationInfo
VITE_BASE_ENV=dev

配置axios

import axios from "axios";

const service = axios.create({
    baseURL: import.meta.env.VITE_BASE_API as string,
    timeout: 3600
})

这样在dev环境下,就可以使用代理来访问后端了

pro模式

打包时,会自动识别 .env.production

# .env.production 
VITE_BASE_API=http://localhost:8080
VITE_BASE_URL=/vaccinationInfo
VITE_BASE_ENV=pro

由于生产模式时,代理配置时不生效的,所以VITE_BASE_API直接指向服务器地址

history模式 时 还要进行以下配置

router\index.ts

history: createWebHistory(import.meta.env.VITE_BASE_URL as string),

用一个指定的url地址

nginx 配置

当然,打包后放到nginx也需要配置

  location /vaccinationInfo {
        alias  /usr/share/nginx/html/vaccinationInfo;
        index  index.html index.htm;
        try_files $uri $uri/ /vaccinationInfo/index.html; # 解决页面刷新404
    }	

然后在html中新建vaccinationInfo文件夹,把打包好的文件丢进去就行

后端配置

写一个配置类

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    /**
     * 允许跨域,以及自行配置
     *
     * @param registry 跨域注册器
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOriginPatterns("*") // SpringBoot2.4.0以上[allowedOriginPatterns]代替[allowedOrigins]
                .allowedMethods("*")
                .maxAge(3600)
                .allowedHeaders("*")
                .allowCredentials(true);
    }
}

如果需要配置拦截器拦截JWT,可以采取以下操作

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    private JWTTokenInterceptor jwtTokenInterceptor;

    private InterceptorPathBean interceptorPathBean;

    @Autowired
    public void setJwtTokenInterceptor(JWTTokenInterceptor jwtTokenInterceptor) {
        this.jwtTokenInterceptor = jwtTokenInterceptor;
    }

    @Autowired
    public void setInterceptorPathBean(InterceptorPathBean interceptorPathBean) {
        this.interceptorPathBean = interceptorPathBean;
    }

    /**
     * 允许跨域,以及自行配置
     *
     * @param registry 跨域注册器
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOriginPatterns("*") // SpringBoot2.4.0以上[allowedOriginPatterns]代替[allowedOrigins]
                .allowedMethods("*")
                .maxAge(3600)
                .allowedHeaders("*")
                .allowCredentials(true);
    }

    /**
     * 添加API拦截器,对所有数据API进行拦截
     *
     * @param registry 拦截器注册器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册拦截规则
        InterceptorRegistration interceptorRegistration = registry.addInterceptor(jwtTokenInterceptor);
        // 拦截配置
        interceptorRegistration.addPathPatterns(interceptorPathBean.getInclude());
    }

}

重写addInterceptors 方法

配置JWT拦截器

@Component
public class JWTTokenInterceptor implements HandlerInterceptor {

    @Resource
    private JWTResult jwtResult;

    /**
     * 拦截对数据API的请求,判断jwt令牌是否有效,没有则返回401
     *
     * @param request  请求
     * @param response 响应
     * @param handler  处理器
     * @return 是否继续执行,true继续执行,false不继续执行
     * @throws Exception 异常
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //非简单请求会预先使用OPTIONS方法请求一次,这里直接返回true
        if (request.getMethod().equals("OPTIONS")) {
            response.setStatus(200);
            //在拦截器中设置允许跨域
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Allow-Headers", "*");
            response.setHeader("Access-Control-Allow-Methods", "*");
            response.setHeader("Access-Control-Allow-Credentials", "true");
            response.setHeader("Access-Control-Max-Age", "3600");
            return true;
        }

        //业务逻辑,自行发挥
        //这才是真正的请求,需要验证jwt令牌
        //请求数据API时的目标url
        String path = request.getRequestURI();
        String jwt = request.getHeader("Authorization");

        //对每次数据API请求进行拦截,如果jwt令牌不合法,则返回401;通过则继续放行,因此数据controller不需要再次判断jwt令牌是否合法
        boolean verify = jwtResult.verify(jwt,path);
        //如果校验不通过
        if (!verify) {
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().write("{\"code\":401,\"msg\":\"jwt校验失败\"}");
        }
        return verify;
    }

}

以上是重点处理 OPTIONS 预先请求,这个在非简单请求时会预先发出,典型场景就是打包后的前端工程,在请求后端是就会发出这个OPTIONS请求。

后面那些就是业务逻辑,自行发挥即可

补充几个文件

InterceptorPathBean

@Data
@Component
@ConfigurationProperties(prefix = "interceptor-config.path") // 配置文件的前缀
public class InterceptorPathBean {
    /*
     * 需要拦截的路径
     */
    private List<String> include;
}

application.yml

# 拦截器路径拦截
interceptor-config:
  path:
    #该路径下任何类型请求均拦截
    include:
      - /telInfo/**
      - /vaccinationInfo/**

以上,就可以在vue中站着用history模式了

总结

原文地址:https://blog.csdn.net/pakchoily/article/details/125182529
 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 一文秒懂Vue3的v-model vue3 vite2
    目录1:什么是 v-model2:v-model 的扩展1:自定义名称2:内置修饰符3:自定义修饰符总结1:什么是 v-modelv-model 是 Vue 内置的指令作为属性接收一个变量(不能是常量)绑定到普通组件和自定义组件中// 作为普通组件的属性, 只有作为表单内的元素属性时才会
    03-08
  • vue3+vite+TS中使用element-plus按需引入ElLoading、ElMessage样式失效解决
    vue3+vite+TS中使用element-plus按需引入ElLoad
    目录ElMessage 样式失效解决方案ElLoading 样式失效解决方案总结ElMessage 样式失效其实他不是失效了,只是加载到我们的可以看到下面使用的方式和效果图,vue3的element-plus遇到的问题,因为要测试一下,所以点的频率比较大,但可以明显的看到ElMessage样式
    03-08
  • 一文详解如何在Vue3+Vite中使用JSX
    目录JSX介绍在 Vue3 中使用 JSX安装插件(@vitejs/plugin-vue-jsx)新建 jsx 文件语法补充知识:注意事项总结JSX介绍JSX(JavaScript 和 XML),是一个 HTML-in-JavaScript 的语法扩展,首先在 React 中被进入。JSX 可以很好地描述 UI 应该呈现出它应有交互的
    03-08
  • vue3+vite引入插件unplugin-auto-import的方法 vite vue3 typescript
    vue3+vite引入插件unplugin-auto-import的方法
    自动引入 composition api,不需要再手动引入。github地址:https://github.com/antfu/unplugin-auto-import下载npm i unplugin-auto-import -D修改vite.config.ts文件import AutoImport from 'unplugin-auto-import/vite'export default defineConfig({plugi
    03-08
  • 一篇文章说清 webpack、vite、vue-cli、create-
    一篇文章说清 webpack、vite、vue-cli、create-vue 的区别2022-05-09 13:20 金色海洋(jyk) 阅读(0) 评论(0) 编辑 收藏 举报webpack、vite、vue-cli、create-vue 这些都是什么?看着有点晕,不要怕,我们一起来分辨一下。先看这个表格:脚手架vue-clic
    02-08
  • gulp+webpack构建配置 深入Webpack5等构建工具(gulp/rollup/vite
    gulp+webpack构建配置 深入Webpack5等构建工具(
    使用构建工具之前我觉得前端好蠢,css没有变量,不能写循环,为了兼容要写好多前缀,hmtl写多页面中有同一个header,我就粘贴复制,然后修改的时候每个都要改。我还不会压缩和合并,每次都要按F5刷新。其实这些问题也是网页优化的问题。构建工具正是解决这些
    02-08
  • webpack与vite的对比
    webpack与vite的对比
    vite与webpack的打包原理:vite: 基于游览器原生ES Module,利用游览器解析import,服务器端按需编译返回 webpack: 逐级递归识别依赖,构建依赖图谱-转化AST语法树-处理代码-转换为游览器可识别的代码 vite相比webpack的优势:开发环境中,无需打包操作,可
    02-08
  • Vite+React搭建开发构建环境实践
    前言使用 Vite 已经有两年了,期间使用它开发过单页面应用,也开发过浏览器扩展插件,对比日常工作中用到的 webpack 构建速度大幅提升,开发体验也好很多。虽然相比于 webpack 来说简单了很多,但是仍然有一些配置需要记录一下,以便之后可以快速搭建一个本地
    02-08
  • vue3+vite使用环境变量.env的一些配置情况详细说明
    vue3+vite使用环境变量.env的一些配置情况详细
    目录1、设置.env中的内容信息 注意vue3+vite 必须使用VITE开头的配置信息 否则无法获取2、在 vite 中使用环境变量,可以用 import.meta.env,有四种环境变量,如下所示:3、使用环境变量4、配置env.d.ts文件,为环境变量增加智能提示5、在package.json中配置
  • Vue3 企业级优雅实战 - 组件库框架 - 8 搭建组件库 cli
    Vue3 企业级优雅实战 - 组件库框架 - 8 搭建组
    前面的文章分享了组件库的开发、example、组件库文档,本文分享组件库 cli 开发。1 为什么要开发组件库 cli回顾一个新组件的完整开发步骤:1 在 packages 目录下创建组件目录 xxx:1.1 使用 pnpm 初始化 package.json,修改 name 属性;1.2 在该目录中创建 sr
点击排行