vue资源文件夹 assets和static的区别 朴灿烈づ我的快乐病毒、 2021-07-26 18:25 411阅读 0赞 ## 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里面的,就直接引用了。 一般在static里面放一些类库的文件,在assets里面放属于该项目的资源文件。 可以看一下我翻译的vue-cli weboack模板的[中文文档][Link 1] # [vue2.0 资源文件assets和static的区别][vue2.0 _assets_static] # # 资源文件处理 # 在我们的项目结构里,有两个资源文件的路径,分别是:`src/assets` 和 `static/`。那这两个到底有什么区别呢? ## Webpacked 资源 ## 为了回答这个问题,我们首先需要理解webpack是怎样处理静态资源的。在`*.vue`组件中,所有的templates和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`进行处理。 该模板已经配置好了这些loaders,所以你能够使用相对/模块路径时不需要担心部署的问题。 由于这些资源可能在构建的时候被内联/复制/重命名, 所以它们从本质上来说是你源码的一部分。这就是为什么我们建议将交由webpack处理的静态资源和其它源文件一样放在`/src`路径下面。 实际上,你甚至不需要把它们全都放在`/src/assets`路径下:你可以基于模块/组件的使用来组织文件结构。例如,你可以把每个组件和属于它的静态资源放在它自己的目录下。 资源处理规则 * 相对URL, e.g. `./assets/logo.png` 将会被解释成一个模块依赖。它们会被一个基于你的Webpack输出配置自动生成的URL替代。 * 没有前缀的URL, e.g. `assets/logo.png` 将会被看成相对URL,并且转换成`./assets/logo.png` * 前缀带`~`的URL 会被当成模块请求, 类似于`require('some-module/image.png')`. 如果你想要利用Webpack的模块处理配置,就可以使用这个前缀。例如,如果你有一个对于`assets`的路径解析,你需要使用`<img src="~assets/logo.png">`来确保解析是对应上的。 * 相对根目录的URL, e.g. `/assets/logo.png` 是不会被处理的 ## 在JavaScript里获取资源路径 ## 为了能让Webpack返回正确的资源路径,你需要使用`require('./relative/path/to/file.jpg')`,由`file-loader`进行解析,然后返回处理过的URL。例如: computed: { background () { return require('./bgs/' + this.id + '.jpg') } } 注意上面的例子,在最终的构建时将会包含`./bgs/`路径下的所有图片 这是因为Webpack不能猜出来在运行时会用到其中的哪个,所以会包含所有的。 ## "真实的" 静态资源 ## 作为对比,在`static/`下的文件都不会被Webpack处理:它们使用相同的文件名,直接拷贝到最终的路径。你必须使用绝对路径来引用这些文件,取决于在`config.js`里面加入的`build.assetsPublicPath` 和 `build.assetsSubDirectory`。 举个例子,下面的默认值是: // config/index.js module.exports = { // ... build: { assetsPublicPath: '/', assetsSubDirectory: 'static' } } 所有放在 `static/`目录下的文件都应该是使用绝对URL`/static/[filename]`引用的。如果你将`assetSubDirectory`的值改成`assets`, 那么这些URL就会被变成 `/assets/[filename]` [Link 1]: https://athena0304.gitbooks.io/vue-template-webpack-cn/content/static.html [vue2.0 _assets_static]: https://www.cnblogs.com/minigrasshopper/p/8011630.html
还没有评论,来说两句吧...