Vue打包与配置问题

标签: Vue 分类: Javascript 创建时间:2019-05-31 01:33:45 更新时间:2023-10-20 11:23:26

使用vue-cli3.0,本地开发没有问题,打包出现了各种问题。

1.yarn build不起作用

这个没得说,yarn不行,那就用npm run build进行打包吧。

2.css、js等的相对路径问题

默认的配置里面,css、js等文件都是用绝对路径进行引入的,打包后浏览html可能会出现js等资源找不到的情况,所以应该在vue.config.js中添加publicPath:’./‘,baseUrl已经废弃了。

3.页面空白

相对路径也弄好了,打开html查看也把js、css等文件下载下来了,可就是页面是个空白。

找来找去,发现是route配置的mode问题,将mode的histroy模式改掉就好了。


history模式下,二级目录配置了后台,还是出现了空白。

我尝试了很多方法,比如:参考文章2:
(1) 更改路由表的base

(2) 更改vue.config.js中的assetsDir

(3) 修改nginx配置
尝试过使用try_files,和rewrite进行重写,都达不到我想要的效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
## 面试系统手机端
location /phdevicemobile {
alias /cloud/dev/PhDevice/PhDeviceMobile/dist;
#index index.html;

try_files $uri $uri/ @router;

##if (!-e $request_filename) {
## rewrite ^/(.*) /phdevicemobile/index.html last;
## break;
##}


client_max_body_size 40m;

}
location @router{
rewrite ^/(.*) /phdevicemobile/index.html last;
}

参考文章:
1.vue history模式下出现空白页情况 (这个说的简单)
2.解决Vue项目使用history模式部署到nginx服务器下,非根目录下刷新页面空白的问题 (这里讲了三步,第一步更改Vue路由表配置,第二步更改Vue打包配置,第三步最后我们来更改nginx配置)
3.Vue - history模式上线后页面空白以及404 (这个不行)
4.vue 3.0用history路由打包后出现空白页面
5.vue-router history模式下刷新404问题 (这篇文章我尝试了第一种,是可以的,但是第二种,说的不详细,而且会报循环引用的错误:rewrite or internal redirection cycle while internally redirecting to “/dist/index.html”, client: 127.0.0.1, server: , request: “GET /dist HTTP/1.1”, host: “localhost:9092”)

还有要注意的就是在路由表的最下面,增加如下的内容,指定跳转路由

1
2
3
4
5
6
{
path: '*', // 页面不存在的情况下会跳到首页
redirect: '/',
name: 'notFound',
hidden: true
}

4.vue-cli3.x二级目录的部署说明

使用vue-router的hash模式的话,页面的url地址会显得很丑,于是我就想着使用history模式。刚开始想的,就是使用后台返回前端的index.html页面,但是这样后台和前台就要打包到一起了,特别是使用java的thymeleaf模板的时候,就要把前端的页面打包到resources目录下了,这样就违背了前后端分离的模式了。后来找到了使用nginx进行配置的方式,经过尝试,我最后明白了二级目录的具体含义。

主要部署步骤如下:(需要说明的就是dist这个目录,假如二级访问目录不是dist,就应该将router和publicPath中的内容,以及nginx中的dist改为自己的二级目录,比如:phdevicemobile)

1.一级目录的配置

修改nginx配置如下所示,root直接指向index.html的目录,然后使用try_files进行重新定向。

1
2
3
4
5
6
7
8
9
10
server {
listen 9092;

index index.html index.htm;
root D:\zlc\PhDeviceManage\device-mobile\dist;
location / {
try_files $uri $uri/ /index.html;
}

}

2.配置为二级目录

(1) 修改router的base为:”/di”

(2) 修改vue.config.js中的publicPath为:”/di/“

(3) nginx配置如下:

1
2
3
4
5
6
7
8
9
10
server {
listen 9092;

index index.html index.htm;
location /di {
alias D:/zlc/PhDeviceManage/device-mobile/dist;
try_files $uri $uri/ /di/index.html;
index index.html;
}
}

其中:
(1) try_files
try_files是挨个的往后尝试,前面的$uri没有,或者是$uri/ 目录没有,就自动重定向到最后一个@router变量上。

(2) rewrite
rewrite第一个 ^/(.*) 是正则表达式,匹配全部的地址,第二个是重定向的地址,第三个last有如下的选项:

参考文章:
1.vue-router history模式 nginx配置 (这个讲的是如何再根目录下进行配置,和我的需求有些不符合,我的是在某个location下)
2.vue history模式前后端分离项目nginx配置
3.try_files指令说明
4.nginx 中 index try_files location 这三个配置项的作用 (这里对于try_files讲的很明白了)
5.Nginx中的Rewrite的重定向配置与实践 (这个要关注公众号)
6.Nginx中的rewrite指令(break,last,redirect,permanent)
7.快速掌握Nginx(二) —— Nginx的Location和Rewrite (除了rewrite,还有一些其他的变量的说明)
8.Nginx中的Rewrite的重定向配置与实践
9.HTML5 History 模式 (官网给出的例子)
10.vue-router history模式在nginx二级目录下的配置 (这篇文章最后解决了我的问题,不过有一点就是vue的配置文件:config/index.js,改为:vue.config.js;assetsPublicPath,改为publicPath)

5.Some chunks are larger than 4000 kBs after minification.

在打包的时候,出现了这个问题,意思就是把所有的代码都进行了打包到了一个文件中。给出的建议是:

【尝试】
我首先尝试了使用函数的形式,感觉这样的写法比较乱,我就没有采用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes('node_modules')) {
const arr = id.toString().split('node_modules/')[1].split('/')
switch(arr[0]) {
case '@kangc':
case '@naturefw':
case '@popperjs':
case '@vue':
case 'axios':
case 'element-plus':
return '_' + arr[0]
break
default :
return '__vendor'
break
}
}
},
chunkFileNames: 'static/js1/[name]-[hash].js',
entryFileNames: 'static/js2/[name]-[hash].js',
assetFileNames: 'static/[ext]/[name]-[hash].[ext]'
},
brotliSize: false, // 不统计
target: 'esnext',
minify: 'esbuild' // 混淆器,terser构建后文件体积更小
}

2.使用import,这个方法我没有尝试,比如使用下面的按需引入的方式进行加载。

1
2
// 引入雷达图图表,图表后缀都为 Chart
const { RadarChart } = import('echarts/charts');

3.分解块,使用函数的形式,这样就是把很多的东西弄成了一个个的小块。

1
2
3
4
5
manualChunks(id) {
if (id.includes('node_modules')) {
return id.toString().split('node_modules/')[1].split('/')[0].toString();
}
}

【解决方案】
我直接使用具名的方式解决了这个问题,比如将 mars3d 和 mars3d-cesium 进行了分块打包。

1
2
3
4
5
6
7
8
9
10
11
12
build: {
rollupOptions: {
output: {
manualChunks: {
mars3d: ['mars3d'],
'mars3d-cesium': ["mars3d-cesium"]
}
},
target: 'esnext',
minify: 'esbuild' // 混淆器,terser构建后文件体积更小
},
}
参考文章:
1.vite打包报错:块的大小超过限制,Some chunks are larger than 500kb after minification 两个解决方案:1.设置 build.chunkSizeWarningLimit。2.分解块,将大块分解成更小的块
2.动态导入
3.自定义构建
4.vite2 打包的时候vendor-xxx.js文件过大的解决方法 主要就是通过函数的形式进行区分,按照模块分开打包,大模块独立打包,小模块合并打包,这样就不会出现一大堆小文件了。
5.分析vite2.x/rollup分包原理,解决chunk碎片问题
6.记一次vite2.x打包优化过程 1.import()动态引入,我们依然可以看到把没有引入的模块打包进来了:还是可以看到 svg 渲染器、看到除了 radar 之外的组件。2.manualChunks:echarts: [‘echarts’]。3.优化legacy包,legacy的配置,是照搬其他项目的,考虑了 ie >= 11 版本的兼容。这个项目只需要考虑移动端,就可以不需要考虑 ie 了。
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。