Node.js中如何处理静态资源

处理静态资源

1、问题描述

浏览器在收到服务器返回的HTML内容之后,就要开始从上到下依次解析,当在解析的过程中,如果发现:

  • link
  • script
  • img
  • iframe
  • video
  • audio

等带有src或者link 的href属性标签的时候,浏览器会自动对这些静态资源发起一个新的请求。我们要对这些新的请求进行处理


2、解决方法

为了方便的统一处理这些静态资源,所以我们约定把所有的静态资源都存放在 public目录,目的是为了统一处理

  • 如果请求路径是以 /public/ 开头的,则服务器认为你要获取 public中的某个资源,所以我们就直接可以把请求路径当作文件路径来直接进行读取

3、代码演示

(1)文件结构
文件结构
(2)index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>首页</title>
  <link rel="stylesheet" href="/public/lib/bootstrap.css">
  <link rel="stylesheet" href="/public/css/main.css">
</head>
<body>
<h1>灰太狼</h1>
<img src="/public/img/1.jpg">
</body>
</html>

  • 注意:在服务端中,文件中的路径就不要去写相对路径了。因为这个时候所有的资源都是通过url标识来获取的。
  • 服务器开放 /public/ 目录
  • 所以代码中的请求路径都写成:/public/xxx
  • / 在这里就是url根路径的意思。
  • 浏览器在真正发请求的时候会最终把url拼接到 http:/ /127.0.0.1:3000上

(3)app.js文件

如果不对那些静态资源进行处理,我们看一下是什么情况

let http = require('http');
let fs = require('fs');

http.createServer(function (request,response) {
  console.log("服务器收到请求");
  let url = request.url;
  if (url === '/') {
    fs.readFile('./views/index.html',function (err,data) {
      if (err) {
        response.end('404');
        return;
      }
      response.end(data)
    })
  }
}).listen(3000,function () {
  console.log('http://127.0.0.1:3000');
})

使用node app.js启动服务器,访问 http://127.0.0.1:3000,打开控制台,结果如图所示。原因就在于我们没有写对这些静态资源进行处理的代码,服务器读取不到它们,也就无法返回给浏览器。下面重新写app.js

结果
(4)app.js(对静态资源进行处理)

//app.js文件

let http = require('http');
let fs = require('fs');

http.createServer(function (request,response) {
  console.log("服务器收到请求");
  let url = request.url;
  if (url === '/') {
    fs.readFile('./views/index.html',function (err,data) {
      if (err) {
        response.end('404');
        return;
      }
      response.end(data)
    })
  } else if (url.indexOf('/public/') !== -1) {
     //此处是关键,当发现请求路径中含有 /public/,我们把请求路径当作文件路径来直接进行读取
    fs.readFile('.' + url,function (err,data) {
      if (err) {
        response.end('404');
        return;
      }
      response.end(data);
    })
  }
}).listen(3000,function () {
  console.log('http://127.0.0.1:3000');
})
  • 我们所有的静态资源都放在了public文件夹中,所以资源的请求路径前都会有 /public/
  • 所以说如果请求路径是以 /public/ 开头的,则服务器认为你要获取 public中的某个资源,我们就直接可以把请求路径当作文件路径来直接进行读取
    在这里插入图片描述

我们重新启动node app.js,访问 http://127.0.0.1:3000,结果如图所示。刷新一下,页面马上就可以显示出来。打开控制台看看,资源也都请求到了。
在这里插入图片描述

4、Node学习资源推荐

延伸阅读
https://blog.csdn.net/weixin_43974265/category_10692693.html

前端学习交流QQ群,群内学习讨论的氛围很好,大佬云集,期待您的加入:862748629 点击加入

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值