使用 node.js 模仿 Apache 小部分功能


Posted in Javascript onJuly 07, 2019

首先,这个例子用到了服务端渲染的技术。服务端渲染,说白了就是在服务端使用模板引擎,这里我先简单的介绍一下服务端渲染与客户端渲染之间的区别。

服务端渲染与客户端渲染之间的区别:

  • 客户端渲染不利于搜索引擎优化
  • 服务端渲染可以被爬虫抓取到,而客户端异步渲染很难被爬虫抓取到(例如:AJAX)
  • 大部分的网站既不是纯异步(客户端),也不是纯服务端渲染出来的,而是两者结合的
  • 例如:京东的商品列表采用的就是服务端渲染,目的是为了SEO搜索引擎优化,说白了就是为了能够被搜索到,且能被爬虫抓取(搜索引擎本身也是一种爬虫)。
  • 而京东的商品评论列表为了用户体验,而且也不需要SEO优化,所以才用的是客户端渲染

简单的判断内容为服务端渲染还是客户端渲染

最简单的方法就是:

  1. 点击访问一个页面(我们这里以京东为例)
  2. 随便访问一个商品页,然后复制商品标题
  3. 然后鼠标右击点击查看网页源代码
  4. 在源代码页按 Ctrl + f ,接着把复制的内容粘贴进去
  5. 能搜到就是 服务端渲染,否则的话,就是客户端渲染。

利用 art-template 模板引擎

  1. 安装: 在想要安装的目录下打开命令行工具  输入 npm install art-template, 然后它会自动生成 node_modules 目录(前提,系统已经安装了 Node.js 环境)
  2. 在需要使用的文件模块中加载 art-template:
  3. const template = require('art-template');
  4. 就可以使用了 , 官方文档地址:https://aui.github.io/art-template/zh-cn/docs/index.html

Apache 部分功能实现

Node.js 相关API(本例中使用):

基于http

  • createServer() : 创建一个服务器
  • on():  提供服务:对数据的服务,发请求,接收请求,处理请求,发送响应,等等
  • listen(): 绑定端口号,启动服务器

基于fs(文件系统)

  • readFile(): 读取文件(参数一为 文件路径,参数二为回调函数)
  • readdir(): 读取目录(参数一位目录路径,参数二为回调函数)

基于path(路径)

  • extname(): 获取文件后缀名
  • 随便在一个位置建立 www 文件夹(文件名可以自己随意):

使用 node.js 模仿 Apache 小部分功能

写HTML:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Index of / {{title}}</title>
</head>
<body>
  <h1>Index of / {{title}}</h1>
  <ul>
    <li><a href="/" rel="external nofollow" > Parent Directory</a></li>
    {{each files}}
    <li><a href="/{{ $value }}" rel="external nofollow" >{{ $value }}/</a></li>
    {{/each}}
  </ul>
</body>
</html>

node.js:

const http = require('http');
const fs = require('fs');
const template = require('art-template');
const path = require('path');
const port = 5000;
const server = http.createServer();
server.on('request', (request, response) => {
  let url = request.url;
  let wwwDir = 'D:/www';
  fs.readFile('./template.html', (error, data) => {
    if (error) {
      return response.end('404 Not Found');
    }
    // 1.如何得到 wwwDir 目录列表中的文件名和目录名
    //   fs.readdir
    // 2.如何将得到的文件名和目录名替换到 template.html 中
    //   2.1 在 template.html 中需要替换的位置预留一个特殊的标记
    //   2.2 根据 files 生成需要的 HTML 内容
    //   模板引擎
    if (url !== '/') {
      wwwDir += url;
    }
    let fileEnd = path.extname(wwwDir);
    /**
     * 如果是文件,则访问该文件
     * 如果是文件夹,则访问里面的内容
     */
    if (fileEnd !== '') {
      fs.readFile(wwwDir, (error, data) => {
        if (error) {
          return response.end('404 Not Found');
        }
        // 获取文件后缀名(具体问题具体分析,这里我只设置 .txt 文件的 编码类型)
        if (fileEnd === '.txt') {
          response.setHeader('Content-Type', 'text/plain; charset=utf-8');
        }
        if (fileEnd === '.jpg') {
          response.setHeader('Content-Type', 'image/jpeg');
        }
        if (fileEnd === '.mp4') {
          response.setHeader('Content-Type', 'video/mpeg4');
        }
        response.end(data);
      });
    } else {
      console.log(wwwDir);
      fs.readdir(wwwDir, (error, files) => {
        if (error) {
          return response.end('Can not find this dir');
        }
        console.log(files);
        // files: [ 'a.txt', 'apple', 'images', 'index.html', 'static', 'videos' ]
        let htmlStr = template.render(data.toString(), {
          title: wwwDir,
          files: files,
        });
        // 3.发送响应数据
        response.end(htmlStr);
      });
    }
  });
});
server.listen(port, () => {
  console.log(`服务器已经开启,您可以通过 http://127.0.0.1:${port} 访问....`);
});

总结

以上所述是小编给大家介绍的使用 node.js 模仿 Apache 小部分功能,希望对大家有所帮助,如果大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
js计数器代码
Nov 04 Javascript
CheckBoxList多选样式jquery、C#获取选择项
Sep 06 Javascript
jquery实现点击展开列表同时隐藏其他列表
Aug 10 Javascript
SublimeText自带格式化代码功能之reindent
Dec 27 Javascript
jQuery日期范围选择器附源码下载
May 23 jQuery
vue数据双向绑定的注意点
Jun 23 Javascript
select自定义小三角样式代码(实用总结)
Aug 18 Javascript
解决Vue2.0中使用less给元素添加背景图片出现的问题
Sep 03 Javascript
layui文件上传控件带更改后数据传值的方法
Sep 23 Javascript
BootstrapValidator实现表单验证功能
Nov 08 Javascript
JQuery中DOM节点的操作与访问方法实例分析
Dec 23 jQuery
JS字符串和数组如何实现相互转化
Jul 02 Javascript
echarts统计x轴区间的数值实例代码详解
Jul 07 #Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
Jul 07 #Javascript
详解django模板与vue.js冲突问题
Jul 07 #Javascript
django中使用vue.js的要点总结
Jul 07 #Javascript
Vue使用lodop实现打印小结
Jul 06 #Javascript
cordova+vue+webapp使用html5获取地理位置的方法
Jul 06 #Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
Jul 06 #Javascript
You might like
PHP程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
PHP利用str_replace防注入的方法
2013/11/10 PHP
PHP实现把文本中的URL转换为链接的auolink()函数分享
2014/07/29 PHP
php的闭包(Closure)匿名函数初探
2016/02/14 PHP
PHP实现Redis单据锁以及防止并发重复写入
2018/04/10 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
2018/05/10 PHP
javascript 简单高效判断数据类型 系列函数 By shawl.qiu
2007/03/06 Javascript
时间戳转换为时间 年月日时间的JS函数
2013/08/19 Javascript
js将字符串转成正则表达式的实现方法
2013/11/13 Javascript
JQuery记住用户名和密码的具体实现
2014/04/04 Javascript
js实现网页随机切换背景图片的方法
2014/11/01 Javascript
javascript格式化json显示实例分析
2015/04/21 Javascript
C++中的string类的用法小结
2015/08/07 Javascript
jQuery实现返回顶部功能
2016/02/23 Javascript
AngularJS基础 ng-mouseenter 指令示例代码
2016/08/02 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
javascript防篡改对象实例详解
2017/04/10 Javascript
详解vue axios中文文档
2017/09/12 Javascript
video.js 实现视频只能后退不能快进的思路详解
2018/08/09 Javascript
[05:00]TI9战队采访 - Royal Never Give Up
2019/08/20 DOTA
Python中的pprint折腾记
2015/01/21 Python
Python复制目录结构脚本代码分享
2015/03/06 Python
django实现同一个ip十分钟内只能注册一次的实例
2017/11/03 Python
Python之读取TXT文件的方法小结
2018/04/27 Python
使用Python自动生成HTML的方法示例
2019/08/06 Python
django的模型类管理器——数据库操作的封装详解
2020/04/01 Python
Python新手学习装饰器
2020/06/04 Python
Python 如何查找特定类型文件
2020/08/17 Python
如何查看浏览器对html5的支持情况
2020/12/15 HTML / CSS
佳能德国网上商店:Canon德国
2017/03/18 全球购物
社团成立邀请函
2014/01/08 职场文书
户外亲子活动策划方案
2014/02/07 职场文书
工程质量承诺书范文
2014/03/27 职场文书
入党积极分子个人总结
2015/03/02 职场文书
Spring Data JPA使用JPQL与原生SQL进行查询的操作
2021/06/15 Java/Android
大型强子对撞机再次重启探索“第五种自然力”
2022/04/29 数码科技