到底是用nuxt的public还是assets?一篇文章开悟

30 阅读3分钟

assets

Nuxt为你的资产提供了两种处理方式。

Nuxt使用两个目录来处理样式表、字体或图片等资产:

  • public/目录的内容会直接以服务器根路径的形式提供。
  • assets/目录按惯例包含你希望构建工具(Vitewebpack)处理的所有资产。

公共目录

public/目录用作静态资产的公共服务器,这些资产可以在你的应用定义的URL下公开访问。

你可以通过应用的代码或浏览器使用根URL/来获取public/目录中的文件。

示例

例如,引用位于public/img/目录中的图像文件,可通过静态URL/img/nuxt.png访问:

// app.vue
<template>
  <img src="/img/nuxt.png" alt="探索 Nuxt" />
</template>

资产目录

Nuxt使用Vite(默认)或webpack来构建和打包你的应用。这些构建工具的主要功能是处理JavaScript文件,但可以通过插件(用于Vite)或加载器(用于webpack)扩展,以处理其他类型的资产,例如样式表、字体或SVG。这一过程主要为了性能或缓存目的转换原始文件(例如样式表压缩或浏览器缓存失败)。

按照惯例,Nuxt使用assets/目录来存储这些文件,但该目录没有自动扫描功能,你可以为它使用任何其他名称。

在应用代码中,可以通过~/assets/路径引用位于assets/目录中的文件。

示例

例如,引用一个图像文件,如果构建工具配置为处理此文件扩展名,该文件将被处理:

// app.vue
<template>
  <img src="~/assets/img/nuxt.png" alt="探索 Nuxt" />
</template>

Nuxt不会以静态URL(如/assets/my-file.png)提供assets/目录中的文件。如果你需要静态URL,请使用public/目录。

区别 —— 纠结用哪个可以看这张表

特性public/目录assets/目录
目的静态资源服务器构建时处理的资源
URL访问直接通过根路径/访问需通过~/assets/路径引用
构建处理不经过构建工具处理经过Vite/webpack处理(压缩、优化等)
更新方式直接替换文件构建后生成新文件(带哈希)
适用场景不常更改的资源(如favicon、robots.txt需要构建优化的资源(图片、样式、字体)

public/

// vue
<!-- 适用于: -->
<!-- 不常更新的静态文件 -->
<img src="/favicon.ico" alt="网站图标" />

<a href="/brochure.pdf">下载手册</a>

assets/

// vue
<!-- 适用于: -->
<!-- 需要优化处理的图片 -->
<img src="~/assets/images/hero.jpg" alt="英雄" />
<!-- 2. 样式文件(SCSS/SASS/LESS) -->
<style>
@import '~/assets/styles/main.scss';
</style>
<!-- 3. 字体文件 -->
<style>
@font-face {
  font-family: 'CustomFont';
  src: url('~/assets/fonts/custom.woff2') format('woff2');
}
</style>

实战目录结构

my-nuxt-app/
├── public/
│   ├── favicon.ico          # 直接通过 /favicon.ico 访问
│   ├── robots.txt          # 直接通过 /robots.txt 访问
│   └── downloads/
│       └── brochure.pdf    # 直接通过 /downloads/brochure.pdf 访问
├── assets/
│   ├── images/
│   │   ├── logo.png        # 构建优化后的图片
│   │   └── background.jpg
│   ├── styles/
│   │   ├── main.scss       # 编译处理的SCSS文件
│   │   └── variables.scss
│   └── fonts/
│       └── custom.woff2    # 字体文件
└── components/
    └── MyComponent.vue
<!-- 优先使用assets/以获得构建优化  -->
<img src="~/assets/images/product.jpg" alt="产品" />

<!-- 大尺寸或不需要优化的图片可以放在public -->
<img src="/documentation/large.png" alt="架构图" >

动态

<script setup>
// 使用 import 获取 assets 资源(会经过构建处理)
import logo from '~/assets/images/logo.png'

// 使用相对路径引用 public 资源
const publicImage = '/images/banner.png'
</script>

css中用

/* 在 CSS 中引用 assets 资源 */
.hero {
  background-image: url('~/assets/images/bg.jpg');
}

/* 引用 public 资源 */
.external {
  background-image: url('/external-bg.png');
}

提醒

  1. 缓存策略

    • assets/ 中的文件通常会添加哈希值,便于缓存管理
    • public/ 中的文件使用原始名称,需手动管理缓存
  2. 部署考虑

    • public/ 目录内容会原样复制到构建输出
    • assets/ 目录内容会被处理并打包
  3. 性能优化

    • 小图标建议使用 assets/ 以便打包优化
    • 大文件(如视频)建议使用 public/ 避免构建过程变慢