前言
Koa 是一款轻量级的 Node.js Web 框架。它的中间件机制和异步风格使得它在处理 HTTP 请求时效率很高,而且使用起来也相对简单。
在开发 Web 应用时,我们通常需要提供一些静态资源,比如图片、CSS、JavaScript 文件等,让页面更加丰富和交互。本文将介绍如何使用 Koa 提供静态资源服务的最佳实践。
Koa 静态资源服务的基本用法
Koa 提供了一款中间件 koa-static,可以帮助我们方便地提供静态资源服务。这个中间件使用起来非常简单:
const Koa = require('koa'); const static = require('koa-static'); const app = new Koa(); app.use(static('public')); app.listen(3000);
上面的代码中,我们将 koa-static
中间件挂载在了应用实例上,然后指定了要提供静态资源的目录 public
,这个目录下的文件就可以被通过 HTTP 访问了。
在默认情况下,访问静态资源时可以使用 URL 路径和文件路径一一对应,例如 public/css/style.css
可以通过 http://localhost:3000/css/style.css
访问。
Koa 静态资源服务的配置
koa-static
中还有一些配置项可以供我们使用。
配置缓存
我们可以通过设置 maxage
配置项来控制浏览器如何缓存静态资源:
app.use(static('public', { maxage: 60 * 60 * 24 * 365 // 一年 }));
配置压缩
我们可以通过设置 gzip
配置项来开启 Gzip 压缩:
app.use(static('public', { gzip: true }));
配置前缀
我们可以通过设置 prefix
配置项来指定 URL 前缀,这样访问静态资源时就必须加上指定的前缀,例如:
app.use(static('public', { prefix: '/static' }));
上面的配置意味着,我们要访问静态资源时就必须在 URL 前面加上 /static
,例如 http://localhost:3000/static/css/style.css
。
配置索引文件
我们可以通过设置 index
配置项来指定目录下的默认文件,例如:
app.use(static('public', { index: 'index.html' }));
上面的配置意味着,当访问一个目录时,如果目录下有 index.html
文件,则返回这个文件作为默认资源。
在实际的应用中,我们需要根据具体情况来制定最佳实践。下面是一些常用的最佳实践:
将静态资源放到 CDN 上
当我们的 Web 应用访问量很大时,我们可以考虑将静态资源放到 CDN 上,这样可以大大提高访问速度和用户体验。
缓存控制
我们可以通过设置响应头来控制浏览器和代理服务器如何缓存静态资源:
app.use(static('public', { setHeaders: (res, path, stat) => { res.set('Cache-Control', 'public, max-age=31536000'); } }));
上面的代码中,我们通过设置响应头中的 Cache-Control
来控制缓存,这里的设置表示该资源可以被公共缓存,最长缓存时间为 1 年。
本地开发时使用 HTTP2
我们可以使用 http2 模块来使用 HTTP2 协议,这样可以大大提高本地开发时的访问速度:
-- -------------------- ---- ------- ----- ----- - ----------------- ----- -- - -------------- ----- --- - --- ------ -------------------------- ----- ------ - -------------------------- ---- -------------------------------- ----- ------------------------------- -- ---------------- --------------------
上面的代码中,我们使用 http2.createSecureServer
函数创建了一个 HTTPS 服务器,并配置了证书和密钥,然后将 Koa 的 callback
函数作为回调函数传递给 createSecureServer
函数。
最后让 HTTPS 服务器监听 3000 端口。
总结
本文介绍了如何使用 Koa 提供静态资源服务的基本用法,并提供了一些最佳实践,希望可以对你有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6493d59b48841e989416dab9