使用 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 相关文章推荐
表单提交验证类
Jul 14 Javascript
js如何实现设计模式中的模板方法
Jul 23 Javascript
JavaScript中自定义事件用法分析
Dec 23 Javascript
javascript实现label标签跳出循环操作
Mar 06 Javascript
谈一谈js中的执行环境及作用域
Mar 30 Javascript
JavaScript 数组some()和filter()的用法及区别
May 20 Javascript
微信小程序 教程之模板
Oct 18 Javascript
js中apply与call简单用法详解
Nov 06 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
Jul 20 Javascript
微信小程序组件传值图示过程详解
Jul 31 Javascript
JavaScript冒泡算法原理与实现方法深入理解
Jun 04 Javascript
vue3不同环境下实现配置代理
May 25 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加密解密函数(动态加密)
2013/06/19 PHP
浅析Apache中RewriteCond规则参数的详细介绍
2013/06/30 PHP
destoon设置自定义搜索的方法
2014/06/21 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
Prototype 学习 工具函数学习($方法)
2009/07/12 Javascript
javascript void(0)的妙用
2009/10/21 Javascript
jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)
2010/10/20 Javascript
javascript 闭包疑问
2010/12/30 Javascript
javascript调试之DOM断点调试法使用技巧分享
2014/04/15 Javascript
基于javascript实现泡泡大冒险网页版小游戏
2016/03/23 Javascript
JavaScript必知必会(六) delete in instanceof
2016/06/08 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
Javascript单例模式的介绍和实例
2016/10/08 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
jquery表单验证插件validation使用方法详解
2017/01/20 Javascript
angular学习之ngRoute路由机制
2017/04/12 Javascript
requirejs + vue 项目搭建详解
2017/06/16 Javascript
强大的JavaScript响应式图表Chartist.js的使用
2017/09/13 Javascript
React Native中NavigatorIOS组件的简单使用详解
2018/01/27 Javascript
vue.js实现标签页切换效果
2018/06/07 Javascript
JS简单数组排序操作示例【sort方法】
2019/05/17 Javascript
js中console在一行内打印字符串和对象的方法
2019/09/10 Javascript
微信小程序后端实现授权登录
2020/02/24 Javascript
[01:15:18]2014 DOTA2国际邀请赛中国区预选赛 LGD VS Speed Gaming.cn
2014/05/22 DOTA
在Python3中初学者应会的一些基本的提升效率的小技巧
2015/03/31 Python
pygame游戏之旅 如何制作游戏障碍
2018/11/20 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
2019/09/04 Python
Python super()方法原理详解
2020/03/31 Python
Python-opencv实现红绿两色识别操作
2020/06/04 Python
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
夏威夷航空官网:Hawaiian Airlines
2016/09/11 全球购物
Windows和Linux动态库应用异同
2016/04/17 面试题
校本教研活动总结
2014/07/01 职场文书
2014年远程教育工作总结
2014/12/09 职场文书
巾帼文明岗事迹材料
2014/12/24 职场文书
前台岗位职责范本
2015/04/16 职场文书