sirv

52 阅读2分钟

sirv

vite启动本地服务时,使用sirv代理静态资源。 sirv github仓库: github.com/lukeed/sirv

sirv 是一个轻量级的静态文件服务中间件,主要用于 Node.js 中提供静态文件服务。它的主要特点和用法如下:

  1. 基本用法
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);

  1. 在 Vite 中的应用
const serve = sirv(
  dir,
  sirvOptions({
    config: server.config,
    getHeaders: () => server.config.server.headers,
  }),
)
  1. 配置选项
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');
  }
});

实际使用

  1. 开发环境
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);
  1. 生产环境
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);
  1. 单页应用(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);
  1. 多目录服务
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);
  1. 自定义错误处理
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);
  1. 带缓存的静态文件服务
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);
  1. 带压缩的静态文件服务
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);