vue -- 打包资源正确引用及背景图引入

通常状况下,经过webpack+vuecli默认打包的css、js等资源,路径都是绝对的。css

但当部署到带有文件夹的项目中,这种绝对路径就会出现问题,由于把配置的static文件夹当成了根路径,那么要解决这种问题,就得引用相对路径。html

解决办法

打开webpack.prod.conf.jsvue

找到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 and static/. What is the difference between them?app

简单翻译一下ui

Webpacked Assets

为了回答这个问题,咱们首先须要了解Webpack如何处理静态资产。在 *.vue 组件中,全部模板和CSS都会被 vue-html-loadercss-loader 解析,并查找资源URL。例如,在 <img src="./logo.png">background: url(./logo.png) 中,"./logo.png" 是相对的资源路径,将由Webpack解析为模块依赖

由于 logo.png 不是 JavaScript,当被视为模块依赖时,须要使用 url-loaderfile-loader处理它。vue-cli 的 webpack 脚手架已经配置了这些 loader,所以可使用相对/模块路径。

因为这些资源可能在构建过程当中被内联/复制/重命名,因此它们基本上是源代码的一部分。这就是为何建议将Webpack 处理的静态资源放在 /src 目录中和其它源文件放一块儿的缘由。事实上,甚至没必要把它们所有放在 /src/assets:能够用模块/组件的组织方式来使用它们。例如,能够在每一个放置组件的目录中存放静态资源。

"Real" Static Assets

相比之下,static/ 目录下的文件并不会被Webpack处理:它们会直接被复制到最终目录(默认是dist/static)下。必须使用绝对路径引用这些文件,这是经过在config.js文件中的build.assetsPublicPathbuild.assetsSubDirectory 链接来肯定的。

任何放在 static/ 中文件须要以绝对路径的形式引用:/static/[filename]。若是更改assetSubDirectory 的值为 assets,那么路径需改成 /assets/[filename]

简单说,就是放在assets中的文件会被配置过的webpack处理,而static只是简单的拷贝。

以下图:在项目中写的是能够访问到的相对路径(请注意右侧的publicPath,在build/utils.js/exports.cssLoaders中):

下图为打包编译后的结果:

因而可知,assets相对于.vue文件的位置更重要,若将publicPath改成../../../相对于static事实证实这样的时候关于assets里的文件会找不到。

固然,打包的时候可能还有其余的各类问题,这里只是粗略的指出一点,网上教程也不少,但有用的很少,仍是得本身跑一遍才可以检验是否正确。加油吧,骚年!

相关文章
相关标签/搜索