使用 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 相关文章推荐
获取当前网页document.url location.href区别总结
May 10 Javascript
基于Jquery的温度计动画效果
Jun 18 Javascript
JavaScript高级程序设计 读书笔记之九 本地对象Array
Feb 27 Javascript
jQuery实现单行文字间歇向上滚动源代码
Jun 02 Javascript
简介JavaScript中的italics()方法的使用
Jun 08 Javascript
Javascript中的方法和匿名方法实例详解
Jun 13 Javascript
AngularJs  Understanding Angular Templates
Sep 02 Javascript
微信小程序之裁剪图片成圆形的实现代码
Oct 11 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
Feb 22 Javascript
详解ES6 export default 和 import语句中的解构赋值
May 28 Javascript
浅谈vue 多个变量同时赋相同值互相影响
Aug 05 Javascript
vue-cropper组件实现图片切割上传
May 27 Vue.js
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重定向的三种方法分享
2012/02/22 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
2016/10/08 PHP
Laravel 登录后清空COOKIE的操作方法
2019/10/14 PHP
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
node.js中的fs.appendFileSync方法使用说明
2014/12/17 Javascript
在JavaScript中操作时间之getMonth()方法的使用
2015/06/10 Javascript
代码分析jQuery四种静态方法使用
2015/07/23 Javascript
easyui Draggable组件实现拖动效果
2015/08/19 Javascript
js+ajax实现获取文件大小的方法
2015/12/08 Javascript
微信小程序 倒计时组件实现代码
2016/10/24 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
JS原生轮播图的简单实现(推荐)
2017/07/22 Javascript
详解webpack babel的配置
2018/01/09 Javascript
nuxt.js中间件实现拦截权限判断的方法
2018/11/21 Javascript
记录一次完整的react hooks实践
2019/03/11 Javascript
pm2启动ssr失败的解决方法
2019/06/29 Javascript
JavaScript实现的开关灯泡点击切换特效示例
2019/07/08 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
Vue混入mixins滚动触底的方法
2019/11/22 Javascript
[20:21]《一刀刀一天》第十六期:TI国际邀请赛正式打响,总奖金超过550万
2014/05/23 DOTA
使用python实现rsa算法代码
2016/02/17 Python
python读取Excel实例详解
2018/08/17 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
2019/08/12 Python
Pycharm pyuic5实现将ui文件转为py文件,让UI界面成功显示
2020/04/08 Python
tensorflow实现从.ckpt文件中读取任意变量
2020/05/26 Python
Python tkinter界面实现历史天气查询的示例代码
2020/08/23 Python
Python识别处理照片中的条形码
2020/11/16 Python
python help函数实例用法
2020/12/06 Python
Python 带星号(* 或 **)的函数参数详解
2021/02/23 Python
css3 box-shadow阴影(外阴影与外发光)图示讲解
2017/08/11 HTML / CSS
介绍一下游标
2012/01/10 面试题
干部作风建设年活动剖析材料
2014/10/23 职场文书
初中信息技术教学反思
2016/02/16 职场文书
关于html选择框创建占位符的问题
2021/06/09 HTML / CSS
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技
详解MySQL的内连接和外连接
2023/05/08 MySQL