vue-cli脚手架打包静态资源请求出错的原因与解决


Posted in Javascript onJune 06, 2019

问题

  1. vue-cli默认配置打包后部署到特定路径下静态资源路径错误问题。
  2. 静态资源打包使用相对路径后css文件引入大图片路径错误问题

使用vue-cli2脚手架生成的默认打包配置文件,npm run build打包,部署项目到特定路径下://ip:port/test/index.html
此时访问//ip:port/test/index.html可以正常访问,但是引用的js和css等文件服务器响应为404,此时我们查看资源请求路径:

http://ip:port/static/css/app.[hash].css
http://ip:port/static/js/app.[hash].js

可以看出,上面的静态资源访问路径是不正确的,我们正确的请求路径应该是

http://ip:port/test/static/css/app.[hash].css
http://ip:port/test/static/js/app.[hash].js

原因

可以看出导致资源加载失败的原因是路径错误,我们可以移步看看index.html文件,

<!DOCTYPE html>
 <html>
 <head>
 <title>project</title>
 <link href=/static/css/app.css rel=stylesheet>
 </head>
 <body>
 <div id=app></div>
 <script type=text/javascript src=/static/js/app.js>
 </script>
 ...
 </body>
 </html>

可以看出引入的css和js都是使用的绝对根目录路径,因此将项目部署到特定目录下,其引入的资源路径无法被正确解析。

解决

在webpack打包时,使用相对路径来处理静态资源,修改build中资源发布路径配置(build/config.js);

build: {
 ...
 // Paths
 assetsRoot: path.resolve(__dirname, '../dist'),
 assetsSubDirectory: 'static',
 assetsPublicPath: './',
 ...
}

将assetsPublicPath: '/',更改为assetsPublicPath: './',再进行打包,并将资源部署到特定路径下,然后访问,此时index.html可以正常访问,同时js和css资源也可以正常加载访问了。

css中引入assets目录下的图片资源出错

我们经常这样引用一个img图片

background: url('static/img/bg.png');

但是打包后看到这个图片的引用地址是这样的。

http://ip:port/test/static/css/static/img/bg.png

可以看出css中图片的路径存在问题了,分析打包过程,css是在js中引入的或是写在vue文件中的,css文件首先被less,postcss等处理,处理后会被ExtractTextPlugin处理,ExtractTextPlugin将js中的css全部抽离至app.css文件中。

解决方法一

将options.extract设置为false

options.extract: false,

关闭抽离css功能,再次打包并部署,此时你会发现没有css文件了,css文件全部在app.js文件中,通过js将css注入到index.html文件中,此时图片的访问路径是相当index.html文件的,所以可以正常访问

解决方案二

设置ExtractTextPlugin插件中的publicPath
ExtractTextPlugin插件是为了将css从js文件中抽离出来,我们可以通过配置ExtractTextPlugin的静态资源路径参数来达到同样的效果,build目录下的utils.js文件,修改publicPath: '../../';

// Extract CSS when that option is specified
// (which is the case during production build)
if (!options.extract) {
 return ExtractTextPlugin.extract({
 use: loaders,
 fallback: 'vue-style-loader',
 publicPath: '../../'
 })
} else {
 return ['vue-style-loader'].concat(loaders)
}

再次打包部署,发现此时的图片访问路径为'../../static/img/bg.png';

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JS 判断代码全收集
Apr 28 Javascript
起点页面传值js,有空研究学习下
Jan 25 Javascript
jQuery插件 tabBox实现代码
Feb 09 Javascript
js处理php输出时间戳对不上号的解决方法
Jun 20 Javascript
深入理解javascript构造函数和原型对象
Sep 23 Javascript
JavaScript判断是否是微信浏览器
Jun 13 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
Oct 21 Javascript
原生js实现中奖信息无间隙滚动效果
Jan 18 Javascript
基于zTree树形菜单的使用实例
Dec 25 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
Mar 02 Javascript
JavaScript刷新页面的几种方法总结
Mar 28 Javascript
在vue中使用echarts(折线图的demo,markline用法)
Jul 20 Javascript
详解vue-cli@2.x项目迁移日志
Jun 06 #Javascript
详解新手使用vue-router传参时注意事项
Jun 06 #Javascript
vue-cli配置全局sass、less变量的方法
Jun 06 #Javascript
解决vue组件props传值对象获取不到的问题
Jun 06 #Javascript
webpack4之如何编写loader的方法步骤
Jun 06 #Javascript
vue 插件的方法代码详解
Jun 06 #Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
Jun 06 #jQuery
You might like
咖啡的化学
2021/03/03 咖啡文化
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
2012/06/07 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
VBScript版代码高亮
2006/06/26 Javascript
javascript document.referrer 用法
2009/04/30 Javascript
在多个页面使用同一个HTML片段《续》
2011/03/04 Javascript
ASP.NET MVC中EasyUI的datagrid跨域调用实现代码
2012/03/14 Javascript
CSS鼠标响应事件经过、移动、点击示例介绍
2013/09/04 Javascript
基于Jquery实现键盘按键监听
2014/05/11 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
node模块机制与异步处理详解
2016/03/13 Javascript
js Canvas实现的日历时钟案例分享
2016/12/25 Javascript
Node.js连接MongoDB数据库产生的问题
2017/02/08 Javascript
基于HTML5+JS实现本地图片裁剪并上传功能
2017/03/24 Javascript
JavaScript判断浏览器和hack滚动条的写法
2017/07/23 Javascript
基于jQuery实现的单行公告活动轮播效果
2017/08/23 jQuery
微信小程序实现随机验证码功能
2018/12/20 Javascript
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
2020/12/25 Vue.js
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
Python实现控制台进度条功能
2016/01/04 Python
python中的内置函数max()和min()及mas()函数的高级用法
2018/03/29 Python
python+selenium实现简历自动刷新的示例代码
2019/05/20 Python
python创建与遍历List二维列表的方法
2019/08/16 Python
使用浏览器访问python写的服务器程序
2019/10/10 Python
Python暴力破解Mysql数据的示例
2020/11/09 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
2021/01/12 Python
html5如何及时更新缓存文件(js、css或图片)
2013/06/24 HTML / CSS
美国蔬菜和植物种子公司:Burpee
2017/02/01 全球购物
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
英国知名美妆护肤在线商城:Zest Beauty
2018/04/24 全球购物
介绍一下JNDI的基本概念
2013/07/26 面试题
艺术应用与设计专业个人的自我评价
2013/11/19 职场文书
护理专业自荐信范文
2014/02/26 职场文书
节水倡议书
2015/01/19 职场文书
redis实现排行榜功能
2021/05/24 Redis
小程序实现侧滑删除功能
2022/06/25 Javascript