广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >详解Nodejs之静态资源处理
  • 419
分享到

详解Nodejs之静态资源处理

静态详解资源 2022-06-04 17:06:57 419人浏览 安东尼
摘要

前言 刚开始用nodejs写简单的WEB服务器的时候,总是感觉少了点什么。 原来,我一直是在页面上输出什么Hello World!啊, It Works.之类的了。还确实没有处理关于CSS, js这些引用的

前言

刚开始用nodejs写简单的WEB服务器的时候,总是感觉少了点什么。

原来,我一直是在页面上输出什么Hello World!啊, It Works.之类的了。还确实没有处理关于CSSjs这些引用的静态相关的资源。

一开始觉得处理这些东西应该会非常的easy,结果发现不仅仅是这么回事。途中也遇到了一些人们经常可能会犯的想当然的错误。于是我就决定好好的记录一下关于nodejs中对于静态资源的处理。

着眼于问题

重现问题

先来展示一下目录结构吧。


E:CODENODEJSLEARNWEBEXPRESS-STATIC
│ server.js
│
├─html
│   index.html
│
└─public
  ├─css
  │   index.css
  │
  ├─imgs
  │   1.gif
  │
  └─js
      index.js

这样一个web项目的骨架就算是搭建好了。下面简单的使用nodejs的Http模块实现一个web服务器。目标就是显示index.html

index.html


<html>
  <head>
    <meta charset="UTF-8">
    <title>My Index Page</title>
    <link rel="stylesheet" href="/public/css/index.css" rel="external nofollow" >
  </head>
  <body>
    <h1>It Works.</h1>
    <hr>
    <img src="/public/imgs/1.gif" />
  </body>
</html>

index.css


* {
  padding: 0px;
  margin: 0px;
}

h1 {
  color: yellowgreen;
}

body {
  background-color: #2C001E;
}

server.js


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


function handle_request(req, res) {

  // 客户端对服务器的请求,说白了就是对相关文件内容的请求。
  res.writeHead(200, { 'Content-Type': 'text/html' });
  res.end(get_file_content(__dirname + '\' + 'html' + '\' + 'index.html'));
}

function get_file_content(filepath) {
  return fs.readFileSync(filepath);
}

var server = http.createServer(handle_request);
server.listen(8080);

代码中用到了一个名为__dirname的变量,其值就是当前运行文件的绝对路径。通过它,我们可以组装出我们想要获取的文件的全路径。

运行代码,开启服务器。


node server.js

发现问题

然后我们打开浏览器,会发现这样的景象。

查看图片

没有任何效果的页面

不仅是CSS样式没显示出来,就连图片也同样没有正确显示。

然后我们打开浏览器控制台,会发现客户端向服务器发送了3次请求,分别是:

查看图片

客户端请求内容

localhost: HTML代码页 index.css: 样式文件 1.gif: 图片文件

之所以我们没能看到具体的效果,就是因为服务器没有正确返回相关的内容啊。这样一想,一下子就恍然大悟了。所以这颗Silver Bullet就是

针对每一个不同的资源请求,正确的返回相关的内容。

解决问题

我的思路:

剖析request请求地址。分割出文件名,后缀名。 根据后缀补全相关文件在文件系统中的全路径。 根据全路径读取内容,返回给客户端。

server.js

然后简单的修改了一下server.js,当然这里也只是简单的做下示意,生产代码可千万不要这么写。


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


function handle_request(req, res) {

  // 不管是什么请求,对文件的请求的话,应该是针对后缀名进行内容读取发放。
  var suffix = req.url.substr(req.url.length - 4, req.url.length);
  var realpath = __dirname + '\' + 'public' + '\';
  var filename = req.url.substr(req.url.length - 9);
  if (suffix === '.css') {
    res.writeHead(200, { 'Content-Type': 'text/css' });
    res.end(get_file_content(realpath + '\css\' + filename));
  } else if (suffix === '.gif') {
    res.writeHead(200, {'Content-Type': 'image/gif'});
    res.end(get_file_content(realpath+'\imgs\1.gif'));
  } else {
    res.writeHead(200, { 'Content-Type': 'text/html' });
    res.end(get_file_content(__dirname + '\' + 'html' + '\' + 'index.html'));
  }
}

function get_file_content(filepath) {
  return fs.readFileSync(filepath);
}

var server = http.createServer(handle_request);
server.listen(8080);

然后重启服务器。


node server.js

再次访问浏览器

http://localhost:8080

如下:

查看图片

因为没有录屏,所以没体现出GIF图的效果,不过关于静态资源已经足够显示了。

express

还有一个比较好用的web框架,express,其对于静态资源的支持更加方便。属于一个更加高层的封装。

核心

通过express对象的app.use(express.static(folder_path))方法就可以了。方法的参数指定为相关的静态资源文件夹路径即可。

server-express.js



let express = require('express');
let fs = require('fs');
let path = require('path');


var app = express();

app.use(express.static(path.join(__dirname, './public')));

app.all('/', function(req, res){
  console.log("=======================================");
  console.log("请求路径:"+req.url);
  var filename = req.url.split('/')[req.url.split('/').length-1];
  var suffix = req.url.split('.')[req.url.split('.').length-1];
  console.log("文件名:", filename);
  if(req.url==='/'){
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end(get_file_content(path.join(__dirname, 'html', 'index.html')));
  }else if(suffix==='css'){
    res.writeHead(200, {'Content-Type': 'text/css'});
    res.end(get_file_content(path.join(__dirname, 'public', 'css', filename)));
  }else if(suffix in ['gif', 'jpeg', 'jpg', 'png']) {
    res.writeHead(200, {'Content-Type': 'image/'+suffix});
    res.end(get_file_content(path.join(__dirname, 'public', 'images', filename)));
  }
});


function get_file_content(filepath){
  return fs.readFileSync(filepath);
}

app.listen(8080);

index.html

因为刚才使用了静态资源控制,也就是说我们可以简化HTML页面中对于静态资源的路径拼写。比如:

原来在HTML页面中要这么写:


<img src='/public/images/1.gif' />

现在只需要这么写了:


<img src='/images/1.gif' />

看起来就是少了个 /public, 但是实际上通过这一点就可以表明express 其实帮我们省去了很多枯燥的工作内容。

然后打开浏览器就可以看到具体的静态资源内容了。

查看图片

那么对于不同的图片类型的支持程度如何呢?

下面修改一下HTML页面:


<html>
  <head>
    <meta charset="UTF-8">
    <title>My Index Page</title>
    <link rel="stylesheet" href="/css/index.css" rel="external nofollow" >
  </head>
  <body>
    <h1>It Works.</h1>
    <hr>
    <img src="/images/1.gif" /><br>
    <img src="/images/2.jpg" alt=""><br>
    <img src="/images/3.png" alt=""><br>
  </body>
</html>

打开浏览器查看对于gif, png, jpg的支持如何?

查看图片

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: 详解Nodejs之静态资源处理

本文链接: https://www.lsjlt.com/news/12558.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Nodejs之静态资源处理
    前言 刚开始用Nodejs写简单的web服务器的时候,总是感觉少了点什么。 原来,我一直是在页面上输出什么Hello World!啊, It Works.之类的了。还确实没有处理关于CSS, JS这些引用的...
    99+
    2022-06-04
    静态 详解 资源
  • SpringBoot之导入静态资源详解
    目录一、分析源码二、webjars方式三、导入静态资源四、自定义静态资源路径(不推荐)一、分析源码 我们学完之前的框架,大概知道静态资源过滤是由mvc处理的,然后在分析自动装配的时候...
    99+
    2022-11-12
  • SpringBootWeb详解静态资源规则与定制化处理
    目录1.相关概念2.静态资源目录3.静态资源访问前缀4.欢迎页支持5.自定义favicon6.源码分析1.相关概念 Spring Boot 默认为我们提供了静态资源处理,使用 Web...
    99+
    2022-11-13
  • struts2配置静态资源代码详解
    Struts2框架有两个核心配置文件:struts.xml和Struts2默认属性文件default.properties(在struts2-core-2.3.20.jar中)default.properties可以通过自己在classpa...
    99+
    2023-05-31
    struts2 配置静态资源 st
  • Spring Boot的静态资源如何处理
    这篇文章主要介绍“Spring Boot的静态资源如何处理”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring Boot的静态资源如何处理”文章能帮助大家解决...
    99+
    2022-10-19
  • 详解用node搭建简单的静态资源管理器
    本文介绍了用node搭建简单的静态资源管理器,分享给大家,具体如下: 我么都知道,老牌的3p服务器都是自带静态资源管理器的。但是node不同,它没有web容器,它的路由地址和真实地址可以没有联系,所有no...
    99+
    2022-06-04
    资源管理器 静态 详解
  • js如何处理静态资源文件请求
    这篇文章主要为大家展示了“js如何处理静态资源文件请求”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js如何处理静态资源文件请求”这篇文章吧。html文件<...
    99+
    2022-10-19
  • SpringBoot web静态资源映射实现步骤详解
    目录静态资源映射规则自定义静态资源映射规则静态资源映射规则 “/**” 访问当前项目任何资源,全部找静态资源的文件夹进行映射 静态资源的文件夹包括: &quo...
    99+
    2022-11-13
  • SpringBoot详细讲解静态资源导入的实现
    目录SpringBootWeb开发1. 静态资源导入webjars使用自己的静态资源总结2.制作特殊的首页图标转变Thymeleaf模板引擎引入Thymeleaf取值有无转义循环Sp...
    99+
    2022-11-13
  • spring boot中的静态资源加载处理方式
    1.spring boot默认资源处理Spring Boot 默认为我们提供了静态资源处理,使用 WebMvcAutoConfiguration 中的配置各种属性。spring boot默认加载文件的路径是:/META-INF/resour...
    99+
    2023-05-31
    spring boot 静态资源
  • 解决nginx/apache静态资源跨域访问问题详解
    1. apache静态资源跨域访问 找到apache配置文件httpd.conf 找到这行 #LoadModule headers_module modules/mod_headers.so 把#注释符去掉 Load...
    99+
    2022-06-04
    nginx 跨域访问 apache 跨域访问 静态资源跨域访问
  • SpringBoot静态资源路径的配置与修改详解
    目录默认路径修改路径使用配置文件进行修改使用配置类进行修改默认路径 在Spring Boot 2.7.2版本中,查看默认静态资源路径,在WebProperties.class中如下 ...
    99+
    2022-11-13
  • SpringBoot静态资源路径管理问题怎么解决
    这篇文章主要介绍“SpringBoot静态资源路径管理问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot静态资源路径管理问题怎么解决”文章能帮助大家解决问题。一、默认静态...
    99+
    2023-06-30
  • 使用Express处理请求和托管静态资源方式
    目录ExpressExpress对比Http模块Express的主要作用Express安装Express静态资源处理express.static()托管多个静态资源目录挂载路径前缀E...
    99+
    2022-11-13
  • SpringBoot Web静态资源规则与定制化怎么处理
    今天小编给大家分享一下SpringBoot Web静态资源规则与定制化怎么处理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了...
    99+
    2023-07-02
  • uwsgi+nginx代理Django无法访问静态资源的解决
    在部署uwsgi+nginx代理Django的时候,使用uwsgi访问正常,但是使用nginx代理端口访问的时候无法访问静态资源。 解决方法: 查看nginx启动用户,...
    99+
    2022-11-12
  • 使用springboot对外部静态资源文件的处理操作
    目录springboot对外部静态资源文件的处理1、存方面倒还简单,这里贴上一个获取微信临时素材并保存的方法2、取,由于对springboot不熟悉,所以在这上面踩了坑主要使用到这2...
    99+
    2022-11-12
  • nodejs构建本地web测试服务器 如何解决访问静态资源问题
    直接打开html文件,是以file:///方式打开的,这种方式很多时候会遇到跨域的问题,因此我们一般会搭建一个简易的本地服务器,来运行测试页面。 一、构建静态服务器 1、使用express模块 建立个js文...
    99+
    2022-06-04
    如何解决 静态 服务器
  • 基于Node实现简易serve静态资源服务器的示例详解
    目录前言基础示例简易 serve 实现arg - 命令行参数读取chalk - 控制台信息输出源码扩展rewrite 和 redirect 的区别?前言 静态资源服务器(HTTP 服...
    99+
    2022-11-13
  • 详解Go语言的错误处理和资源管理
    目录一、defer二、错误处理三、统一错误处理的逻辑四、panic五、recover六、error vs panic七、错误处理综合示例一、defer 1. defer保证在函数结束...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作