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

assets

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

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

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

公共目录

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

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

示例

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

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

资产目录

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

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

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

示例

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

html 复制代码
// 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/

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

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

assets/

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

实战目录结构

html 复制代码
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
vue 复制代码
<!-- 优先使用assets/以获得构建优化  -->
<img src="~/assets/images/product.jpg" alt="产品" />

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

动态

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

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

css中用

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/ 避免构建过程变慢
相关推荐
23级二本计科16 小时前
前端 HTML + CSS + JavaScript
前端·css·html
踩着两条虫16 小时前
VTJ.PRO「AI + 低代码」应用开发平台的后端模块系统
前端·人工智能·低代码
pany16 小时前
程序员近十年新年愿望,都有哪些变化?
前端·后端·程序员
朱昆鹏16 小时前
IDEA Claude Code or Codex GUI 插件【开源自荐】
前端·后端·github
HashTang16 小时前
买了专业屏只当普通屏用?解锁 BenQ RD280U 的“隐藏”开发者模式
前端·javascript·后端
双向3316 小时前
Agent智能体:2026年AI开发者必须掌握的自主系统革命
前端
布列瑟农的星空16 小时前
通用语法校验器tree-sitter——C++语法校验实践
前端
用户812748281512017 小时前
libgui中的BufferQueueProducer加入堆栈CallStack编译报错问题-大厂企业实战项目难题
前端
明月_清风17 小时前
从"请求地狱"到"请求天堂":alovajs 如何用 20+ 高级特性拯救前端开发者
前端·后端