vue 图片资源应该如何存放并引入(public、assets)?

       全局cli配置:vue.config.js

        之前写项目就想着怎么简单怎么来,图片要用了,就直接在要用图片的页面,新建一个跟页面同等级的 imgs 文件夹,然后在页面中直接 ./imgs/图片.png,不得不说这样写很方便。

但是这样做显得不太高级,而且图片太多的时候,可能会重复添加到项目中。vue-cli3 里面有两个可以存放图片的位置:public、assets,这两个的区别一直分得不是很清楚,今天就整理疏通一下,将了解下面3点:

  1. 两者存放什么图片,什么时候使用,在某种情况下应该使用哪种方式;
  2. 使用方式;
  3. 图片路径转换;

在了解上面几点之前,先来看看官网的介绍:

一、处理静态资源

静态资源可以通过两种方式进行处理:

  1. 在 JavaScript 被导入或在 template/CSS 中通过相对路径被引用。这类引用会被 webpack 处理。
  2. 放置在 public 目录下或通过绝对路径被引用。这类资源将会直接被拷贝,而不会经过 webpack 的处理。

        第一种方式:例如在某个 .vue 文件中通过 import "./" 的方法引入某个组件、js方法,或者像我之前在项目中写的 ./imgs/图片.png,这就是采用相对路径引用资源的方法。

        第二种方式:例如在 public/index.html 中 <link rel="icon" href="<%= BASE_URL %>favicon.ico"> 通过 <%= BASE_URL %> 引用 favicon.icon,这是绝对路径。

        两种方式简单来说,一种是相对路径引用静态资源(会被webpack处理),一种是采用绝对路径引用资源(不会被webpack处理)。【这里的资源不局限于图片,还有js、css等都可以属于静态资源】

1.1 相对路径引用/导入资源

        当你在 JavaScript、CSS 或 *.vue 文件中使用相对路径 (必须以 . 开头) 引用一个静态资源时,该资源将会被包含进入 webpack 的依赖图中。在其编译过程中,所有诸如 <img src="...">background: url(...) 和 CSS @import 的资源 URL 都会被解析为一个模块依赖

根据上面官方的讲解,大概情形在项目中的展示情况:

1.1.1 通过静态路径导入资源时,例如导入图片,我们在模板中使用,需要通过 require 的这种方法去引入:

<img :src="logo" />export default {data(){return {//相对路径不一定都是./,也可能是../,按照图片存放位置来决定logo: require("./imgs/logo.png") }}
}

1.1.2 在写背景图样式的时候,就可以像普通 H5 页面一样直接引入: 

<template><div><div class="login"></div></div>
</template><style scoped lang="scss">.login{background: url("./imgs/login.png") no-repeat center;}
</style>

1.1.3 若是引入动态背景图,写法与1相似

<template><div><div class="login" :style="{backgroundImg: url(loginImg)}"></div></div>
</template><script>export default{data(){return {loginImg: require('./imgs/login.png')}}}
</script><style scoped lang="scss">.login{background-repeat: no-repeat; background-size:100%;}
</style>

二、URL转换规则

  1. 如果 URL 是一个绝对路径 (例如 /images/foo.png),它将会被保留不变。

  2. 如果 URL 以 . 开头,它会作为一个相对模块请求被解释且基于你的文件系统中的目录结构进行解析。

  3. 如果 URL 以 ~ 开头,其后的任何内容都会作为一个模块请求被解析。这意味着你甚至可以引用 Node 模块中的资源:

    <img src="~some-npm-package/foo.png">
    
  4. 如果 URL 以 @ 开头,它也会作为一个模块请求被解析。它的用处在于 Vue CLI 默认会设置一个指向 <projectRoot>/src 的别名 @(仅作用于模版中)

三、关于public

3.1 public 文件夹

任何放置在 public 文件夹的静态资源都会被简单的复制,而不经过 webpack。你需要通过绝对路径来引用它们。

注意我们推荐将资源作为你的模块依赖图的一部分导入,这样它们会通过 webpack 的处理并获得如下好处:

  • 脚本和样式表会被压缩且打包在一起,从而避免额外的网络请求。
  • 文件丢失会直接在编译时报错,而不是到了用户端才产生 404 错误。
  • 最终生成的文件名包含了内容哈希,因此你不必担心浏览器会缓存它们的老版本。

public 目录提供的是一个应急手段,当你通过绝对路径引用它时,留意应用将会部署到哪里。如果你的应用没有部署在域名的根部,那么你需要为你的 URL 配置 publicPath 前缀:

  • 在 public/index.html 或其它通过 html-webpack-plugin 用作模板的 HTML 文件中,你需要通过 <%= BASE_URL %> 设置链接前缀:

    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    
  • 在模板中,你首先需要向你的组件传入基础 URL:

    data () {return {publicPath: process.env.BASE_URL}
    }
    

    然后:

    <img :src="`${publicPath}my-image.png`">
    

3.2 何时使用 public 文件夹

  • 你需要在构建输出中指定一个文件的名字。
  • 你有上千个图片,需要动态引用它们的路径。
  • 有些库可能和 webpack 不兼容,这时你除了将其用一个独立的 <script> 标签引入没有别的选择。

上面官方说的大部分都是 public 的内容。

四、总结

public放不会变动的文件(相当于vue-cli2.x中的static)
public/ 目录下的文件并不会被Webpack处理:它们会直接被复制到最终的打包目录(默认是dist/static)下。必须使用绝对路径引用这些文件,这个取决于你vue.config.js中 publicPath 的配置,默认的是/。


assets放可能会变动的文件
assets目录中的文件会被webpack处理解析为模块依赖,只支持相对路径形式。

简单来说就是就是public放别人家js文件(也就是不会变动),assets放自己写的js、css文件(需要改动的文件)

 

推荐一篇文,个人认为很实用:

Vue处理静态资源:public、assets目录 - vickylinj - 博客园前言: webpack中的require解析 首先明确一点,在项目中的webpack.config.js等项目配置文件中使用的require属于nodejs范畴,而进入index.js后,加载的组件中https://www.cnblogs.com/vickylinj/p/15599154.html

vue项目引入背景图报Module not found: Error: Can't resolve './src/assets/theme/logo_blue.png' in'xxx'错误

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

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

相关文章

真正的动态声明性组件

在这篇简短的文章中&#xff0c;我将重点介绍ADF动态声明性组件。 我的意思是一个众所周知的ADF标签af&#xff1a;declarativeComponent 。 它可以用作将页面设计为页面片段和组件组成的一种非常便捷的方法。 例如&#xff0c;我们的页面可以包含以下代码片段&#xff1a; &l…

layui 树形组件下拉框

采用 layui 树形组件&#xff0c;版本&#xff1a;V2.6.8。只需要更新layui版本&#xff0c;不需要下载tableSelect。 原作者博客&#xff1a;https://blog.csdn.net/m0_67402588/article/details/123526860。 从 官网 更新日志可以看到&#xff0c;树形组件在2.5.7版本还在更新…

访问修饰符(C# 编程指南)

所有类型和类型成员都具有可访问性级别&#xff0c;用来控制是否可以在您程序集的其他代码中或其他程序集中使用它们。您在声明类型或成员时使用以下访问修饰符之一来指定其可访问性&#xff1a; public 同一程序集中的任何其他代码或引用该程序集的其他程序集都可以访问该类型…

vuex Payload 荷载

1、payload payload&#xff1a;有效载荷&#xff0c;即记录有效信息的部分。 通常在传输数据时&#xff0c;为了使数据传输更可靠&#xff0c;要把原始数据分批传输&#xff0c;并且在每一批数据的头和尾都加上一定的辅助信息&#xff0c;比如这一批数据量的大小&#xff0c…

JSP知识总结

day11 JSP入门 1 JSP概述 1.1 什么是JSP JSP&#xff08;Java Server Pages&#xff09;是JavaWeb服务器端的动态资源。它与html页面的作用是相同的&#xff0c;显示数据和获取数据。 1.2 JSP的组成 JSP html Java脚本&#xff08;代码片段&#xff09; JSP动态标签 2 J…

layui table表格的复选框checkbox设置部分为不可选

需求&#xff1a;如上图&#xff0c;某些数据禁用删除功能&#xff0c;那么全选时&#xff0c;这些数据前面的复选框也不能选。 实现&#xff1a;在layui数据表格中设置了字段为 type:checkbox 但是想要实现部分不显示&#xff0c;不可选的功能。layui内置没有该功能&#xff…

Katas编写的Java教程:Mars Rover

编程kata是一种练习&#xff0c;可以帮助程序员通过练习和重复练习来磨练自己的技能。 本文是“ 通过Katas进行Java教程 ”系列的一部分。 本文假定读者已经具有Java的经验&#xff0c;熟悉单元测试的基础知识&#xff0c;并且知道如何从他最喜欢的IDE&#xff08;我是Intell…

es6 includes(), startsWith(), endsWith()

传统上&#xff0c;JavaScript 只有 indexOf方法&#xff0c;可以用来确定一个字符串是否包含在另一个字符串中。ES6 又提供了三种新方法。includes()&#xff1a;返回布尔值&#xff0c;表示是否找到了参数字符串。startsWith()&#xff1a;返回布尔值&#xff0c;表示参数字符…

Rails之格式化价格方法

一种是直接在试图中队价格信息进行格式化如&#xff1a;<div class"price"><%sprintf("&#xffe5;%0.02f",product.price)%></div>另外一种是用单独的辅助方法来处理价格格式化&#xff0c;即number_to_currency&#xff0c;如&#x…

CodeCombat代码全记录(Python学习利器)--Kithgard地牢代码1

Kithgard地牢注意&#xff1a;在调用函数时&#xff0c;要在函数的后面加上括号内容&#xff0c;否则在python中&#xff0c;将不会认为你在调用这个函数内容&#xff0c;而你的英雄将像木头一样站在原地不会执行上左下右的移动&#xff01;&#xff01;&#xff01; hero.move…

layui upload阻止文件上传问题,及多选文件上传

1、效果展示&#xff1a; 2、需求&#xff1a; 下拉框及月份都为不空&#xff0c;且有文件数据才能提交上传。 3、环境&#xff1a; 目前项目中引用的 layui 版本是 2.4.5。在 before 中进行判断&#xff0c;使用 return false 想要阻止文件上传没反应&#xff0c;文件仍然会…

JPA教程:实体映射-第2部分

在上一篇文章中&#xff0c;我展示了一种持久保存实体的简单方法。 我解释了JPA用于确定实体默认表的默认方法。 假设我们要覆盖此默认名称。 我们之所以喜欢这样做&#xff0c;是因为数据模型是以前设计和修复的&#xff0c;并且表名与我们的类名不匹配&#xff08;例如&#…

Vue DOM事件

本文参考自&#xff1a;https://mp.weixin.qq.com/s?src3&timestamp1527154113&ver1&signaturetWGeTa86gyK*RL0P7nwlA6-8V14FjzxUTh7CM9kQLjl0DV3sx*2hKauMGZKoYBkTSp14Zw6MOD8pU-haYmJoNTSBI5rptCZwf3wTIXLUMUOYDOPZtxm9wJaSm0l7vqshH98ToXQCcfm-5jR-Y66eAYzuFM5…

2019.06.17课件:[洛谷P1310]表达式的值 题解

P1310 表达式的值 题目描述 给你一个带括号的布尔表达式&#xff0c;其中表示或操作|&#xff0c;*表示与操作&&#xff0c;先算*再算。但是待操作的数字&#xff08;布尔值&#xff09;不输入。 求能使最终整个式子的值为0的方案数。 题外话 不久之前我在codewars上做过一…

vue+element 封装日期范围组件(双向绑定)

像这样的日期组件&#xff0c;在后台管理项目中是比较多的&#xff0c;而且加了快捷选项&#xff0c;代码量较多&#xff0c;因此封装成组件。 封装这一类型的组组件&#xff0c;主要是了解输入框双向绑定 v-model 的过程。 1、了解输入框双向绑定的过程&#xff1a; 官网&am…

句柄是什么?1

句柄是什么&#xff1f; 1.句柄是什么&#xff1f; 在windows中&#xff0c;句柄是和对象一一对应的32位无符号整数值。对象可以映射到唯一的句柄&#xff0c;句柄也可以映射到唯一的对象。2.为什么我们需要句柄&#xff1f; 更准确地说&#xff0c;是windows需要句柄。w…

用Hystrix保护您的应用程序

在之前的帖子http://www.javacodegeeks.com/2014/07/rxjava-java8-java-ee-7-arquillian-bliss.html中&#xff0c;我们讨论了微服务以及如何使用&#xff08;RxJava&#xff09;的Reactive Extensions编排微服务。 但是&#xff0c;如果一项或多项服务由于已被暂停或引发异常而…

python方法未绑定错误

相信 Python 程序员多多少少都和我一样遇到过 Method Unbound Error&#xff0c;直译过来就是 “方法未绑定错误”&#xff0c;虽然搜索之后知道了使用 classmethod 这样的装饰起后就可以解决问题&#xff0c; 但是一直没有得到完全解惑。 我们知道&#xff0c;Python 是一个动…

若依 从下载到成功运行及打包

官网&#xff1a;http://www.ruoyi.vip/ 目录 一、下载并运行项目 二、关于 若依 接口地址配置 2.1 若依的跨域代理介绍 2.2 配置跨域代理&#xff0c;调用后台接口 2.2.1 配置 后台 ip 地址 2.2.2 页面报“系统接口404”错误 三、打包配置 3.1 打包之后静态资源404…

Windows平台下 找回已丢失的MySql root 用户密码

该随笔供初学MySql者作为参考&#xff0c;本人第一次写博客&#xff0c;欢迎各位大虾拍砖&#xff01; 主要步骤&#xff1a; 1.关闭MySql服务 2.在控制台下键入cd命令&#xff0c;进入MySql的安装目录的Bin目录下 3.键入命令 mysqld --skip-grant-tables(参数大致意思&#xf…