使用 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 相关文章推荐
DOM和XMLHttpRequest对象的属性和方法整理
Jan 04 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
Jun 19 Javascript
js用正则表达式来验证表单(比较齐全的资源)
Nov 17 Javascript
javascript跨域原因以及解决方案分享
Apr 08 Javascript
Angular.js与Bootstrap相结合实现手风琴菜单代码
Apr 13 Javascript
基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
May 12 Javascript
angularJS 如何读写缓冲的方法(推荐)
Aug 06 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
Dec 27 Javascript
js判断节假日实例代码
Dec 27 Javascript
layer更改皮肤的实现方法
Sep 11 Javascript
如何在微信小程序中使用骨架屏的步骤
Jun 12 Javascript
js实现表格数据搜索
Aug 09 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
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
2009/07/01 PHP
认识并使用PHP超级全局变量
2010/01/26 PHP
浅析PHP中strlen和mb_strlen的区别
2014/08/31 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
Prototype使用指南之dom.js
2007/01/10 Javascript
jquery 操作日期、星期、元素的追加的实现代码
2012/02/07 Javascript
jquery validate poshytip 自定义样式
2012/11/26 Javascript
Jquery简单分页实现方法
2015/07/24 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
2016/05/05 Javascript
JS实现页面进入和返回定位到具体位置
2016/12/08 Javascript
详解React 16 中的异常处理
2017/07/28 Javascript
35个最好用的Vue开源库(史上最全)
2019/01/03 Javascript
webgl实现物体描边效果的方法介绍
2019/11/27 Javascript
JS基础之逻辑结构与循环操作示例
2020/01/19 Javascript
小程序使用分包的示例代码
2020/03/23 Javascript
Vue的props父传子的示例代码
2020/05/20 Javascript
vue-drawer-layout实现手势滑出菜单栏
2020/11/19 Vue.js
记录一次websocket封装的过程
2020/11/23 Javascript
ES6的循环与可迭代对象示例详解
2021/01/31 Javascript
Python中tell()方法的使用详解
2015/05/24 Python
Python正则表达式匹配中文用法示例
2017/01/17 Python
Python编程求解二叉树中和为某一值的路径代码示例
2018/01/04 Python
Python3中的bytes和str类型详解
2019/05/02 Python
Python3 文章标题关键字提取的例子
2019/08/26 Python
解决pycharm最左侧Tool Buttons显示不全的问题
2019/12/17 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
python em算法的实现
2020/10/03 Python
利用CSS3实现平移动画效果示例代码
2016/10/12 HTML / CSS
计算机专业学生的自我评价
2013/12/15 职场文书
婚庆公司的创业计划书
2014/01/22 职场文书
大学班长的职责
2014/01/27 职场文书
通知怎么写?
2019/04/17 职场文书
React中的Context应用场景分析
2021/06/11 Javascript
python中pandas对多列进行分组统计的实现
2021/06/18 Python
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
2021/06/21 Oracle