详解vue静态资源打包中的坑与解决方案


Posted in Javascript onFebruary 05, 2018

本文主要解决

①.vue-cli默认配置打包后部署至特定路径下静态资源路径错误问题;

②.静态资源打包使用相对路径后css文件引入大图片路径错误问题。

1、问题

vue-cli 脚手架生成的默认打包配置文件情况下运行 npm run build 打包后,部署项目至特定路径下:如:

//ip:port/public/springActivity/

此时访问:

http://ip:port/public/springActivity/index.html

index.html 可以正常访问,但是引用的js,css等文件服务器响应均为404,查看引入的资源路径如下:

http://ip:port/static/css/app.cea07642cd24c0d7a5c4b9b7afc7ff64.css
http://ip:port/static/js/app.815851e87b083afb82bf.js

2、分析

由上可以看出是资源打包路径有误,打包后的资源使用了绝对根目录路径,因此将项目部署到特定目录下,其引入的资源路径无法被正确解析。

3、解决

在打包时需要使用相对路径来处理静态资源,更改build中资源发布路径配置(config/index.js, build对象):

将 assetsPublicPath: '/'  改为  assetsPublicPath: './',
再次打包,并将资源部署到特定路径下,然后访问:

此时index.html可以正常访问,同时js和css资源也可以正常访问,但是css中引入的assets目录下的大图片资源出错了(服务端404)

4. 再分析

查看引入的图片资源路径如下:

http://ip:port/public/springActivity/static/css/static/img/question_bg.61a2825.png

实际项目中资源路径如下:

index.html
static/
 |--js/
  |--*.js
 |--css/
  |--*.css
 |--img/
  |--*.png

很明显图片引入路径有误。分析图片引入路径,发现路径均多了"/static/css"两层目录,猜测是css目录下的css文件引入图片路径为"/static/img/question_bg.61a2825.png" , 查看css文件,css中引入图片路径如下:

background:url(static/img/question_bg.61a2825.png)

5、在解决

css文件中路径存在问题,肯定又是打包哪个环节资源路径没有配置好,分析打包过程,css是在js中引入的或是写在vue文件中的,css文件首先被less,postcss等处理,处理后会被ExtractTextPlugin处理,ExtractTextPlugin将js中的css全部抽离至app.css文件中。

首先将options.extract设为false,关闭抽离css功能,再次打包并部署至特定目录,访问:http://ip:port/public/springActivity/index.html, 啪,页面正常显示,大公即将告成。

分析打包后的文件,发现没有了css文件,发现css文件全部在app.js文件中;通过js将css注入 index.html文件中,因此css文件中引入的图片资源路径应该是相对于index.html文件路径的,即:"static/img/question_bg.61a2825.png",这与下面css文件中的图片资源路径一致,因此图片能够被正常访问。

background:url(static/img/question_bg.61a2825.png)
现在很确定知道问题出在哪了,即:ExtractTextPlugin抽离css文件时没有转换资源引入路径,导致app.css引入了相对app.css目录为"static/img/ .png"的静态资源,该路径相对index.html即为:static/css/static/img/ .png。

因此使用ExtractTextPlugin插件时还需要配置静态资源路径参数,通过查询资料,得知可以通过添加publicPath:"../../"解决该问题:

if (options.extract) {
 return ExtractTextPlugin.extract({
 use: loaders,
 fallback: 'vue-style-loader',
 publicPath:"../../"     //添加
 })
}

打包部署到特定目录下后访问index.html文件,页面一切正常,app.css文件正常引入,图片资源也正常引入,查看app.css文件引入图片资源方式如下:

background:url(../../static/img/question_bg.61a2825.png

publicPath配置后,css文件中引入的图片文件路径前添加了该路径配置;

publicPath 属性值为打包后的 app.css文件至index.html文件的相对路径

图片资源也可以直接放在vue-cli生成的static目录下规避上述问题,但是通过这种方式图片名称中无法增加md5字符串,不利于版本控制

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
FileUpload上传图片(图片不变形)
Aug 05 Javascript
in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案
Jul 26 Javascript
jquery可见性过滤选择器使用示例
Jun 24 Javascript
jQuery学习笔记之基础中的基础
Jan 19 Javascript
jQuery Mobile动态刷新页面样式的实现方法
May 28 Javascript
angularjs2中父子组件的数据传递的实例代码
Jul 05 Javascript
Javascript实现时间倒计时效果
Jul 15 Javascript
Angular指令之restict匹配模式的详解
Jul 27 Javascript
解决VUEX兼容IE上的报错问题
Mar 01 Javascript
vuex页面刷新后数据丢失的方法
Jan 17 Javascript
中级前端工程师必须要掌握的27个JavaScript 技巧(干货总结)
Sep 23 Javascript
vue3.0生命周期的示例代码
Sep 24 Javascript
理解Koa2中的async&await的用法
Feb 05 #Javascript
zTree 树插件实现全国五级地区点击后加载的示例
Feb 05 #Javascript
使用vue如何构建一个自动建站项目
Feb 05 #Javascript
在 webpack 中使用 ECharts的实例详解
Feb 05 #Javascript
在Vue中使用echarts的方法
Feb 05 #Javascript
JavaScript中Object基础内部方法图
Feb 05 #Javascript
基于axios封装fetch方法及调用实例
Feb 05 #Javascript
You might like
用PHP编写PDF文档生成器
2006/10/09 PHP
php5数字型字符串加解密代码
2008/04/24 PHP
php获取URL中带#号等特殊符号参数的解决方法
2014/09/02 PHP
php计算两个日期相差天数的方法
2015/03/14 PHP
PHP编程计算文件或数组中单词出现频率的方法
2017/05/22 PHP
phpfpm的作用和用法
2019/10/10 PHP
用JS剩余字数计算的代码
2008/07/03 Javascript
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
基于jquery创建的一个图片、视频缓冲的效果样式插件
2012/08/28 Javascript
JavaScript中Function函数与Object对象的关系
2015/12/17 Javascript
Vuex之理解Store的用法
2017/04/19 Javascript
Angular4 中常用的指令入门总结
2017/06/12 Javascript
vue+swiper实现组件化开发的实例代码
2017/10/26 Javascript
Vue如何实现响应式系统
2018/07/11 Javascript
Vue 3.0双向绑定原理的实现方法
2019/10/23 Javascript
Vue使用Ref跨层级获取组件的步骤
2021/01/25 Vue.js
[02:16]完美世界DOTA2联赛PWL S3 集锦第三期
2020/12/21 DOTA
python实现俄罗斯方块
2018/06/26 Python
Python3.6简单的操作Mysql数据库的三个实例
2018/10/17 Python
Python之循环结构
2019/01/15 Python
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
2019/06/19 Python
python匿名函数用法实例分析
2019/08/03 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
2020/05/20 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
2020/05/27 Python
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
乐高奥地利官方商店:LEGO Shop AT
2019/07/16 全球购物
儿科护士自我鉴定
2013/10/14 职场文书
函授毕业生自我鉴定
2013/11/06 职场文书
物流司机岗位职责
2013/12/28 职场文书
《二泉映月》教学反思
2014/04/15 职场文书
电子工程求职信
2014/07/17 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
2015年师德师风自我评价范文
2015/03/05 职场文书
幼儿园大班开学寄语(2015秋季)
2015/05/27 职场文书
三严三实·严以修身心得体会
2016/01/15 职场文书