使用 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 相关文章推荐
jQuery 获取对象 根据属性、内容匹配, 还有表单元素匹配
May 31 Javascript
javascript 伪数组实现方法
Oct 11 Javascript
javascript采用数组实现tab菜单切换效果
Dec 12 Javascript
js设置cookie过期当前时间减去一秒相当于立即过期
Sep 04 Javascript
js简单抽奖代码
Jan 16 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
Jun 19 Javascript
使用node+vue.js实现SPA应用
Jan 28 Javascript
浅析Javascript ES6新增值比较函数Object.is
Aug 24 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
Dec 21 Javascript
微信小程序 input输入框详解及简单实例
Jan 10 Javascript
微信自定义分享链接信息(标题,图片和内容)实现过程详解
Sep 04 Javascript
微信小程序实现列表滚动头部吸顶的示例代码
Jul 12 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
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
PHP使用内置dir类实现目录遍历删除
2015/03/31 PHP
PHP创建单例后台进程的方法示例
2017/05/23 PHP
phpcms配置列表页以及获得文章发布时间
2017/07/04 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
javascript开发技术大全-第1章javascript概述
2011/07/03 Javascript
JavaScript实现统计文本框Textarea字数增强用户体验
2012/12/21 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
2013/10/20 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
jQuery原理系列-css选择器的简单实现
2016/06/07 Javascript
CentOS7中源码编译安装NodeJS的完整步骤
2018/10/13 NodeJs
layui 地区三级联动 form select 渲染的实例
2019/09/27 Javascript
JavaScript中继承原理与用法实例入门
2020/05/09 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
[01:05:12]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS CIS-GAME
2014/05/21 DOTA
[56:00]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第二场
2018/04/10 DOTA
Python正则表达式的使用范例详解
2014/08/08 Python
python使用json序列化datetime类型实例解析
2018/02/11 Python
Python3.4实现远程控制电脑开关机
2018/02/22 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
Django实战之用户认证(初始配置)
2018/07/16 Python
对django中render()与render_to_response()的区别详解
2018/10/16 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
2019/09/23 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
Django使用django-simple-captcha做验证码的实现示例
2021/01/07 Python
Servlet如何得到服务器的信息
2015/12/22 面试题
《真想变成大大的荷叶》教学反思
2014/04/14 职场文书
小学生个人先进事迹材料
2014/05/08 职场文书
房屋买卖授权委托书
2014/09/27 职场文书
万能检讨书2000字
2014/10/17 职场文书
2014年优质护理服务工作总结
2014/11/14 职场文书
检讨书范文1000字
2015/01/28 职场文书
企业宣传语大全
2015/07/13 职场文书
社团招新宣传语
2015/07/13 职场文书
毕业感言怎么写
2015/07/31 职场文书
MySQL一劳永逸永久支持输入中文的方法实例
2022/08/05 MySQL