通常状况下,经过webpack+vuecli默认打包的css、js等资源,路径都是绝对的。css
但当部署到带有文件夹的项目中,这种绝对路径就会出现问题,由于把配置的static文件夹当成了根路径,那么要解决这种问题,就得引用相对路径。html
解决办法
打开webpack.prod.conf.js
vue
找到output
:增长 publicPath: './',
便可,如图:webpack
也可在config
文件夹下的index.js
中修改 assetsPublicPath: './'
一样也能够达到资源的相对引用。git
背景图引入问题
上面虽然解决了资源路径的引用问题,可是资源里面的背景图片,不像index.html中加载资源同样,经过./static/js/app.js引用能够正常加载,图片资源是经过css加载的,如 background:url('../../static/img/base/title.png');
被相对打包后变成了url(static/img/base/title.0cf9ae0.png)
因此咱们要保留css引用图片的正常路径,就须要修改build
文件夹下的utils.js
代码,如图所示:github
也能够不改配置用数据的形式解决:web
<div :style="bg"></div> export default { data() { return { bg: { backgroundImage: "url(" + require("../../static/img/base/title.png") + ")", backgroundRepeat: "no-repeat" } } },
assets 和static的区别
请参考 vue-cli 的 webpack 模板的文档 - Handing Static Assets,做者知道会有人有这个疑惑,因此做了详情的解释:vue-cli
You will notice in the project structure we have two directories for static assets:
src/assets
andstatic/.
What is the difference between them?app
简单翻译一下ui
Webpacked Assets
为了回答这个问题,咱们首先须要了解Webpack如何处理静态资产。在 *.vue
组件中,全部模板和CSS都会被 vue-html-loader
及 css-loader
解析,并查找资源URL。例如,在 <img src="./logo.png">
和 background: url(./logo.png)
中,"./logo.png"
是相对的资源路径,将由Webpack解析为模块依赖。
由于 logo.png
不是 JavaScript,当被视为模块依赖时,须要使用 url-loader
和 file-loader
处理它。vue-cli 的 webpack 脚手架已经配置了这些 loader,所以可使用相对/模块路径。
因为这些资源可能在构建过程当中被内联/复制/重命名,因此它们基本上是源代码的一部分。这就是为何建议将Webpack 处理的静态资源放在 /src
目录中和其它源文件放一块儿的缘由。事实上,甚至没必要把它们所有放在 /src/assets
:能够用模块/组件的组织方式来使用它们。例如,能够在每一个放置组件的目录中存放静态资源。
"Real" Static Assets
相比之下,static/
目录下的文件并不会被Webpack处理:它们会直接被复制到最终目录(默认是dist/static
)下。必须使用绝对路径引用这些文件,这是经过在config.js
文件中的build.assetsPublicPath
和 build.assetsSubDirectory
链接来肯定的。
任何放在 static/
中文件须要以绝对路径的形式引用:/static/[filename]
。若是更改assetSubDirectory
的值为 assets
,那么路径需改成 /assets/[filename]
。
简单说,就是放在assets中的文件会被配置过的webpack处理,而static只是简单的拷贝。
以下图:在项目中写的是能够访问到的相对路径(请注意右侧的publicPath,在build/utils.js/exports.cssLoaders
中):
下图为打包编译后的结果:
因而可知,assets
相对于.vue文件的位置更重要,若将publicPath
改成../../../
相对于static
事实证实这样的时候关于assets里的文件会找不到。
固然,打包的时候可能还有其余的各类问题,这里只是粗略的指出一点,网上教程也不少,但有用的很少,仍是得本身跑一遍才可以检验是否正确。加油吧,骚年!