Express.js 静态文件服务的详解

阅读时长 6 分钟读完

Express.js 是当今最流行的 Node.js Web 框架之一,它可以快速地搭建 Web 应用程序。在使用 Express.js 开发 Web 应用程序时,我们通常需要提供一些静态文件(如 HTML、CSS、JS、图片等)给客户端访问。本文将为大家详细介绍如何使用 Express.js 提供静态文件服务。

为什么需要静态文件服务

Web 页面中通常需要加载各种文件,包括 HTML、CSS、JS、图片、字体等等。这些文件可以分为两种类型:动态文件和静态文件。动态文件通常需要服务器动态生成,如使用模板语言渲染的 HTML 文件、通过数据库查询生成的 JSON 文件等。而静态文件则是服务器直接返回给客户端的文件,一般不需要经过处理。

静态文件在 Web 开发中占据重要地位,因为由于其文件体积较小,可以直接由 CDN 加速,从而提高网页加载速度。为了提供静态文件服务,Web 服务器需要能够直接查找并返回这些静态资源,并在路由上进行一些映射,将请求路由到正确的文件目录下。

对于 Express.js 而言,它提供了一种极其方便的静态文件服务中间件——express.static

使用 express.static 服务静态文件

Express.js 中的 express.static 中间件可以使我们方便地服务静态文件,这个方法接收一个参数,即静态文件所在的根目录。例如,下面我们可以将项目的 public 目录作为静态文件服务的根目录:

假设我们有一个 public 目录,里面包含了 index.htmlstyle.cssapp.js 等文件,那么我们可以通过访问 http://localhost:3000/index.htmlhttp://localhost:3000/style.csshttp://localhost:3000/app.js 来访问这些文件。

值得注意的是,当访问 http://localhost:3000 时,会默认寻找到该目录下的 index.html 文件,因此也可以直接通过 http://localhost:3000 访问该文件。同时,我们还可以使用多个静态文件服务,为不同的路由服务不同的静态文件:

此时,访问 /public 路由时会返回 public 目录下的静态文件,而访问 /assets 路由时会返回 assets 目录下的静态文件。

静态文件服务的配置选项

在使用 express.static 中间件时,我们可以传入一些配置选项,例如:

这些配置选项的意义如下:

  • dotfiles"allow" 设为允许访问 .filename 的文件,"deny" 设为禁止访问(默认为 ignore,不处理此类文件)。
  • etag:生成一个 ETag,用于判断文件是否有修改,以便浏览器从缓存中获取文件。
  • lastModified:生成一个 Last-Modified 时间,用于判断文件是否有修改,以便浏览器从缓存中获取文件。
  • setHeaders:设置响应头。

自定义静态文件服务

如果希望自己手动实现一个静态文件服务,也可以使用如下代码:

-- -------------------- ---- -------
----- ---- - ----------------
----- -- - -----------------------
----- ---- - ----------------
----- ---- - ----------------

-------------------------- ----- ---- -
  ----- -------- - -------------------- ---------
  --------------------------- -- -
    -- -------------------- -
      ------ ------------------------------- -- -
        ------------------ -
          --------------- ------------
          ---------- -------
        ---
        ---------------------- -- --- -------------------------------------------
      ---
    - ---- -
      ----- ---- - ---------------------- -- ---------------------------
      ------------------ -
        --------------- -----
        ---------- --------
        ---------------- --------------
      ---
      ----------------------------------------
    -
  ---------- -- -
    ------------------ -
      --------------- ------------
    ---
    ------------ --------
  ---
--------------- -- -- --------------------------------------

这个代码监听 3000 端口,请求时将请求的文件路径解析出来,然后使用 fs.stat 异步操作获取文件信息。如果是目录,则列出目录下的所有文件;如果是文件,则根据文件类型(mime)返回对应的 Content-Type。文件读取时使用 fs.createReadStream,将文件内容传输到响应流中。如果找不到文件,则返回 404。

总结

Express.js 提供了一种非常简单的静态文件服务方式——使用 express.static 中间件。它可以自动推导文件 MIME 类型、在默认情况下会按顺序寻找多个同名文件类型并返回第一个,同时还支持在输出响应前处于响应头。同时,我们还可以使用自定义的代码实现静态文件服务并配置不同选项,更加灵活地处理 Web 开发中的静态资源。在实际开发中按需使用不同方法,才能更好地提高 Web 应用程序的性能与开发效率。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6475f72c968c7c53b02f19c5

纠错
反馈