网站子目录部署VUE webpack 打包资源文件路径的正确引用方式

news/2024/5/3 7:24:23/文章来源:https://blog.csdn.net/weixin_34032827/article/details/88954092

webpack 是目前使用最为火热的打包工具,各大知名的框架类库都用其打包,国内使用最近也火热起来。它在单页应用和类库打包上帮助许多人从代码管理中解脱了出来,成为了当下风靡一时的打包工具。

但是坑也很多,比如说图片,字体等文件的路径。

刚开始用webpack的同学很容易掉进图片打包这个坑里,比如打包出来的图片地址不对或者有的图片并不能打包进我们的目标文件夹里。明明在开发阶段都是好好的,一但发布到线上,就出现各种404,

一般来说,webpack打包的SPA程序,发布到网站的根目录下都不会出现太多问题,但是发布到网站的子目下,就会出现各种资源文件找不到的情况。

这种文件,我在以下这个知乎的帖子里曾经做过详细的回答

知乎用户:vuejs怎么在服务器部署?

似乎所有问题都解决了,但有一个问题没有解决,就是如果我在css里引了了图片资源,webpack并不能很好的处理这里面的资源路径

比如我把spa部署在 https://www.wx2share.com/m/
“m”文件夹是网站下的一个子目录,

如果我在开发的时候,写了如下css代码

.content {background: url('/static/img/1.jpg')
}

首先,我们修改(tips:我的配置文件是通过vue-cli生成的)

build: {env: require('./prod.env'),index: path.resolve(__dirname, '../dist/index.html'),assetsRoot: path.resolve(__dirname, '../dist'),assetsSubDirectory: 'static',assetsPublicPath: '/m/', //这里指定publicPath 的路径为我子目录文件名,一般默认为'/'productionSourceMap: true,},

webpack publicPath 参数是用来,帮助你为项目中的所有资源指定一个基础路径,一但设定值以后,所有代码中通过requrie 或import 方式引入的资源文件,在build以后,都回指向类似 '/m/static/xxx.xx'

比如:

logo: require('@/assets/v.png')<img :src="logo">

编译以后,

<div class="logo-warp">
<img src="/m/static/img/logo_small.f457a3f.png"> 
</div>

可以看到,webpack 已经正确的把资源文件的路径里 加上了/m ,保证了资源文件引用正确,这里顺便提一点,publicpath 还可以设置在cdn的url

如果 publicPath: 'https://cdn.youdomin.com/' 这样编译以后,src=''https://cdn.youdomin.com//static/img/logo_small.f457a3f.png 

这样你只要把static整个文件夹托管的你的cdn上就可以了非常方便。但是publicPath 一定用绝对路径,绝对路径,绝对路径(重要的事说3遍) 千万不要用相对路径,如果你把publicPath设为'./',哪你启用路由以后,https://www.wx2share.com/m/ 这样的url进入程序的,不会有问题,因为这个时候,static文件正好在当前目录下,但是当你类似用这样的网址来访问的时候 ,https://www.wx2share.com/m/sh... 资源文件又找不到了,因为这个时候./的指向的目录是

/m/show/static/ 很明显你的资源文件全在 /m/static下,所以又404了。

上面的方法基本解决了大部分的问题,唯一不能解决的就是文章开头提到的,css中引入的资源文件的问题了

通过publicpath的设置,并不到改变css中引用资源文件的路径,上面实例代码中的css编译后,还是

.content {background: url('/static/img/1.jpg') 
}

是乎webpack 并不处理css中的文件路径,这样的结果就是发布以后页面上所有通过css引入的资源文件全部不能正常显示了。前段时间我采用了一个简单又粗爆的方法来解决这个问题,哪就是,绝对不用css引入任何文件。当然你也可以手动修改webpack编译过的文件,把通过查找替换 把/static 替换为/m/static 如果你不嫌累的慌。

最近又开始了一个新的SPA应用,引入了一个第三方css,里面好多通过css引入的图片文件 ,让我不得不下定决心来解决这个问题了

TIPS: 以下内容的配置文件修改全部是基于由vue-cli生成的配置文件,如果你是用自己写的配置文件请注意区别!

我首先想到,如果开发的时候我就是指定在“m/”子目录下,不就能解决大部分问题了,这样和线上的根目录文件对应了,buid以后就不会有哪么多问题 ,

第一步:修改dev模式上的publicPath

dev: {env: require('./dev.env'),port: 8082,autoOpenBrowser: true,assetsSubDirectory: 'static',assetsPublicPath: '/m/', //把dev模式下的publicPath也设为 mproxyTable: {},cssSourceMap: false}
yarn run dev

以后,访问 http://localhost:8082/m/ 结果好么,直接给我来了个 can not get /m/

但是如果我直接访问http://localhost:8082/m/index.html 是可以的,而且功能基本正常,是就vue的router不起作用了,在浏览器地址栏里直接敲入 http://loalhost:8082/m/view/1 然后回车,这样的地址就全部404了,看来是dev sever没有把,所有链接从新定向到 /m/index.html上,但是publicPath设置是正确的了,现在要解决的问题就是,无论在浏览器地址栏里输入什么网址,都让它重定向到 /m/index.html 就可以解决所有问题了,

webpack 的dev sever 是什么,用什么来实现的,能过查看buid/dev-server.js

发现是用express 来实现web server,通过加载webpack-dev-middleware 来实现实时编译,所有请求都转发给它了,所以,在node_modules下找到它的源代码,看了老半天,看不出所以然来,只能debug了,看它到底是怎么运作的,电脑上没有调试的工具,只好,通过打log的方法来调试了。

function webpackDevMiddleware(req, res, next) {function goNext() {if(!context.options.serverSideRender) return next();return new Promise(function(resolve) {shared.ready(function() {res.locals.webpackStats = context.webpackStats;resolve(next());}, req);});}if(req.method !== "GET") {return goNext();}var filename = getFilenameFromUrl(context.options.publicPath, context.compiler, req.url);console.log(filename) //关键就是这里,只有filename不等于 false的时候才进入真正的处理阶段if(filename === false) return goNext();//下面还有好多代码,不粘贴了,
既然这里返回 false

我们进入 getFileNameFromUrl 这个函数看看,为什么会false

function getFilenameFromUrl(publicPath, outputPath, url) {var filename;console.log(publicPath, outputPath, url) //我在这里打了个log// localPrefix is the folder our bundle should be invar localPrefix = urlParse(publicPath || "/", false, true);var urlObject = urlParse(url);// publicPath has the hostname that is not the same as request url's, should failif(localPrefix.hostname !== null && urlObject.hostname !== null &&localPrefix.hostname !== urlObject.hostname) {return false;}// publicPath is not in url, so it should failif(publicPath && localPrefix.hostname === urlObject.hostname && url.indexOf(publicPath) !== 0) {return false; //就这里return false了}// strip localPrefix from the start of urlif(urlObject.pathname.indexOf(localPrefix.pathname) === 0) {filename = urlObject.pathname.substr(localPrefix.pathname.length);}if(!urlObject.hostname && localPrefix.hostname &&url.indexOf(localPrefix.path) !== 0) {return false; }// and if not match, use outputPath as filenamereturn querystring.unescape(filename ? pathJoin(outputPath, filename) : outputPath);
}

看上面代码,我在进入函数的头部打了一个log,看看传入的参数到底是什么

当我访问 http://localhost:8082/m/ 的时候 控制台里输出

发现 publicPath, outputPath, url,三个参数的值分别为:

/m/ F:workspacewx2share-pwadist /index.html

终于发现

if(publicPath && localPrefix.hostname === urlObject.hostname && url.indexOf(publicPath) !== 0) {

    return false; //就这里return false了
}

url.index.of(publicPath) !== 0 这一个条件成立了 相当于 '/index.html/'.indexOf('/m/') 肯定不会===0 啊,

但是这个‘/index.html' 这个参数的值哪里来的,回到上一段代码中,发现是req.url里传过来的,

但我明明访问的是/m/ 哪,req.url 应该等于 '/m/'啊,这是什么时候给重定向的呢,看来在这个之前,已经有过一次重定向了

回到dev-server.js文件,发现在,use devMiddlewarre 之前,还引入了一个connect-history-api-fallback的中间件,看来唯一能重定向的地方只有这里了,

app.use(require('connect-history-api-fallback')());// 服务器部署 webpack 打包的静态资源
app.use(devMiddleware);// 使用热更新, 如果编译出现错误会实时展示编译错误
app.use(hotMiddleware);

打开connect-history-api-fallback的代码,终于发现了

rewriteTarget = options.index || '/index.html';logger('Rewriting', req.method, req.url, 'to', rewriteTarget);req.url = rewriteTarget;next();
这个的代码,当你不作配置的时候,默认重定向到根目录的/index.html上,找到原因了,修改就简单了// 处理 history API 的回退情况(如果在线上环境中,也需要服务器做相应处理)
app.use(require('connect-history-api-fallback')({index: '/m/index.html'
}));

把options.index的值设为 /m/index.html 不就可以了吧,这样所有的请求,都会转发到/m/index.html了

再次打开http://localhost:8082/m/ 一切全部正常了,build以后,发现在线上,也完全正常,再也不会找不到css中引入的资源文件了

一个重点差点忘记提了

就是现在写css代码里,引入static文件中的文件,直接要写加上publicPath的路径,

就是原来写成

.content {background: url('/static/img/1.jpg')
}

要在编码阶段全部写成

.content {background: url('/m/static/img/1.jpg')  //直接带上发布是的绝对路径
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_754966.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web文件 群晖_群晖NAS安装wordpress博客,构建属于自己的web网站

学习网络技术的话可以关注我&#xff0c;每天都会有相应的教程发布的&#xff01;群晖NAS主要的作用就是网络储存&#xff0c;你可以理解为百度云&#xff0c;但这个百度云的服务器放在了家里。个人而言&#xff0c;有了NAS以后&#xff0c;家里的所有设备(台式电脑&#xff0c…

# 解析bt文件_一键查看BT下载记录,用这网站一秒知道你下载过哪些资源

既然刷到了&#xff0c;就收藏起来吧&#xff01;以备不时之需&#xff01;想要知道自己过去用BT或磁力链下载过哪些电影、游戏或软件等资源吗&#xff1f;你可能还不知道&#xff0c;其实在 BT 下载时&#xff0c;自己的 IP 位置就已经被记录&#xff0c;通过「iknowwhatyoudo…

html网页主题有哪些,网站的专题页面是什么?

做SEO的时候&#xff0c;很多时候一个权重高的网站做久了&#xff0c;就会有很多的权重排名高的目标关键词和长尾关键词排获取不错的流量。但是有一些关键词热度较高&#xff0c;而普通的文章因为多数是采用模板输出所以页面权重较低&#xff0c;导致在竞争中排名不靠前。而这时…

apache配置完django后启动失败_Django建站之旅(三):Hello world

1创建blog应用上一篇我们配置完了Django的项目环境&#xff0c;这一篇我们就来讲讲如何创建应用。关于Django的应用&#xff0c;我以我的理解来简单介绍一下&#xff0c;在Django中我们可以创建多个应用&#xff0c;用来实现多个功能。比如说我们现在要做的个人博客网站&#x…

html显示蒙古语乱码,做网站用UTF-8编码还是GB2312编码?

经常我们打开外国网站的时候出现乱码&#xff0c;又或者打开很多非英语的外国网站的时候&#xff0c;显示的都是口口口口口的字符&#xff0c;WordPress程序是用的UTF-8&#xff0c;很多cms用的是GB2312。● 为什么有这么多编码&#xff1f;● UTF-8和GB2312有什么区别&#xf…

flask+uwsgi+nginx部署网站

2019独角兽企业重金招聘Python工程师标准>>> 1.写在前面 本文重要介绍&#xff0c;flask框架写的web网站如果正确部署在正常环境中。因为flask自带的web服务不足以支持实际使用情况。只是方便开发人员调试开发&#xff0c;并不具备可靠的性能。 以下介绍适用…

一个服务器上可以放几个网站,一个云服务器上可以放几个网站吗

一个云服务器上可以放几个网站吗 内容精选换一换内网域名解析是基于VPC网络的域名解析过程&#xff0c;通过华为云内网DNS把域名(如ecs.com)转换成私网IP地址(192.168.1.1)。内网域名解析实现云服务器在VPC内直接通过内网域名互相访问。同时&#xff0c;还支持不经公网&#xf…

关于“网上社会实践”网站的设计

前段时间&#xff0c;辅导员发了一封邮件&#xff0c;是关于学校要建设“网上社会实践”创新项目的通知。因为广外学习ASP.NET的人不多&#xff0c;所以不出意外地是我接了。 这个项目是用于学生网上社会实践的东西。也是一个创新项目来的。但是这些对于我们学技术的人来说&…

京东一面:如何用 Nginx 禁止国外 IP 访问网站,直接凉凉!

点击上方“Java基基”&#xff0c;选择“设为星标”做积极的人&#xff0c;而不是积极废人&#xff01;每天 14:00 更新文章&#xff0c;每天掉亿点点头发...源码精品专栏 原创 | Java 2021 超神之路&#xff0c;很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框…

Slog50_支配vue框架初阶项目之博客网站-单页-客户端(浏览器)更新头像2

ArthurSlogSLog-50Year1GuangzhouChinaAug 26th 2018GitHub掘金主页简书主页segmentfault要成就一番事业 既要靠本事上位 又得懂拉拢站队 开发环境MacOS(High Sierra 10.13.5) 需要的信息和信息源&#xff1a; 统一资源定位符(URL)XMLHttpRequestvue模版语法 v-bindFormDataFor…

使用Apache服务部署静态网站

使用Apache服务部署静态网站 1.网站服务程序Web网络服务&#xff0c;一般是指允许用户通过浏览器访问到互联网中各种资源的服务。Apache程序是目前拥有很高市场占有率的Web服务程序之一&#xff0c;其跨平台和安全性广泛被认可且拥有快速、可靠、简单的API扩展。Apache也是RHEL…

基于SpringBoot+MyBatis+Vue的音乐网站

点击上方“Java基基”&#xff0c;选择“设为星标”做积极的人&#xff0c;而不是积极废人&#xff01;每天 14:00 更新文章&#xff0c;每天掉亿点点头发...源码精品专栏 原创 | Java 2021 超神之路&#xff0c;很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框…

使用VS2012开发的网站或者webservice在IIS6.0上发布的注意事项

由于新版的VS2012的出现&#xff0c;很多人转而使用VS2012作为开发工具&#xff0c;微软每次新的版本都会新增一些功能&#xff0c;带给我们不少的惊喜&#xff0c;但是在VS2012或者VS2010下开发的网站或者webservice在部署时要注意了&#xff0c;由于VS2010以上版本的.net fra…

流量排名前一千万网站,三分之一使用 WordPress

WordPress 在官博发文&#xff0c;庆祝它在流量排名前一千万网站中的市场占有率达到了三分之一。据 W3Techs 的数据&#xff0c;WordPress 在前一千万网站的市场份额从一年前的 29.9% 上升到了现在的 33.4%。WordPress 表示对此非常自豪。 作为开源内容管理系统的 WordPress&am…

大型网站技术架构(六)网站的伸缩性架构

2019独角兽企业重金招聘Python工程师标准>>> 网站系统的伸缩性架构最重要的技术手段就是使用服务器集群功能&#xff0c;通过不断地向集群中添加服务器来增强整个集群的处理能力。“伸”即网站的规模和服务器的规模总是在不断扩大。 1、网站架构的伸缩性设计 网站的…

30个免费下载高质量精美照片素材的网站(转)

在设计中使用免费的照片素材可以节省大量的时间。网络有有很多分享照片资源的网站&#xff0c;有些是免费的&#xff0c;有些则需要付费&#xff0c;当你在设计中使用网上的照片素材的时候要注意使用协议以免带来麻烦。今天这篇文章向大家推荐30个国外的免费下载高质量精美图片…

html显示日志_seo优化的网站日志分析

网站日志相信这个名词&#xff0c;站长们不知道。大多数站长只知道网站日志的概念&#xff0c;不知道网站日志的分析。其实网站日志的分析也是一个很重要的SEO话题。网站日志应该说每个站长都要懂得分析&#xff0c;这是每个站长必备的技术。要知道网站日志的分析方法&#xff…

php开发小说数据问题,小说类网站开发之创建数据库与建立数据表

php开发后端中最重要的一个环节就是创建数据库与建立数据表&#xff0c;因为他和整个项目都有直接的关系&#xff0c;所以&#xff0c;我们首先建立几个数据表&#xff0c;为后面写程序垫下基础首先我们先去建立数据库文章然后查询数据库这里我们写的是小说站&#xff0c;我就建…

linux c多进程多线程,等待进程 - Linux C进程与多线程入门_Linux编程_Linux公社-Linux系统门户网站...

问题在创建进程这一节内容中&#xff0c;我们看到&#xff0c;消息的输出是父子进程交替输出&#xff0c;且父进程在子进程之前结束。如果要安排父进程在子进程结束之后才结束。可以调用wait函数。函数说明pid_t wait(int * stat_loc)包含的头文件: #include #include 返回值&a…

有哪些网站是django开发的_想要定制开发下单网站需要准备哪些内容?

引言&#xff1a;企业对外推广少不了要有一个形象网站&#xff0c;如果不能通过模板网站满足企业建站需求&#xff0c;大多数情况下是需要定制开发网站的。想要定制开发网站或设计定制网站&#xff0c;都需要准备什么呢&#xff1f;网慧科技小编帮您捋清这4个问题可以避免晕头转…