如何在 Express.js 中优雅的管理静态资源

在 web 开发中,静态资源是无法避免的。图片、CSS、JavaScript 文件等都需要被加载到浏览器中供用户使用。在 Express.js 中,管理静态资源也是一个常见的需求。本文将向你介绍如何在 Express.js 中优雅的管理静态资源。

简介

在 Express.js 中,可以使用 express.static 中间件来托管静态文件。express.static 函数可以接受一个参数,即静态资源所在的目录。当有请求访问这个目录下的静态资源时,express 就会从这个目录中找到对应文件并返回给客户端。

使用

在 Express.js 应用中使用 express.static 中间件非常简单。只需要在根路由中调用 express.static 并传入静态资源所在的目录即可。

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

// 将 public 目录下的所有文件托管为静态资源
app.use(express.static('public'))

app.listen(3000, () => {
  console.log('应用已启动...')
})

如上所示,我们可以将 public 目录下的所有文件托管为静态资源。当我们访问 http://localhost:3000/assets/image.png 时,express 就会从 public 目录下寻找 assets/image.png 并将其返回给客户端。

在实际开发中,我建议将静态资源和动态资源分离开来。静态资源可以放在一个独立的目录下,方便进行管理和维护。

指定静态资源路径

在有些情况下,我们可能需要在多个目录中托管静态资源。此时,可以调用多次 express.static 函数,每次传入一个静态资源目录。

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

// 将 public 目录和 files 目录下的所有文件托管为静态资源
app.use(express.static('public'))
app.use(express.static('files'))

app.listen(3000, () => {
  console.log('应用已启动...')
})

如上所示,我们将 public 和 files 目录下的所有文件都托管为静态资源。

静态资源路由

在使用 express.static 时,express 默认将指定目录下的所有文件都托管为静态资源,这可能导致一些不必要的问题。比如我们想要托管的静态资源集中在某一个子目录中,但是这个子目录下也有一些文件不是静态资源,这些文件可能会被 express 当做静态资源处理导致出错。此时,我们需要使用静态资源路由。

静态资源路由可以指定哪些路径在请求时才会被处理成静态资源。

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

// 将 public 目录下的 images 和 css 目录托管为静态资源
app.use('/static', express.static('public', {
  // 定义静态资源路由
  // 只有以 /static/images 和 /static/css 开头的路径才会被处理成静态资源
  // 其它路径会被忽略
  dotfiles: 'ignore',
  index: false,
  etag: true,
  maxAge: '1d',
  redirect: false,
  setHeaders: function (res, path, stat) {
    res.set('x-timestamp', Date.now())
  }
}))

app.listen(3000, () => {
  console.log('应用已启动...')
})

如上所示,我们通过将第一个参数传递给 app.use 方法,定义了静态资源路由。此时,只有以 /static/images/static/css 开头的路径才会被处理成静态资源,其它路径会被忽略。

在这个例子中,我们还使用了一些参数来配置静态资源的缓存和响应头。

总结

本文向你介绍了如何在 Express.js 中优雅的管理静态资源。我们通过使用 express.static 中间件来托管静态文件,且可以指定静态资源路由和资源目录路径。同时,我们还介绍了一些可用的配置参数用于管理缓存和响应头。希望这篇文章能有所帮助,谢谢阅读!

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6594a3c1eb4cecbf2d8f3d51


纠错反馈