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

本文主要解决

①.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字符串,不利于版本控制

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

您可能感兴趣的文章:

  • 详解vue-cli与webpack结合如何处理静态资源
(0)

相关推荐

  • 详解vue-cli与webpack结合如何处理静态资源

    处理静态资源 你也许会注意到vue-cli与webpack结合的项目中,我们通常会有两个静态资源的路径:src/assets和static/,他们两者的区别是什么呢? 打包的资源 为了回答这个问题,我们首先要明白Webpack是如何处理静态资源的.在*.vue组件里,所有的templates和CSS模块都被vue-html-loader和css-loader解析来查找路径URL. 举个例子,在<img src"./logo.png">和背景background: url(.

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

    本文主要解决 ①.vue-cli默认配置打包后部署至特定路径下静态资源路径错误问题; ②.静态资源打包使用相对路径后css文件引入大图片路径错误问题. 1.问题 vue-cli 脚手架生成的默认打包配置文件情况下运行 npm run build 打包后,部署项目至特定路径下:如: //ip:port/public/springActivity/ 此时访问: http://ip:port/public/springActivity/index.html index.html 可以正常访问,但是引用

  • 详解Vue项目的打包方式(生成dist文件)

    目录 一.相关配置 情况一(使用的工具是 vue-cil) 情况二(使用的工具是 webpack) 二.打包 一.相关配置 情况一(使用的工具是 vue-cil) 如果是用 vue-cli 创建的项目,则项目目录中没有 config 文件夹,所以我们需要自建一个配置文件:在根目录 src 下创建文件 vue.config.js,需注意文件名称必须是 vue.config.js,然后在文件中插入以下代码: //打包配置文件 module.exports = { assetsDir: 'static

  • 详解Vue+elementUI build打包部署后字体图标丢失问题

    错误描述: Vue+elementUI  build打包部署后字体图标丢失,控制台显示文件element-icons.woff和element-icons.ttf文件404 错误展现: 控制台报错截图 dom渲染展示 解决方法: webpack module配置:(build目录下webpack.base.conf.js) module: { rules: [ ...(config.dev.useEslint ? [createLintingRule()] : []), { test: /\.(

  • 详解js静态资源文件请求的处理

    本文实例为大家分享了js静态资源文件请求的处理,供大家参考,具体内容如下 html文件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <link rel="stylesheet" href="index.css" type=

  • 详解nginx静态资源服务器简单配置

    传统的web项目,一般都将静态资源存放在 webroot的目录下,这样做很方便获取静态资源,但是如果说web项目很大,用户很多,静态资源也很多时,服务器的性能 或许就会很低下了.这种情况下一般都会需要一个静态资源的服务器. 搭建nginx服务器首先得安装nginx服务,关于nginx服务的安装可以参考我的另一篇博客<nginx服务安装>这里直接介绍静态服务器的配置 进入nginx安装目录的conf目录下,修改nginx.conf文件,在一个server{}中添加 一个location 部分配置

  • 详解Vue微信公众号开发踩坑全记录

    本文介绍了Vue微信公众号开发踩坑全记录,分享给大家,也给自己留个笔记. 需求 微信授权登录(基于公众号的登录方案) 接入JS-SDK实现图片上传,分享等功能 现状及难点 采用的Vue框架,前后端分离模式(vue工程仅作为客户端),用户通过域名访问的是客户端,但是微信授权中涉及签名和token校验依赖服务端 JS-SDK需要向服务端获取签名,且获取签名中需要的参数包括所在页面的url,但由于单页应用的路由特殊,其中涉及到IOS和android微信客户端浏览器内核的差异性导致的兼容问题 解决方案

  • 详解Vue项目的打包方式

    目录 一.相关配置 情况一(使用的工具是 vue-cil) 情况二(使用的工具是 webpack) 二.打包 总结 一.相关配置 情况一(使用的工具是 vue-cil) 如果是用 vue-cli 创建的项目,则项目目录中没有 config 文件夹,所以我们需要自建一个配置文件:在根目录 src 下创建文件 vue.config.js,需注意文件名称必须是 vue.config.js,然后在文件中插入以下代码: //打包配置文件 module.exports = { assetsDir: 'sta

  • 详解vue页面首次加载缓慢原因及解决方案

    第一次打包vue的项目部署到服务器下时,发现初次加载特别的缓慢,将近20s页面才加载出来,完全没有开发环境上的那么流畅.主要原因是页面在打包后如果不进行相关配置会导致资源文件特别的大,一次想要全部加载完成会特别的耗时.这里简单总结一下自己用到的一些优化的方案. 首先我们可以安装webpack-bundle-analyzer 插件,通过这个插件我们可以在打包的时候看到打包文件的大小,可以明显的看出哪些文件比较大. 解决方案一 1,去掉编译文件中map文件.在编译好后,我们会看到文件夹下有特别多的.

  • 详解vue 在移动端体验上的优化解决方案

    去年年底自己搭了一个vue在移动端的开发框架,感觉体验不是很好.上个星期又要做移动端的项目了.所以我花了两天时间对之前的那个开发框架做了以下优化 自定义vuex-plugins-loading 路由切换动画 + keep alive 动态管理缓存组件 better-scroll与vue的最佳实践(better-scroll的vue化) 自定义指令(vue-finger:包括点击,长按,双击,拖拽移动,多点触控,滑动,旋转,缩放手势) 移动端适配方案 如何分情况处理页面置顶 路由懒加载 自定义 v

  • 详解vue项目接入微信JSSDK的坑

    用于记录接入微信JS-SDK的坑,以后方便查询 第一次接入公众号微信支付.分享.定位等等的坑的时候,心里是迷茫而又恐惧.因为,听说坑特别多,后来发现自己的亲身体验到了这一点. 支付的坑 1.当前URL未注册 问题: 微信公众号H5调起支付时,点击支付按钮出现"当前页面的URL未注册"的提示. 解决办法:由于2017年8月1日微信官方把关于支付的信息转移到了商户平台:公众平台微信支付公众号支付授权目录.扫码支付回调URL配置入口已于8月1日迁移至商户平台(pay.weixin.qq.co

随机推荐