sirv
vite启动本地服务时,使用sirv代理静态资源。 sirv github仓库: github.com/lukeed/sirv
sirv 是一个轻量级的静态文件服务中间件,主要用于 Node.js 中提供静态文件服务。它的主要特点和用法如下:
- 基本用法
import sirv from 'sirv';
// 最简单的用法
const serve = sirv('public');
// 在 Express 中使用
app.use(serve);
// 带配置的用法
const serve = sirv('public', {
dev: true,
etag: true,
maxAge: 31536000
});
app.use(serve);
- 在 Vite 中的应用
const serve = sirv(
dir,
sirvOptions({
config: server.config,
getHeaders: () => server.config.server.headers,
}),
)
- 配置选项
const serve = sirv('public', {
// 开发模式,禁用缓存
dev: true,
// 启用 ETag
etag: true,
// 缓存时间(秒)
maxAge: 31536000,
// 是否不可变
immutable: true,
// 单页应用模式
single: true,
// 忽略的文件
ignore: ['*.map', '*.txt'],
// 自定义响应头
headers: {
'Cache-Control': 'no-cache',
'X-Custom-Header': 'value'
},
// 启用 gzip 压缩
gzip: true,
// 启用 brotli 压缩
brotli: true,
// 无匹配时的处理
onNoMatch: (req, res) => {
res.statusCode = 404;
res.end('Not found');
}
});
实际使用
- 开发环境
import express from 'express';
import sirv from 'sirv';
const app = express();
// 开发环境配置
const serve = sirv('public', {
dev: true,
etag: true,
gzip: true
});
app.use(serve);
app.listen(3000);
- 生产环境
import express from 'express';
import sirv from 'sirv';
const app = express();
// 生产环境配置
const serve = sirv('dist', {
dev: false,
etag: true,
maxAge: 31536000,
immutable: true,
gzip: true,
brotli: true
});
app.use(serve);
app.listen(3000);
- 单页应用(SPA)
import express from 'express';
import sirv from 'sirv';
const app = express();
// SPA 配置
const serve = sirv('dist', {
single: true, // 启用 SPA 模式
dev: false,
etag: true
});
app.use(serve);
app.listen(3000);
- 多目录服务
import express from 'express';
import sirv from 'sirv';
const app = express();
// 服务多个目录
app.use('/static', sirv('static'));
app.use('/public', sirv('public'));
app.use('/assets', sirv('assets'));
app.listen(3000);
- 自定义错误处理
import express from 'express';
import sirv from 'sirv';
const app = express();
const serve = sirv('public', {
onNoMatch: (req, res) => {
res.statusCode = 404;
res.end('文件未找到');
}
});
app.use(serve);
app.listen(3000);
- 带缓存的静态文件服务
import express from 'express';
import sirv from 'sirv';
const app = express();
const serve = sirv('public', {
maxAge: 86400, // 1天
immutable: true,
etag: true,
headers: {
'Cache-Control': 'public, max-age=86400, immutable'
}
});
app.use(serve);
app.listen(3000);
- 带压缩的静态文件服务
import express from 'express';
import sirv from 'sirv';
const app = express();
const serve = sirv('public', {
gzip: true,
brotli: true,
headers: {
'Vary': 'Accept-Encoding'
}
});
app.use(serve);
app.listen(3000);