vue项目分环境配置打包处理

news2024/10/5 16:27:19

vue项目分环境配置打包处理

目录

vue项目分环境配置打包处理

本地环境配置

生产环境配置

打包处理

打包配置处理(扩展) 


本地环境配置

定义需要的变量,这里定义了各种变量标识,可参考使用,自定义项目需要的变量,这里定义是可以全局访问到的,用起来很方面

新建.env.development文件

NODE_ENV='development'
VUE_APP_FLAG = 'dev'

# activity分支
# 地址1
# VUE_APP_API='http://192.168.0.0:9000'
# VUE_APP_IMGAPI='http://36.134.00.00:8088'
# VUE_APP_WEBSOCKET='ws://192.168.2.19:9000'

# 地址2
# VUE_APP_API='http://192.168.0.1:9000'
# VUE_APP_IMGAPI='http://36.134.00.00:8088'
# VUE_APP_WEBSOCKET='ws://192.168.2.20:9000'

outputDir = dev

 测试、开发环境配置

新建.env.test文件

配置测试地址变量,供全局使用

NODE_ENV='production'
VUE_APP_NAME = 'test'
VUE_APP_FLAG = 'dev'
# 测试
# VUE_APP_API='http://8.136.115.00:9010'
# VUE_APP_IMGAPI='http://8.136.115.00:8088'
# VUE_APP_WEBSOCKET='ws://8.136.115.00:9010'
# 测试更换
VUE_APP_API='http://36.134.79.00:9010'
VUE_APP_IMGAPI='http://36.134.79.00:8088'
VUE_APP_WEBSOCKET='ws://36.134.79.00:9010'

outputDir = test 

生产环境配置

.env文件,也可以定其他名称(.env.production) 

NODE_ENV='production'
VUE_APP_NAME = 'production'
# 正式
VUE_APP_FLAG = 'pro'
VUE_APP_API='https://xxxxxxx'
VUE_APP_IMGAPI='https://xxxxxxxxx'
VUE_APP_WEBSOCKET='wss://xxxxxxxxxx'

outputDir = dist

定义变量时记得要大写,更规范,统一标准。

这里这样分环境创建,后期在项目中使用时也非常方便。

控制打印:

console.log(process.env.VUE_APP_IMGAPI, process.env.VUE_APP_FLAG,"http地址")

显示结果:测试地址 dev

 

 

可以这样使用:

1.公共图片路由地址

Vue.prototype.$baseImgUrl = process.env.VUE_APP_IMGAPI + '/'

 页面中使用:

this.imgCard = this.$baseImgUrl + res.data;

 

2.  定义分享图片

Vue.prototype.$shareImageUrl = process.env.VUE_APP_NAME == "test" ? process.env.VUE_APP_IMGAPI+"/group1/M00/00/0D/JIZPL2L7PN2AMqN3AABNyC-hiVg621.png" : process.env.VUE_APP_IMGAPI+"/group1/M00/00/43/dD68XmL7PWKAJPfBAABNyC-hiVg044.png";

3.环境判断

if (process.env.NODE_ENV === 'production') {
    //正式环境处理
}

4.api接口

let url = process.env.VUE_APP_API
//  登录
export const login = (res) => {
    return reqNull("post", url + "/appuser/getUserLogin", res)
}

5.vue.config.js

module.exports = {
    publicPath: process.env.NODE_ENV === "production" ? "./" : "./", // 部署应用时的根路径(默认'/'),也可用相对路径(存在使用限制)
    outputDir: process.env.outputDir, //process.env.outputDir 运行时生成的生产环境构建文件的目录
}

打包处理

分环境配置之后,还有一个非常重要的功能,就是关心的打包处理,这样配置会不会打包之后地址报错,当然这样配置是没有问题的,反而会对项目的优化是非常好的。

首先要在package.json配置:

{
  "name": "sends",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint",
    "test": "vue-cli-service build --mode test",
    "report": "vue-cli-service build --report"
  },

....
}

测试包:

npm run test

正式包:

npm run build

 

运行结果:

 

打包配置处理(扩展) 

vue.config.js

代理方式配置:前端解决跨域 

多个地址配置

模块重命名

gzip压缩配置

打包文件输出重构:这里也可作为解决缓存的一种方式

移动端适配配置

插件移除

// 在vue-config.js 中加入
const Timestamp = new Date().getTime();
const CompressionWebpackPlugin = require('compression-webpack-plugin');
const productionGzipExtensions = ['js', 'css'];
const isProduction = process.env.NODE_ENV === 'production';
module.exports = {
    publicPath: process.env.NODE_ENV === "production" ? "./" : "./", // 部署应用时的根路径(默认'/'),也可用相对路径(存在使用限制)
    outputDir: process.env.outputDir, //process.env.outputDir 运行时生成的生产环境构建文件的目录(默认''dist'',构建之前会被清除)
    assetsDir: "static", //放置生成的静态资源(s、css、img、fonts)的(相对于 outputDir 的)目录(默认'')
    lintOnSave: false, // 是否开启eslint保存检测
    productionSourceMap: false, // 是否在构建生产包时生成sourcdeMap
    devServer: {
        /* 本地ip地址 */
        host: "0.0.0.0",
        port: "8902",
        hot: true,
        /* 自动打开浏览器 */
        open: false,
        overlay: {
            warning: false,
            error: true
        }, // 错误、警告在页面弹出
        /* 跨域代理 */
        proxy: {
            "/api": {
                /* 目标代理服务器地址 */
                target: process.env.VUE_APP_API,
                // target: "http://192.168.101.99:9010",
                // target: "http://116.62.188.99:9010",
                // target: "cytestback.xxxxx.com",
                /* 允许跨域 */
                changeOrigin: true,
                ws: true,
                pathRewrite: {
                    "^/api": ""
                }
            }, 
            "/video": {
                /* 监控视频代理服务器地址 */
                target: "https://box.xxxx.com",
                /* 允许跨域 */
                changeOrigin: true,
                ws: true,
                pathRewrite: {
                    "^/video": ""
                }
            }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
        }
    },
    configureWebpack: config => {
        if (isProduction) {
            config.plugins.push(new CompressionWebpackPlugin({
                algorithm: 'gzip',
                test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'),
                threshold: 10240,
                minRatio: 0.8
            }))
        }
        config["externals"] = {
            'AMap': 'AMap',
            'vue': 'Vue',
            'vue-router': 'VueRouter',
            'vuex':'Vuex',
            'axios':'axios'
        }
        config["performance"] = {
            hints: 'warning',
            // 入口起点的最大体积 整数类型(以字节为单位)
            maxEntrypointSize: 50000000,
            // 生成文件的最大体积 整数类型(以字节为单位 300k)
            maxAssetSize: 30000000,
            // 只给出 js 文件的性能提示
            assetFilter: function (assetFilename) {
                return assetFilename.endsWith('.js')
            }
        },
        // 输出重构
        config.output.filename = `js/[name].${Timestamp}.js`
		config.output.chunkFilename = `js/[name].${Timestamp}.js`
        
    },
    css: {
        // sourceMap: false,
        loaderOptions: {
            postcss: {
                plugins: [
                    require('postcss-plugin-px2rem')({
                        rootValue: 75, //换算基数, 默认100  ,这样的话把根标签的字体规定为1rem为50px,这样就可以从设计稿上量出多少个px直接在代码中写多上px了。
                        // unitPrecision: 5, //允许REM单位增长到的十进制数字。
                        //propWhiteList: [],  //默认值是一个空数组,这意味着禁用白名单并启用所有属性。
                        // propBlackList: [], //黑名单
                        exclude: /(node_module)/, //默认false,可以(reg)利用正则表达式排除某些文件夹的方法,例如/(node_module)/ 。如果想把前端UI框架内的px也转换成rem,请把此属性设为默认值
                        // selectorBlackList: [], //要忽略并保留为px的选择器
                        // ignoreIdentifier: false,  //(boolean/string)忽略单个属性的方法,启用ignoreidentifier后,replace将自动设置为true。
                        // replace: true, // (布尔值)替换包含REM的规则,而不是添加回退。
                        mediaQuery: false, //(布尔值)允许在媒体查询中转换px。
                        minPixelValue: 3 //设置要替换的最小像素值(3px会被转rem)。 默认 0
                    }),
                ]
            }
        },
        extract: {
			filename: `css/[name].${Timestamp}.css`,
			chunkFilename: `css/[name].${Timestamp}.css`
		}
    },
    chainWebpack:config => {
        // console.log(config,'chainWebpack');
        // 移除prefetch插件
        config.plugins.delete("prefetch");
        config.plugins.delete('preload');
        // config.module
        // .rule('min-image')
        // .test(/\.(png|jpe?g|gif)(\?.*)?$/)
        // .use('image-webpack-loader')
        // .loader('image-webpack-loader')
        // .options({ disable: process.env.NODE_ENV == 'development' ? true : false })
        // .end();
    }
}

⭐️⭐️⭐️  作者:船长在船上
🚩🚩🚩  主页:来访地址船长在船上的博客
🔨🔨🔨  简介:CSDN前端领域博客专家,CSDN前端领域优质创作者,资深前端开发工程师,专注web前端领域开发,在CSDN分享工作中遇到的问题以及问题解决方法和对项目开发的实际案例总结以及新技术的认识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/37659.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计问卷调查有哪些技巧?

调查问卷可以很好地帮助我们进行市场调研,所以想要做出一份有效的调查问卷,首先要确定问卷的主题。明确的主题就是定基调,可以让我们的后续过程更加顺利。然后我们再开始进行题目的设置和问卷的设计等动作。不过,在问卷设计的过程…

【js】【爬虫】fetch + sessionStorage 快速搭建爬虫环境及各种踩坑

文章目录导读需求开发环境fetch介绍为什么选择fetchfetch的封装使用数据存储数据访问封装多页面处理方案数据过大,拆分处理参考资料导读 需求 一说爬虫,很多人都会向导python,不过,真正省心的方案,应当是通过js控制获…

Reactive源码分析

Reactive用来绑定引用数据类型, 例如对象和数组等,实现响应式。 Reactive API 接口 export function reactive<T extends object>(target: T): UnwrapNestedRefs<T>相关API包括readonly、createReactiveObject、shallowReadonly、isReactive、toReactive。源码运…

Eureka注册中心

文章目录一、认识服务提供者和服务调用者二、Eureka 的工作流程三、服务调用出现的问题及解决方法四、搭建 eureka-server五、注册 user-service、order-service六、在 order-service 完成服务拉取&#xff08;order 模块能访问 user 模块&#xff09;七、配置远程服务调用八、…

从入门到进阶!当下火爆的大数据技术及算法怎么还能不知道 一起来学习互联网巨头的大数据架构实践!

大数据被称为新时代的黄金和石油&#xff0c;相关技术发展迅猛,所应用的行业也非常广泛&#xff0c;从传统行业如医疗、教育、金融、旅游&#xff0c;到新兴产业如电商、计算广告、可穿戴设备、机器人等。大数据技术更是国家科技发展和智慧城市建设的基础。 当前“互联网”新业…

骨传导耳机是怎么传声的?骨传导耳机会伤害耳朵吗?

作为一个耳机发烧友&#xff0c;平时最喜欢的就是捣鼓耳机。这几年入手了几十款耳机&#xff0c;头戴式、入耳式、半入耳、有线无线都会接触一些来玩&#xff0c;其中还有骨传导耳机这个相对小众的款类。 说到骨传导耳机&#xff0c;我应该算是最早一批的用户了&#xff0c;很…

web网页设计—— 指环王:护戒使者(13页) 电影网页设计 在线电影制作 个人设计web前端大作业

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

数据结构-ArrayList解析和实现代码

arrayList结构的实现是数组结构&#xff0c;数组没有扩容机制&#xff0c;arrayList的扩容机制采用的是复制数组&#xff0c;了解你会发现ArrayList虽然实现比较简单&#xff0c;但是设计还是很巧妙的。咱们先来简单实现下.. 咱们看下定义的全局变量 1.默认初始化空间为10&am…

docker 安装 Jenkins

一、Jenkins 安装 增加挂载目录和权限 # 增加挂载目录和权限mkdir /workspace/jenkins_homechown -R 1000:1000 /workspace/jenkins_home/创建容器 docker run --name jenkins -d \ -p 9999:8080 \ -p 8888:8888 \ -p 50000:50000 \ -v /workspace/jenkins_home:/var/jenkins…

[附源码]java毕业设计智慧教室预约

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

java检验mp4文件完整性的一个方法:使用ffmpeg

问题引入 最近笔者在写一个多线程下载视频文件的程序&#xff0c;打算让这个程序在我的空闲服务器上运行&#xff0c;但是几轮测试之后发现&#xff0c;有时候会存在下载的视频文件不完整的情况&#xff0c;这就导致了有些文件无法正常播放 问题排查 经过一周的排查后&#…

小白学流程引擎-FLowable(一) —FLowable是什么

小白学流程引擎-FLowable(一) | FLowable是什么 一、什么是流程引擎&#xff1f; 通俗的说&#xff0c;流程引擎就是多种业务对象在一起合作完成某件事情的步骤&#xff0c;把步骤变成计算机能理解的形式就是流程引擎。 流程引擎&#xff0c;用来驱动业务按照设定的固定流程…

《Kafka 源码实战》看完面试不慌!

Kafka 一开始是 LinkedIn 公司开发的消息队列&#xff0c;随着 Kafka 代码被贡献给 Apache 软件基金会后&#xff0c;就成功孵化成 Apache 顶级项目&#xff0c;世界上有越来越多的公司和个人开始使用 Kafka&#xff0c;所以 Kafka 使用的范围是很普遍的。 同时&#xff0c;值得…

vue实现文件上传压缩优化处理

vue js实现文件上传压缩优化处理 两种方法 &#xff1a; 第1种是借助canvas的封装的文件压缩上传第2种&#xff08;扩展方法&#xff09;使用compressorjs第三方插件实现 目录 vue js实现文件上传压缩优化处理 借助canvas的封装的文件压缩上传 1.新建imgUpload.js 2.全局引…

grafana变量使用

注&#xff1a;基于Grafana v8.3.6编写 1 添加变量 在dashboard界面点击setting&#xff0c;就能进入设置页面&#xff0c; 再点击Variables tab&#xff0c;就可以添加变量 比如我们添加一个系统架构的变量&#xff0c;用于区分Linux和Windows系统&#xff0c;通过node_una…

这可能是2022年把微服务讲的最全了:SpringBoot+Cloud+Docker

前言 最近几年&#xff0c;微服务可谓是大行其道。在业务模型不完善&#xff0c;超大规模流量的冲击的情况下&#xff0c;许多企业纷纷抛弃了传统的单体架构&#xff0c;拥抱微服务。这种模式具备独立开发、独立部署、可扩展性、可重用性的优点的同时&#xff0c;也带来这样一…

【云原生】K8S master节点更换IP以及master高可用故障模拟测试

文章目录一、前言二、配置 多个master 节点1&#xff09;节点信息1&#xff09;安装docker或containerd2&#xff09;安装kubeadm&#xff0c;kubelet和kubectl1、配置k8s yum源2、修改sandbox_image 镜像源3、配置containerd cgroup 驱动程序systemd4、开始安装kubeadm&#x…

SpringBoot SpringBoot 原理篇 1 自动配置 1.7 bean 的加载方式【五】

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇1 自动配置1.7 bean 的加载方式【五】1.7.1 register1 自动配置 1.7 bean 的…

FAIRNESS IN MACHINE LEARNING: A SURVEY 阅读笔记

论文链接 刚读完一篇关于机器学习领域研究公平性的综述&#xff0c;这篇综述想必与其有许多共通之处&#xff0c;重合部分不再整理笔记&#xff0c;可详见上一篇论文的笔记&#xff1a; A Survey on Bias and Fairness in Machine Learning 阅读笔记_Catherine_he_ye的博客 S…

红队隧道加密之MSF流量加密(二)

前言 如今大多数企业的内网都部署了流量审计服务, 用来专门分析流量特征, 比如后门特征和行为特征 若直接使用Metasploit对内网进行横向渗透, 其产生的流量会很容易被内网防护工具检测出来, 因此需对流量进行加密来绕过检测 这里介绍使用OpenSSL对MSF流量进行加密 演示步骤 …