使用 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 相关文章推荐
Javascript模块模式分析
May 16 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
Jul 31 Javascript
Js中setTimeout()和setInterval() 何时被调用执行的用法
Apr 12 Javascript
jQuery在html有效在jsp无效的原因及解决方法
Aug 02 Javascript
用JQuery实现全选与取消的两种简单方法
Feb 22 Javascript
jquery实现弹出层效果实例
May 19 Javascript
使用JS中的exec()方法构造正则表达式验证
Aug 01 Javascript
使用bootstrap实现多窗口和拖动效果
Sep 22 Javascript
vue-cli项目中使用Mockjs详解
May 14 Javascript
解决vue 绑定对象内点击事件失效问题
Sep 05 Javascript
从零开始封装自己的自定义Vue组件
Oct 09 Javascript
微信小程序缓存过期时间的使用详情
May 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
jQuery UI 实现email输入提示实例
2013/08/15 Javascript
IE与FireFox的JavaScript兼容问题解决办法
2013/12/31 Javascript
基于jQuery实现复选框的全选 全不选 反选功能
2014/11/24 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
JavaScript多线程详解
2015/08/12 Javascript
JavaScript实现图像模糊化的方法实例
2017/01/15 Javascript
简单实现js无缝滚动效果
2017/02/05 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
2017/04/22 Javascript
Vue Spa切换页面时更改标题的实例代码
2017/07/15 Javascript
javascript 中事件冒泡和事件捕获机制的详解
2017/09/01 Javascript
浅谈JS对象添加getter与setter的5种方法
2018/06/09 Javascript
jquery使用FormData实现异步上传文件
2018/10/25 jQuery
Vue+Element UI 树形控件整合下拉功能菜单(tree + dropdown +input)
2020/08/28 Javascript
JavaScript实现轮播图效果
2020/10/30 Javascript
JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法
2021/01/29 Javascript
[06:13]DOTA2进化论(修改版)
2013/10/08 DOTA
详解Python网络爬虫功能的基本写法
2016/01/28 Python
Python并发之多进程的方法实例代码
2018/08/15 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
2018/10/16 Python
Python Pywavelet 小波阈值实例
2019/01/09 Python
Python实现计算文件MD5和SHA1的方法示例
2019/06/11 Python
python操作kafka实践的示例代码
2019/06/19 Python
python已协程方式处理任务实现过程
2019/12/27 Python
iHerb香港:维生素、补充剂和天然保健品
2017/08/01 全球购物
Michael Kors香港官网:美国奢侈品品牌
2019/12/26 全球购物
服装销售人员求职自我评价
2013/09/26 职场文书
交通事故赔偿协议书范本
2014/04/15 职场文书
小学教师读书活动总结
2014/07/08 职场文书
个人向公司借款协议书
2014/10/09 职场文书
大学生暑假实习总结
2015/07/13 职场文书
班级元旦晚会开幕词
2016/03/04 职场文书
求职信:会计求职的写作技巧
2019/04/24 职场文书
pytorch实现线性回归以及多元回归
2021/04/11 Python
Python基础之元类详解
2021/04/29 Python
SpringCloud Function SpEL注入漏洞分析及环境搭建
2022/04/08 Java/Android
Golang 对es的操作实例
2022/04/20 Golang