使用 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 类方法定义还是有点区别
Apr 15 Javascript
JQuery对class属性的操作实现按钮开关效果
Oct 11 Javascript
jQuery过滤选择器:not()方法使用介绍
Apr 20 Javascript
13 款最热门的 jQuery 图像 360 度旋转插件推荐
Dec 09 Javascript
node.js中的events.emitter.listeners方法使用说明
Dec 10 Javascript
node.js中的socket.io的广播消息
Dec 15 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
Jun 20 Javascript
jQuery插件zTree实现更新根节点中第i个节点名称的方法示例
Mar 08 Javascript
MUI  Scroll插件的使用详解
Apr 13 Javascript
js微信应用场景之微信音乐相册案例分享
Aug 11 Javascript
JavaScript定时器setTimeout()和setInterval()详解
Aug 18 Javascript
es6函数之尾递归用法实例分析
Apr 25 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下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
2011/06/09 PHP
php+MySQL实现登录时验证登录名和密码是否正确
2016/05/10 PHP
比较完整的微信开发php代码
2016/08/02 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
php常用的工具开发整理
2019/09/26 PHP
jquery选择器大全 全面详解jquery选择器
2014/03/06 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
2015/08/22 Javascript
学习JavaScript设计模式(接口)
2015/11/26 Javascript
使用微信小程序开发前端【快速入门】
2016/12/05 Javascript
jquery设置css样式的多种方法(总结)
2017/02/21 Javascript
jQuery实现 上升、下降、删除、添加一行代码
2017/03/06 Javascript
vue 注册组件的使用详解
2018/05/05 Javascript
vue 监听某个div垂直滚动条下拉到底部的方法
2018/09/15 Javascript
jquery实现Ajax请求的几种常见方式总结
2019/05/28 jQuery
[38:21]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS LGD-CDEC
2014/05/22 DOTA
[01:00:10]完美世界DOTA2联赛PWL S2 FTD vs Inki 第二场 11.21
2020/11/24 DOTA
Python中关键字is与==的区别简述
2014/07/31 Python
在Python的Django框架中为代码添加注释的方法
2015/07/16 Python
python中实现指定时间调用函数示例代码
2017/09/08 Python
基于Django的ModelForm组件(详解)
2017/12/07 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
Python 20行简单实现有道在线翻译的详解
2019/05/15 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
2019/06/25 Python
使用python+poco+夜神模拟器进行自动化测试实例
2020/04/23 Python
纯css3实现思维导图样式示例
2018/11/01 HTML / CSS
经济系大学生求职信
2013/10/01 职场文书
暑期社会实践学生的自我评价
2014/01/09 职场文书
公司应聘求职信
2014/06/21 职场文书
关于青春的演讲稿三分钟
2014/08/22 职场文书
教师竞聘上岗演讲稿
2014/09/03 职场文书
反腐倡廉警示教育活动心得体会
2014/09/04 职场文书
中职毕业生自我鉴定范文(3篇)
2014/09/28 职场文书
Python Numpy之linspace用法说明
2021/04/17 Python
如何利用opencv判断两张图片是否相同详解
2021/07/07 Python
Python实战之大鱼吃小鱼游戏的实现
2022/04/01 Python
Typescript类型系统FLOW静态检查基本规范
2022/05/25 Javascript