Express 如何处理静态文件,比如加载图片、样式表等资源,需要配置哪些参数?

574 阅读3分钟

基本概念

在 Express 中,处理静态文件(如图片、样式表、JavaScript 文件等)非常简单。Express 提供了一个内置的中间件 express.static,用于托管静态资源。以下是详细的使用方法和配置参数:

1. 基本用法

使用 express.static 中间件可以指定一个目录作为静态资源的根目录。客户端可以直接访问该目录下的文件。

示例:

假设项目的静态文件存放在 public 目录下:

project/
├── public/
│   ├── css/
│   │   └── style.css
│   ├── js/
│   │   └── script.js
│   └── images/
│       └── logo.png
├── app.js

app.js 中配置静态文件服务:

const express = require('express');
const app = express();

// 将 public 目录设置为静态资源目录
app.use(express.static('public'));

app.listen(3000, () => {
    console.log('Server is running on http://localhost:3000');
});
  • 访问 http://localhost:3000/css/style.css 可以加载样式表。
  • 访问 http://localhost:3000/images/logo.png 可以加载图片。

2. 虚拟路径前缀

如果希望为静态资源添加一个虚拟路径前缀,可以在 express.static 中指定前缀。

示例:

app.use('/static', express.static('public'));
  • 访问 http://localhost:3000/static/css/style.css 可以加载样式表。
  • 访问 http://localhost:3000/static/images/logo.png 可以加载图片。

3. 多个静态资源目录

可以多次调用 express.static 来托管多个静态资源目录。

示例:

app.use(express.static('public')); // 托管 public 目录
app.use(express.static('files'));  // 托管 files 目录

Express 会按照中间件注册的顺序查找文件。如果 public 目录和 files 目录中都有同名文件,则会优先返回 public 目录中的文件。


4. 配置参数

express.static 支持一些可选参数,用于控制静态文件的行为。可以通过第二个参数传入一个配置对象。

常用配置参数:

  1. dotfiles

    • 控制是否允许访问以点(.)开头的文件(如 .htaccess)。
    • 可选值:'allow''deny''ignore'(默认)。
    • 示例:
      app.use(express.static('public', { dotfiles: 'allow' }));
      
  2. etag

    • 控制是否生成 ETag 响应头(用于缓存验证)。
    • 默认值:true
    • 示例:
      app.use(express.static('public', { etag: false }));
      
  3. extensions

    • 设置自动扩展名。如果请求的文件未找到,Express 会尝试添加指定的扩展名。
    • 示例:
      app.use(express.static('public', { extensions: ['html', 'htm'] }));
      
    • 访问 /about 时,如果 about.html 存在,则会返回该文件。
  4. index

    • 设置目录的默认索引文件。如果请求的是一个目录,Express 会返回该文件。
    • 默认值:'index.html'
    • 示例:
      app.use(express.static('public', { index: 'default.html' }));
      
  5. lastModified

    • 控制是否设置 Last-Modified 响应头(用于缓存验证)。
    • 默认值:true
    • 示例:
      app.use(express.static('public', { lastModified: false }));
      
  6. maxAge

    • 设置静态资源的缓存时间(以毫秒为单位)。
    • 示例:
      app.use(express.static('public', { maxAge: 86400000 })); // 缓存 1 天
      
  7. redirect

    • 控制是否重定向到带斜杠的路径(当请求的是一个目录时)。
    • 默认值:true
    • 示例:
      app.use(express.static('public', { redirect: false }));
      
  8. setHeaders

    • 自定义设置响应头。
    • 示例:
      app.use(express.static('public', {
          setHeaders: (res, path, stat) => {
              res.set('Cache-Control', 'public, max-age=3600'); // 设置缓存头
          }
      }));
      

5. 综合示例

以下是一个完整的示例,展示了如何配置静态文件服务并设置参数:

const express = require('express');
const app = express();

// 托管 public 目录,并设置缓存时间为 1 天
app.use(express.static('public', {
    maxAge: 86400000,
    setHeaders: (res, path, stat) => {
        res.set('X-Custom-Header', 'Static File');
    }
}));

// 托管 files 目录,并添加虚拟路径前缀 /static
app.use('/static', express.static('files'));

app.listen(3000, () => {
    console.log('Server is running on http://localhost:3000');
});

6. 注意事项

  • 安全性:确保静态资源目录不包含敏感文件(如配置文件、源代码等)。
  • 性能:对于生产环境,建议启用缓存(如 maxAge)以减少服务器负载。
  • 路径问题:静态资源的路径是相对于项目根目录的,确保路径正确。

总结

Express 通过 express.static 中间件提供了简单而强大的静态文件处理功能。通过合理配置参数,可以灵活控制静态资源的行为,如缓存、响应头、索引文件等。这使得 Express 成为托管静态资源的理想选择。