理解静态资源服务
Nuxt
使用 vue-loader
、file-loader
和 url-loader
这些 webpack
加载器来处理你应用程序中的静态资源。首先,Nuxt
会使用 vue-loader
处理 <template>
和 <style>
块,并结合 css-loader
和 vue-template-compiler
将这些块中的元素(如 <img src="…">
、background-image: URL(…)
和 CSS @import
)编译成模块依赖。看下面的例子:
// pages/index.vue
<template>
<img src="~/assets/sample-1.jpg">
</template>
<style>
.container {
background-image: url("~assets/sample-2.jpg");
}
</style>
上面的 <template>
和 <style>
块中的图片元素和静态资源将被编译并转换为以下代码和模块依赖:
createElement('img', { attrs: { src: require('~/assets/sample-1.jpg') }})
require('~/assets/sample-2.jpg')
请注意,从 |
在完成上述编译和转换后,Nuxt
接下来会使用 file-loader
将 import/require
的模块依赖解析为一个 URL
,并将这些静态资源发出(复制粘贴)到输出目录中;或者,如果资源小于 1 KB,则使用 url-loader
将其转换为 Base64 URI
。但是,如果资源大于 1 KB 的阈值,它将回退到 file-loader
。这意味着任何小于 1 KB 的文件都将通过 url-loader
内联为 Base64
数据 URL
,如下所示:
<img src="data:image/png;base64,iVBO...">
这可以让你更好地控制应用程序向服务器发出的 HTTP
请求数量。内联资源可以减少 HTTP
请求,而任何大于 1 KB 的文件都将被复制粘贴到输出目标,并使用版本哈希进行命名,以实现更好的缓存。例如,前面 <template>
和 <style>
块中的图像将按如下方式发出(通过 npm run build
):
img/04983cb.jpg 67.3 KiB [emitted]
img/cc6fc31.jpg 85.8 KiB [emitted]
你将在浏览器的前端看到如下所示的图像:
<div class="links">
<img src="/_nuxt/img/04983cb.jpg">
</div>
以下是这两个 webpack
加载器(url-loader
和 file-loader
)的默认配置:
[
{
test: /\.(png|jpe?g|gif|svg|webp)$/i,
use: [{
loader: 'url-loader',
options: Object.assign(
this.loaders.imgUrl,
{ name: this.getFileName('img') }
)
}]
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.)?$/i,
use: [{
loader: 'url-loader',
options: Object.assign(
this.loaders.fontUrl,
{ name: this.getFileName('font') }
)
}]
},
{
test: /\.(webm|mp4|ogv)$/i,
use: [{
loader: 'file-loader',
options: Object.assign(
this.loaders.file,
{ name: this.getFileName('video') }
)
}]
}
]
你可以像我们在前一个主题中使用 build
选项进行 webpack
配置一样,自定义此默认配置。
有关 有关 |
如果你是 webpack
的新手,请访问 https://webpack.js.org/concepts/。另请访问 https://webpack.js.org/guides/asset-management/ 以获取其资源管理指南。简而言之,webpack
是 JavaScript
应用程序的静态模块打包器。其主要目的是打包 JavaScript
文件,但它也可以用于转换 HTML
、CSS
、图像和字体等资源。如果你不想以 webpack
为你处理资源的方式提供资源,你也可以像我们在前面的 “理解目录结构” 部分中提到的那样,使用 /static/
目录来存放静态资源。但是,使用 webpack
提供资源也有其好处。让我们在下一节中了解它们是什么。
webpack 资源 vs 静态资源
使用 webpack
进行资源服务的一个好处是,它可以为生产环境优化这些资源,无论是图像、字体还是预处理样式(如 Less
、Sass
或 Stylus
)。webpack
可以将 Less
、Sass
和 Stylus
转换为通用的 CSS
,而静态文件夹只是一个你可以放置所有永远不会被 webpack
处理的静态资源的地方。在 Nuxt
中,如果你不想为你的项目使用 /assets/
目录中的 webpack
资源,你可以使用 /static/
目录代替。
例如,我们可以使用 /static/
目录中的静态图像,如下所示:
// pages/index.vue
<template>
<img src="/sample-1.jpg"/>
</template>
另一个很好的例子是 Nuxt
配置文件中的 favicon
文件:
// nuxt.config.js
export default {
head: {
link: [
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
]
}
}
请注意,如果你使用 ~
别名来链接 /static/
目录中的资源,webpack
将像处理 /assets/
目录中的资源一样处理这些资源,如下所示:
// pages/index.vue
<template>
<img src="~/static/sample-1.jpg"/>
</template>
我们将在第三章 “添加 UI 框架”、第四章 “添加视图、路由和过渡效果” 以及第五章 “添加 Vue 组件” 中大量使用 /assets/
目录进行资源服务,以动态地提供资源。现在,让我们总结一下你在本章中学到的内容。
你可以在我们的 GitHub
仓库的 /chapter-2/assets/
目录下找到一个从这两个目录提供资源和文件的示例应用程序。