详解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 相关文章推荐
jQuery+ajax实现顶一下,踩一下效果
Jul 17 Javascript
如何获取网站icon有哪些可行的方法
Jun 05 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
Oct 28 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
Dec 10 Javascript
简述AngularJS相关的一些编程思想
Jun 23 Javascript
JavaScript检测字符串中是否含有html标签实现方法
Jul 01 Javascript
javascript中setInterval的用法
Jul 19 Javascript
基于JavaScript实现生成名片、链接等二维码
Sep 20 Javascript
基于jQuery日历插件制作日历
Mar 11 Javascript
AngularJs表单验证实例代码解析
Nov 29 Javascript
jQuery常用选择器详解
Jul 17 jQuery
js在HTML的三种引用方式详解
Aug 29 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中include()与require()的区别说明
2010/03/10 PHP
PHP截取指定图片大小的方法
2014/12/10 PHP
php批量转换文件夹下所有文件编码的函数类
2017/08/06 PHP
不用AJAX和IFRAME,说说真正意义上的ASP+JS无刷新技术
2008/09/25 Javascript
JavaScript声明变量时为什么要加var关键字
2014/09/29 Javascript
node.js中的fs.symlink方法使用说明
2014/12/15 Javascript
js实现单击图片放大图片的方法
2015/02/17 Javascript
jQuery命名空间与闭包用法示例
2017/01/12 Javascript
基于vue.js实现侧边菜单栏
2017/03/20 Javascript
jQuery实现在HTML文档加载完毕后自动执行某个事件的方法
2017/05/08 jQuery
分析JavaScript数组操作难点
2017/12/18 Javascript
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
2018/09/03 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
vue自动路由-单页面项目(非build时构建)
2019/04/30 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
2019/08/20 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
2019/11/06 Javascript
JavaScript实现轮播图特效
2020/04/10 Javascript
Python中的测试模块unittest和doctest的使用教程
2015/04/14 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
2019/06/21 Python
Django使用Jinja2模板引擎的示例代码
2019/08/09 Python
python实现异常信息堆栈输出到日志文件
2019/12/26 Python
新西兰第一的行李箱网站:luggage.co.nz
2019/07/22 全球购物
.NET初级开发工程师面试题
2014/04/18 面试题
HR喜欢的自荐信格式
2013/10/08 职场文书
酒店经理职责
2014/01/30 职场文书
保密普查工作实施方案
2014/02/25 职场文书
领导接待方案
2014/03/13 职场文书
个人委托书怎么写
2014/04/04 职场文书
十佳青年事迹材料
2014/08/21 职场文书
2015年纪念“卢沟桥事变”78周年活动方案
2015/05/06 职场文书
孔子观后感
2015/06/08 职场文书
2016应届大学生自荐信模板
2016/01/28 职场文书
商业计划书格式、范文
2019/03/21 职场文书
Java 数组内置函数toArray详解
2021/06/28 Java/Android
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技