Skip to content

publicassets 是常见的资源目录,但它们的定位和使用方式有本质差异。以下是针对前端开发的对比说明:


核心区别对比表

特征public 目录assets 目录
定位无需构建处理的静态资源需要构建处理的动态资源
典型框架Vue CLI / Create-React-AppVue CLI / Next.js / Nuxt
文件处理直接拷贝到构建输出目录会被 Webpack 等打包工具处理
路径引用绝对路径 /logo.png相对路径 @/assets/logo.png
典型文件类型favicon.ico, robots.txt图片、SCSS、字体、JSON
版本控制无哈希后缀带哈希后缀(如 logo.abc123.png

使用场景详解

1. public 目录

  • 适用场景

    • 需要保持原始文件名的资源(如 PWA 的 manifest.json)
    • 第三方库的 CDN 文件(如未模块化的 legacy.js)
    • 通过 <link> 直接引用的资源(如字体文件)
    • 绕过前端路由的 HTML 文件(如 404.html)
  • 代码示例

    html
    <!-- 直接引用 public 下的文件 -->
    <img src="/logo.png" /> 
    <link rel="icon" href="/favicon.ico" />

2. assets 目录

  • 适用场景

    • 需要 Webpack 处理的资源(如图片压缩、Base64 内联)
    • 通过 JavaScript 动态加载的资源(如 import bg from '@/assets/bg.jpg'
    • 需要 CSS 预处理处理的文件(如 SCSS 中 @import "assets/variables.scss"
    • 需要 Tree-Shaking 优化的 SVG 图标
  • 代码示例

    javascript
    // Vue 组件中引用
    <template>
      <img :src="require('@/assets/logo.png')" />
    </template>
    
    // React 中通过 import 引用
    import styles from './App.module.scss';
    import icon from './assets/icon.svg';

常见误区解释

  1. 图片加载失败问题

    • 把需要动态处理的图片放在 public 会导致路径错误
    • 正确做法:小图标放 assets(享受打包优化),超大文件放 public(避免构建耗时)
  2. CSS 背景图路径

    scss
    /* 错误:public 路径在构建后可能失效 */
    background: url('/public/bg.jpg');
    
    /* 正确:使用 assets 相对路径 */
    background: url('@/assets/bg.jpg');
  3. 动态路径问题

    javascript
    // 错误:public 目录无法使用模板语法
    const path = `/images/${fileName}.png` // 可能 404
    
    // 正确:使用 require 动态加载 assets
    const path = require(`@/assets/images/${fileName}.png`)

性能优化建议

  1. public 使用原则

    • 单文件 > 500KB 时优先使用
    • 需要跨项目共享的配置文件
    • 必须保持原始文件名的资源
  2. assets 使用原则

    • 小于 10KB 的图片自动转 Base64
    • 需要按需加载的代码分割文件
    • 需要哈希命名的缓存策略文件

✨ 网站运行时间: 3年11月15天 ❤️ 道阻且长,行则将至 - 微信号: heikedreamer