vue 项目中assets 和static的区别
一、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
:可以用模块/组件
的组织方式来使用它们。例如,可以在每个放置组件的目录中存放静态资源。
资源处理规则
- 相对URL(./assets/logo.png):将会被解释成一个模块依赖。它们会被一个基于你的Webpack输出配置自动生成的URL替代。
- 没有前缀的URL(assets/logo.png):将会被看成相对URL,并且转换成./assets/logo.png。
- 前缀带~的URL(~assets/logo.png):会被当成模块请求, 类似于require(‘some-module/image.png'). 如果你想要利用Webpack的模块处理配置,就可以使用这个前缀。例如,如果你有一个对于assets的路径解析,你需要使用 <img src="~assets/logo.png"> 来确保解析是对应上的。
- 相对根目录的URL(/assets/logo.png):不会被处理。
在JavaScript里获取资源路径
为了能让Webpack返回正确的资源路径,你需要使用require('./relative/path/to/file.jpg')
,由file-loader
进行解析,然后返回处理过的URL。例如:
computed: {
background () {
return require('./bgs/' + this.id + '.jpg')
}
}
注意上例将会包含每个在最后一次build中的./bgs/ 下的图片。 这是由于 Webpack 无法推测它们哪个会在运行时被使用, 因此会包含所有图片.
二、"Real" Static Assets
相比之下,static/
目录下的文件并不会被 Webpack 处理:它们会直接被复制到最终目录(默认是dist/static
)下。必须使用绝对路径引用这些文件,这是通过在 config.js
文件中的 build.assetsPublicPath
和 build.assetsSubDirectory
连接来确定的。
任何放在 static/
中文件需要以绝对路径的形式引用:/static/[filename]
。如果更改 assetSubDirectory
的值为 assets
,那么路径需改为 /assets/[filename]
。
// config/index.js
module.exports = {
// ...
build: {
assetsPublicPath: '/',
assetsSubDirectory: 'static'
}
}
三、使用区别
<template>
<img :src="filterIcon(item.pollingState)" alt="" class="pollingIcon">
</template>
<script>
export default {
methods: {
filterIcon(val) {
let commonUrl = '../../../../static/images/assetpolling/';
if (val === 1) {
return commonUrl + 'pollingSuccess.png';
} else {
return commonUrl + 'pollingLoading.gif';
}
}
}
}
</script>
如果src
的值是一个变量,放在staic
下能访问到图片,放在assets
下访问不到。如果是一个字符串常量,static
和assets
下都可以访问到。
分析:官方说,在 *.vue
组件中,所有模板和CSS都会被 vue-html-loader
及 css-loader
解析,并查找资源URL。所以对应的资源如果是个字符串常量,在编译期就已经被解析为Base64
与代码融合为一体。而如果src
对应的是个变量,只有在运行期才会被解析,这时候就访问不到assets
目录下的资源了。
结论:当资源对应的是变量时,资源放在static
下。第三方的类库的资源也放在static
下。
参考译文:https://blog.csdn.net/riddle1981/article/details/78469032?utm_source=blogxgwz4
官网原文:http://vuejs-templates.github.io/webpack/static.html
最新文章
- MySQL 常用命令总结
- react基础(1)
- Android入门(三)Activity-生命周期与启动模式
- Python 写Windows Service服务程序
- [C] c99int(让VC等编译器自动兼容C99的整数类型)V1.02。源码托管到github、添加CMake编译配置文件、使用doxygen规范注释
- 聊聊IO多路复用之select、poll、epoll详解
- 正确答案 全国信息学奥林匹克联赛( ( NOIP2014) 复 赛 模拟题 Day1 长乐一中
- Android问题-DelphiXE8安装后编译Android提示SDK无法更新问题(XE10也可以解决)
- [Swust OJ 188]--异面空间(读懂题意很重要)
- password加密问题
- 【Zookeeper】源码分析目录
- Django ORM中常用字段和参数
- hadoop启动
- HttpServletResponse类学习
- jQuery 的 prevObject
- SSM事务——事务回滚如何拿到返回值
- exgcd模板
- GO基本数据结构练习:数组,切片,映射
- java讲讲几种常见的排序算法
- C#中Attribute/特性的使用