基本概念
在 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 支持一些可选参数,用于控制静态文件的行为。可以通过第二个参数传入一个配置对象。
常用配置参数:
-
dotfiles- 控制是否允许访问以点(
.)开头的文件(如.htaccess)。 - 可选值:
'allow'、'deny'、'ignore'(默认)。 - 示例:
app.use(express.static('public', { dotfiles: 'allow' }));
- 控制是否允许访问以点(
-
etag- 控制是否生成 ETag 响应头(用于缓存验证)。
- 默认值:
true。 - 示例:
app.use(express.static('public', { etag: false }));
-
extensions- 设置自动扩展名。如果请求的文件未找到,Express 会尝试添加指定的扩展名。
- 示例:
app.use(express.static('public', { extensions: ['html', 'htm'] })); - 访问
/about时,如果about.html存在,则会返回该文件。
-
index- 设置目录的默认索引文件。如果请求的是一个目录,Express 会返回该文件。
- 默认值:
'index.html'。 - 示例:
app.use(express.static('public', { index: 'default.html' }));
-
lastModified- 控制是否设置
Last-Modified响应头(用于缓存验证)。 - 默认值:
true。 - 示例:
app.use(express.static('public', { lastModified: false }));
- 控制是否设置
-
maxAge- 设置静态资源的缓存时间(以毫秒为单位)。
- 示例:
app.use(express.static('public', { maxAge: 86400000 })); // 缓存 1 天
-
redirect- 控制是否重定向到带斜杠的路径(当请求的是一个目录时)。
- 默认值:
true。 - 示例:
app.use(express.static('public', { redirect: false }));
-
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 成为托管静态资源的理想选择。