详解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 相关文章推荐
Javascript调试工具(下载)
Jan 09 Javascript
javascript入门·图片对象(无刷新变换图片)\滚动图像
Oct 01 Javascript
js常见表单应用技巧
Jan 09 Javascript
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
Jul 08 Javascript
使用js显示当前时间示例
Mar 02 Javascript
jQuery中ready事件用法实例
Jan 19 Javascript
Javascript writable特性介绍
Feb 27 Javascript
jQuery实现带有上下控制按钮的简单多行滚屏效果代码
Sep 04 Javascript
jquery.picsign图片标注组件实例详解
Feb 02 jQuery
node前端模板引擎Jade之标签的基本写法
May 11 Javascript
vue组件之间通信实例总结(点赞功能)
Dec 05 Javascript
vue登录注册实例详解
Sep 14 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
第1次亲密接触PHP5(1)
2006/10/09 PHP
PHP 程序员也要学会使用“异常”
2009/06/16 PHP
分享一个PHP数据流应用的简单例子
2012/06/01 PHP
PHP中使用php5-ffmpeg撷取视频图片实例
2015/01/07 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
2016/11/29 PHP
php array_map()函数实例用法
2021/03/03 PHP
Javascript 面向对象 对象(Object)
2010/05/13 Javascript
jquery插件制作 手风琴Panel效果实现
2012/08/17 Javascript
Javascript代码实现仿实例化类
2015/04/03 Javascript
javascript实现获取字符串hash值
2015/05/10 Javascript
javascript原型模式用法实例详解
2015/06/04 Javascript
JavaScript数据库TaffyDB用法实例分析
2015/07/27 Javascript
js调用百度地图及调用百度地图的搜索功能
2015/09/07 Javascript
RequireJS入门一之实现第一个例子
2015/09/30 Javascript
BootStrap3使用错误记录及解决办法
2016/12/22 Javascript
JS排序之冒泡排序详解
2017/04/08 Javascript
vue通过点击事件读取音频文件的方法
2018/05/30 Javascript
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
JQuery样式操作、click事件以及索引值-选项卡应用示例
2019/05/14 jQuery
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
2019/09/24 Javascript
[48:21]林俊杰圣堂刺客超神杀戮秀
2014/10/29 DOTA
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
python利用MethodType绑定方法到类示例代码
2017/08/27 Python
使用python批量修改文件名的方法(视频合并时)
2020/03/24 Python
Python logging日志模块 配置文件方式
2020/07/12 Python
一份Java笔试题
2012/02/21 面试题
实习期自我鉴定
2013/10/11 职场文书
皮肤科医师岗位职责
2013/12/04 职场文书
运动会通讯稿300字
2014/02/02 职场文书
人力资源部经理岗位职责规定
2014/02/23 职场文书
2014教师党员个人自我评议
2014/09/20 职场文书
优秀班主任申报材料
2014/12/16 职场文书
整理Python中常用的conda命令操作
2021/06/15 Python
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
2022/07/15 Servers
css弧边选项卡的项目实践
2023/05/07 HTML / CSS