使用 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 相关文章推荐
FusionCharts图表显示双Y轴双(多)曲线
Nov 22 Javascript
详细介绍8款超实用JavaScript框架
Oct 25 Javascript
使用node.js半年来总结的 10 条经验
Aug 18 Javascript
JS实现的数组全排列输出算法
Mar 19 Javascript
JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
Aug 05 Javascript
webpack教程之webpack.config.js配置文件
Jul 05 Javascript
详解angularjs的数组传参方式的简单实现
Jul 28 Javascript
Vue.js 表单控件操作小结
Mar 29 Javascript
JS实现指定区域的全屏显示功能示例
Apr 25 Javascript
Angular请求防抖处理第一次请求失效问题
May 17 Javascript
JS实现省市县三级下拉联动
Apr 10 Javascript
在vue项目中利用popstate处理页面返回的操作介绍
Aug 06 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动态生成JavaScript代码
2009/03/09 PHP
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
2009/09/05 PHP
基于php验证码函数的使用示例
2013/05/03 PHP
关于svn冲突的解决方法
2013/06/21 PHP
获取URL文件名后缀
2013/10/24 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
php实现无限级分类
2014/12/24 PHP
[原创]php使用curl判断网页404(不存在)的方法
2016/06/23 PHP
Yii框架getter与setter方法功能与用法分析
2019/10/22 PHP
javaScript(JS)替换节点实现思路介绍
2013/04/17 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
Nodejs 搭建简单的Web服务器详解及实例
2016/11/30 NodeJs
javascript工厂模式和构造函数模式创建对象方法解析
2016/12/30 Javascript
vue异步axios获取的数据渲染到页面的方法
2018/08/09 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
解决VUE双向绑定失效的问题
2019/10/29 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
如何正确解决VuePress本地访问出现资源报错404的问题
2020/12/03 Vue.js
浅谈python装饰器探究与参数的领取
2017/12/01 Python
Python常见数据类型转换操作示例
2019/05/08 Python
Python参数类型以及常见的坑详解
2019/07/08 Python
关于TensorFlow新旧版本函数接口变化详解
2020/02/10 Python
Python将二维列表list的数据输出(TXT,Excel)
2020/04/23 Python
python:HDF和CSV存储优劣对比分析
2020/06/08 Python
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
canvas与html5实现视频截图功能示例
2016/12/15 HTML / CSS
大学生创业计划书的范文
2014/01/07 职场文书
安全生产实施方案
2014/02/23 职场文书
机关办公室岗位职责
2014/04/16 职场文书
亚运会口号
2014/06/20 职场文书
毕业生就业推荐表导师评语
2014/12/31 职场文书
初一语文教学反思
2016/03/03 职场文书
2019通用版导游词范本!
2019/08/07 职场文书
关于拾金不昧的感谢信(五篇)
2019/10/18 职场文书
PHP实现考试倒计时功能代码
2021/04/16 PHP
剖析后OpLog订阅MongoDB的数据变更就没那么难了
2022/02/24 MongoDB