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 相关文章推荐
让 JavaScript 轻松支持函数重载 (Part 2 - 实现)
Aug 04 Javascript
30个精美的jQuery幻灯片效果插件和教程
Aug 23 Javascript
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
Jan 11 Javascript
Javascript合并表格中具有相同内容单元格示例
Aug 11 Javascript
javascript同步服务器时间和同步倒计时小技巧
Sep 24 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
Nov 24 Javascript
利用JS屏蔽页面中的Enter按键提交表单的方法
Nov 25 Javascript
微信小程序 本地数据存储实例详解
Apr 13 Javascript
vue小图标favicon不显示的解决方案
Sep 19 Javascript
JavaScript实现多重继承的方法分析
Jan 09 Javascript
对vue 键盘回车事件的实例讲解
Aug 25 Javascript
详解Vue底部导航栏组件
May 02 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
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
JavaScript中两个感叹号的作用说明
2011/12/28 Javascript
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
2012/08/14 Javascript
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
jquery插件制作 表单验证实现代码
2012/08/17 Javascript
jquery Mobile入门—外部链接切换示例代码
2013/01/08 Javascript
Js 正则表达式知识汇总
2014/12/02 Javascript
基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理
2016/05/12 Javascript
AngularJS实现标签页的两种方式
2016/09/05 Javascript
easyui datebox 时间限制,datebox开始时间限制结束时间,datebox截止日期比起始日期大的实现代码
2017/01/12 Javascript
Vue渲染过程浅析
2019/03/14 Javascript
vue前后分离调起微信支付
2019/07/29 Javascript
一步一步实现Vue的响应式(对象观测)
2019/09/02 Javascript
js canvas实现星空连线背景特效
2019/11/01 Javascript
vue 开发之路由配置方法详解
2019/12/02 Javascript
JS如何操作DOM基于表格动态展示数据
2020/10/15 Javascript
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
浅谈python 四种数值类型(int,long,float,complex)
2016/06/08 Python
Python3利用SMTP协议发送E-mail电子邮件的方法
2017/09/30 Python
Python探索之爬取电商售卖信息代码示例
2017/10/27 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
2018/10/29 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
python实现按首字母分类查找功能
2019/10/31 Python
基于Python计算圆周率pi代码实例
2020/03/25 Python
django实现后台显示媒体文件
2020/04/07 Python
python 检测nginx服务邮件报警的脚本
2020/12/31 Python
意大利男装网店:Vrients
2019/05/02 全球购物
C++是不是类型安全的
2014/02/18 面试题
房地产销售计划书
2014/01/10 职场文书
校园达人秀策划书
2014/01/12 职场文书
瘦西湖导游词
2015/02/03 职场文书
离婚起诉书范本
2015/05/18 职场文书
甲午大海战观后感
2015/06/02 职场文书
2015年教导处教学工作总结
2015/07/22 职场文书
500字作文之关于爸爸
2019/11/14 职场文书
Oracle删除归档日志及添加定时任务
2022/06/28 Oracle