• vue2配置环境变量并且nginx运行成功


    需求:我在vue项目配置了生产环境和开发环境,之后通过proxy代理的方式把地址转发到真实的服务器地址上用于请求接口,之后把项目打包后上传到nginx上,之后接口报错404,但是本地运行是可以访问的,找了很久终于解决了故此记录下


    1.配置环境变量

    官方配置环境变量地址:模式和环境变量 | Vue CLI (vuejs.org)

    在vue项目根目录下创建俩个文件,当然可以创建更多,比如测试环境等。前面有个.别写漏了

    • .env.development
    • .env.production

    .env.development文件

    1. # 指定构建模式
    2. NODE_ENV='development'
    3. VUE_APP_TITLE = '开发测试'
    4. VUE_APP_PROT = 8080
    5. VUE_APP_BASE_API = '/api'
    6. VUE_APP_SERVE ='http://后端的本地运行接口地址'

     .env.production

    1. # 指定构建模式
    2. NODE_ENV='production'
    3. VUE_APP_TITLE = '生产测试'
    4. VUE_APP_PROT = 8006
    5. VUE_APP_BASE_API = '/api'
    6. VUE_APP_SERVE ='http://后端线上的接口地址'

    讲解如下:

    vue项目默认会有NODE_ENVBASE_URL这俩个环境变量,你自己要配置其他的环境变量的话一定要以VUE_APP_xx开头

    NODE_ENV='production'

    VUE_APP_TITLE = '生产测试'

    VUE_APP_PROT = 8006

    VUE_APP_BASE_API = '/api'

    VUE_APP_SERVE ='http://域名+端口号'

    2.在package.json文件中配置不同环境下运行

    dev:这是线下的时候运行环境,使用npm run dev

    pro:本地运行线上环境,使用npm run pro

    build:打包,默认打包后是线上的环境,也就是运行这个 .env.production文件里的内容

    1. "scripts": {
    2. "dev": "vue-cli-service serve --mode development",
    3. "pro": "vue-cli-service serve --mode production",
    4. "build": "vue-cli-service build"
    5. },

    环境配置好后启动项目,使用可以看到当前处于什么环境下

        console.log(process.env.NODE_ENV,'模式')

    2.1修改接口请求baseURL:

    有俩种模式

    1.后端配置了跨域,那么前端baseURL直接用后端的服务器地址就行

    2.后端没有配置跨域,前端使用VUE_APP_BASE_API,之后让proxy去代理跨域,之后前端打包后在nginx再以VUE_APP_BASE_API这个路径根据反向代理找真实的服务器地址,下面我配置的nginx就是在后端没有配置跨域的情况下前端访问后端接口的配置

    1. const instance = axios.create({
    2. baseURL:process.env.VUE_APP_SERVE,
    3. timeout:10000
    4. })

    3.配置跨域

    在vue.config.js中配置,如果项目没有这个文件就自己创建一个

    跨域完整代码如下,如果你前面复制的是我配置的哪些变量,就可以直接复制了,只需要更改

    VUE_APP_SERVE这个

      port: Number(process.env.VUE_APP_PROT):这个就是你在本地运行的时候启动的端口号,你写的是8006,那么运行项目后就是06的端口了,但是这边有个问题一直没解决,找了好多种就是解决不了,就是pathRewrite没有生效

    1. const repacePath = "^" + process.env.VUE_APP_BASE_API;
    2. // 基础路径 注意发布之前要先修改这里
    3. module.exports = {
    4. publicPath: process.env.NODE_ENV === "production" ? "/" : " ",
    5. transpileDependencies: true,
    6. devServer: {
    7. proxy: {
    8. port:Number(process.env.VUE_APP_PROT),
    9. [process.env.VUE_APP_BASE_API]: {//以/api之后去请求到真实的服务器地址并且把/api给删除
    10. pathRewrite: {//匹配到/api后替换为空字符串
    11. [repacePath]: ''
    12. },
    13. target: process.env.VUE_APP_SERVE,//真实服务器地址
    14. changeOrigin: true //是否代理跨域
    15. },
    16. }
    17. },
    18. }

     这个/api没替换为空字符串但是还是可以请求到服务器的地址

    4.打包发布到nginx

    1.使用npm run build打包生成dist文件

    2.把打包好的dist文件放在nginx的html文件夹下

    3.在nginx的conf文件夹下找到nginx.conf

    配置如下

    主要注意看反向代理,一定要配置这个反向代理,并且这个/prod-api要和VUE_APP_BASE_API一致,如果不一致可能会出现和我一样的404/405、304报错,反向代理写死,只需要改/prod-api,根据你自己的VUE_APP_BASE_API一起更改

    server {
        listen 38081;#本地启动的端口号
        server_name  localhost;

          location / {
     
        root  html/webyingyong/dist;     #dist包部署路径
     
        try_files $uri $uri/ /index.html last;
     
        index index.html index.htm;  #访问的index.html文件也就是首页
        }
    #反向代理
     
          location /prod-api {
     
        rewrite ^/prod-api/(.*)$ /$1 break;       # /prod-api/ 替换为/,因为后台接口无/prod-api
     
        proxy_pass http://;     #后台接口地址

        proxy_redirect off;

        proxy_set_header Host $host;
     
        proxy_set_header X-Real-IP $remote_addr;
         
        proxy_set_header X-Forwarded-For $remote_addr;
     
        }

        location @router{
     
        rewrite ^.*$ /index.html last;
     
        }
    }

    1. server {
    2. listen 38081;
    3. server_name localhost;
    4. location / {
    5. root html/webyingyong/dist; #dist包部署路径
    6. try_files $uri $uri/ /index.html last;
    7. index index.html index.htm;
    8. }
    9. #反向代理
    10. location /prod-api {
    11. rewrite ^/prod-api/(.*)$ /$1 break; # /prod-api/ 替换为/,因为后台接口无/prod-api
    12. proxy_pass http://xue.cnkdl.cn:23683; #后台接口地址
    13. proxy_set_header X-Real-IP $remote_addr;
    14. proxy_set_header X-Forwarded-For $remote_addr;
    15. }
    16. location @router{
    17. rewrite ^.*$ /index.html last;
    18. }
    19. }

    之后启动nginx就可以了

    nginx -s reload

    5.打包后路由跳转报错

    ChunkLoadError: Loading chunk 549 failed.

    找了好多种方法最终解决就是把vue.config,js的publicPath的值重'./'改为'/'

      publicPath: process.env.NODE_ENV === "production" ? "/" : " ",

    并且我还加上了个保证打包后编译的文件名称不会重复的output

    1. const path = require("path");
    2. const repacePath = "^" + process.env.VUE_APP_BASE_API;
    3. const timeStamp = new Date().getTime();
    4. // 基础路径 注意发布之前要先修改这里
    5. module.exports = {
    6. publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
    7. transpileDependencies: true,
    8. configureWebpack: config => { // webpack 配置
    9. if (process.env.NODE_ENV === "production") {
    10. return {
    11. output: {
    12. library: 'myLibrary', // 输出重构 打包编译后的文件名称 【模块名称.时间戳】
    13. filename: `[name].${timeStamp}.js`,
    14. libraryTarget: 'umd',
    15. globalObject: 'this',
    16. }
    17. }
    18. }
    19. },
    20. devServer: {
    21. port: Number(process.env.VUE_APP_PROT),
    22. proxy: {
    23. [process.env.VUE_APP_BASE_API]: {
    24. target: process.env.VUE_APP_SERVE,
    25. changeOrigin: true,
    26. pathRewrite: {
    27. [repacePath]: '' // /prod-api 替换为空
    28. }
    29. },
    30. }
    31. }
    32. }

    最后如果不会nginx的可以看我另外一篇

    nginx部署本地启动vue项目_nginx本地运行vue项目_请叫我欧皇i的博客-CSDN博客

    文章到此结束,希望对你有所帮助,有不懂的可以留言告诉我,互相学习~

  • 相关阅读:
    代码随想录算法训练营第二十八天| LeetCode93. 复原 IP 地址、LeetCode78. 子集、LeetCode90. 子集 II
    从0到1开始运营你的开源产品
    卷起来了 手把手带你写一个中高级程序员必会的分布式RPC框架
    【微软押注ARM架构,“Wintel”联盟摇摇欲坠?】
    六大招式,修炼极狐GitLab CI/CD “快” 字诀
    Akka 学习(二)第一个入门程序
    基于SpringBoot的植物健康系统
    菜鸟Linux(3):环境变量
    快捷键操作
    金仓数据库KingbaseES客户端编程接口指南-ado.net(7. Kdbnpg支持的类型和类型映射)
  • 原文地址:https://blog.csdn.net/qq_44278289/article/details/132826849