前言:最近做前端资源监控,看了很多例子,没有达到想要的效果。首先的槽点是PhantomJS的官方文档,真鸡肋,其次是网上的例子,多数是介绍PhantomJS的用法,而并没有介绍怎么完整的去实现,跟官方文档好像也没啥区别......

一、实现了什么?

本文只做一个简单的例子,获取网址加载时间,旨在实现一种思路,而不是很复杂的功能。

主要流程:

前端在页面加载时调用node接口 -> 将URL返回给接口 -> node获取url,然后通过子进程(child_process)启动系统命令 -> 启动PhantomJS
          -> PhantomJS打开url指定的网页,计算加载时间 -> 返回给node接口 -> 接口处理数据 -> 入库

二、主要实现

1、前端获取url

let param = {'url': window.location.protocol + '//' + window.location.host};

将url作为参数传递给接口。

2、NodeJS获取前端传递过来的url并启动phantomjs打开url,数据获取并处理

本文用的是sails框架。

首先是写models定义字段:ResourceMonitor.js

  1. module.exports = {
    connection: '数据库名',
    tableName: '表名',
    autoCreatedAt: true,
    autoUpdatedAt: true,
    attributes: {
    id: {
    type: 'integer',
    primaryKey: true,
    autoIncrement: true
    },
    webAddress: {
    type: 'string'
    },
    loadingTime: {
    type: 'string'
    }
    }
    }

然后写服务:  resourceMonitorService.js

  1. module.exports = {
    async create(resourceMonitor){
    try {
    try {
    if (resourceMonitor.id) {
    let oldResourceMonitor = await ResourceMonitor.findOne({id: resourceMonitor.id});
    Object.assign(oldResourceMonitor, resourceMonitor);
    oldResourceMonitor.save(function (err) {
    if (err) throw err;
    return oldResourceMonitor;
    })
    } else {
    return ResourceMonitor.create(resourceMonitor);
    }
    } catch (err) {
    throw err;
    }
    } catch (err) {
    throw err;
    }
    }
    }

接着是controller: resourceMonitorController.js

  1. const Cmd = require('cmd')
    module.exports = {
    async create(req, res){
    try {
    let url = req.body['url']
    let resource = await Cmd.resourceMonitorPhantom(url);//启动phantomJS
    if (!resource) return;
    resource = resource.replace(/[\s\n\r]+/g, "")//正则去除空格换行符回车符
    let loadingTime = resource.match(/total:(\S*)ms/)[1] + ' ms';//正则匹配'total:'和'ms'之间的所有非空白内容,并在返回结果后面加上'ms'
    let webAddress = resource.match(/webAddress:(\S*)total:/)[1];//正则匹配'webAddress:'和'total:'之间的所有非空白内容
    let resourceMonitor = {webAddress, loadingTime}
    if (!resourceMonitor) {
    sails.log.error("参数异常 " + JSON.stringify(resourceMonitor))
    return res.send({code: -1, msg: "参数异常"})
    }
    resourceMonitorService.create(resourceMonitor).then(function (data) {
    return res.send({code: 1, msg: "success", data: data})
    }).catch(function (err) {
    sails.log.error("create resourceMonitor err" + err)
    return res.send({code: -1, msg: "get resourceMonitor list err"})
    })
    } catch (err) {
    sails.log.error("create resourceMonitor failure" + err)
    return res.send({code: -1, msg: "create resourceMonitor failure"})
    }
    }
    }

NodeJS命令行启动PhantonJS的方法:cmd.js

//用的是node子进程中的execSync同步方法,可以等phantomjs处理完数据返回以后才执行接下来的内容

  1. let execSync = require('child_process').execSync;
    module.exports = {
    async resourceMonitorPhantom(url){
    try {
    let resourceMonitorCmd = `phantomjs ./phantom/resourceMonitorPhantom.js ${url}`;
    let resourceMonitorOut = await execSync(resourceMonitorCmd).toString();//由于phantomjs返回等数据是二进制流buffer,所以处理称字符串
    return resourceMonitorOut;
    } catch (err) {
    throw err;
    }
    }
    }

PhantomJS获取资源加载时间:resourceMonitorPhantom.js

  1. var page = require('webpage').create();
    var system = require('system');
    var address;
  2.  
  3. if (system.args.length === 1) {
    console.log(system.args)
    phantom.exit();
    } else {
    var t = Date.now();
    address = system.args[1];
    page.open(address, function (status) {
    if (status !== 'success') {
    console.log('fail to load the address');
    } else {
    t = Date.now() - t;
    console.log('webAddress:' + address + 'total:' + t + 'ms');
    }
    phantom.exit();
    });
    }

三、涉及的框架及运行环境

1、NodeJS

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world.

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。 Node.js 的包管理器 npm,是全球最大的开源库生态系统。

官网:https://nodejs.org/

2、Sails

Sails.js (or Sails) is a Model-View-Controller (MVC) web application framework developed atop the Node.js environment, released as free and open-source software under the MIT License. It is designed to make it easy to build custom, enterprise-grade Node.js web applications and APIs. Emulating the MVC architecture of other frameworks, like Ruby on Rails it offers similar pattern and familiarity, reducing the cognitive burden when switching between other frameworks/languages.

Sails.js (or Sails)是一个开发的模型-视图-控制器(MVC)web应用程序框架的节点。js的环境,在MIT许可下免费和开源软件的发布。它的目的是使它容易构建定制的,企业级节点。js web应用程序和api。效仿其他框架的MVC架构,像Ruby on Rails提供了类似的模式和熟悉,减少认知负担当切换其他框架/语言。

官网:http://sailsjs.com/

3、 PhantomJS

PhantomJS is a headless WebKit scriptable with a JavaScript API. It has fast and native support for various web standards: DOM handling, CSS selector, JSON, Canvas, and SVG.

PhantomJS,脚本化的WebKit内核的无头浏览器,支持各种web标准:DOM处理CSS选择器,JSON,Canvas,SVG。

简单的说,就是一个没有界面的webkit内核浏览器,只能在命令行下使用。可以做很多事,比如:生成网页截图、抓去网页数据、获取网络资源加载时间等。

官网:http://phantomjs.org/

NodeJS + PhantomJS 前端自动化资源监控的更多相关文章

  1. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  2. 近期总结:generator-web,前端自动化构建的解决方案

    本文结合最近的工作经验,总结出一个较简洁的前端自动化构建方案,主张css和js的模块化,并通过grunt的自动化构建,有效地解决css合并,js合并和图片优化等问题,对于提高前端性能和项目代码质量有一 ...

  3. 学习安装并配置前端自动化工具Gulp

    Gulp和所有Gulp插件都是基于nodeJs来运行的,因此在你的电脑上需要安装nodeJs,安装过程请移驾安装并配置前端自动化工具--grunt.安装完成后,通过运行cmd进入DOS命令窗口,如图: ...

  4. Node.js前端自动化工具:gulp

    前端自动化工具 -- gulp 使用简介 gulp是基于流的前端自动化构建工具. 之前也谈到了 grunt的用法,grunt其实就是配置+配置的形式. 而gulp呢,是基于stream流的形式,也就是 ...

  5. 前端自动化工具 -- Gulp 使用简介

    gulp是基于流的前端自动化构建工具. 之前也谈到了 grunt的用法,grunt其实就是配置+配置的形式. 而gulp呢,是基于stream流的形式,也就是前一个函数(工厂)制造出结果,提供后者使用 ...

  6. 前端自动化构建工具——gulp

    gulp是基于流的前端自动化构建工具. 一.环境配置 gulp是基于nodejs的,所以没有 nodejs 环境的要先去安装好 然后给系统配上gulp环境 npm install -g gulp 再到 ...

  7. 前端自动化构建工具webpack (一)之webpack安装 和 设置webpack.confi.js

    目的:  模块化开发,组件化开发,让代码符合开发规范,更高效 webpack作用:从pack,就知道这是包的意思,比较专业点叫做前端自动化打包构建工具,代码错误检查,预处理,文件合并(打包),代码压缩 ...

  8. [转]基于phantomJS实现web性能监控

    1.web性能监控背景描述 上期分享的<Web性能监控自动化探索之路–初识WebPageTest>从依赖webpagetest的角度给出了做性能日常检查的方案,但由于依赖结构相对复杂我们需 ...

  9. 【前端自动化】Gulp的使用(一):安装gulp

    作为一个.NET码农,在前端高速发展的时代,深深感觉自己那么点“前端”技术不够看,比如开发出来的js css等文件庞大,不便于管理,还记得以前的开发就是累加 html  css   jquery, 现 ...

随机推荐

  1. 使用MapReduce读取HBase数据存储到MySQL

    Mapper读取HBase数据 package MapReduce; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hba ...

  2. Linux中的目录功能(Red Hat 7)

    目录的基本功能: /bin:存放普通用户使用的命令 /sbin:存放管理员可以执行的命令 /home:存放普通的家目录 如张三家目录为/home/zhangsan /root:管理员的家目录 /etc ...

  3. HASH算法小结

    一.简述 HASH算法的本质是特征提取——将某种不太好表示的特征,通过某种压缩的方式映射成一个值.这样,就可以优雅解决一部分难以解决的特征统计问题. 同时考虑到hash算法的本质是个概率算法,因此并不 ...

  4. Scala继承

    override重写 为什么要用override关键字?因为这样更清楚,不容易出错,比如打错字了,就没覆盖成功,但是不会报错 override可以覆盖feild和method class Person ...

  5. P1189 SEARCH(逃跑的拉尔夫)

    P1189 SEARCH 题目描述 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置. 那个装置太旧了,以至于只能发射关于那辆车的移 ...

  6. ASCII码、HEX、字符、BCD 等等 基础知识思考

    每每遇到这些问题就要想个半天,想不明白还不舒服,今天特别把所想整理下避免以后再次进入思想漩涡!!! 计算机存储和传输都是以字节为单位        1 bit     = 1  二进制数据       ...

  7. torndb在python3中运用

    #连接数据库:db = torndb.Connect() #查询一条的数据get() #查询多行的数据query() #创建数据表,数据库execute() #插入一条数据:sql = "i ...

  8. 浅谈 kubernetes service 那些事 (下篇)

    欢迎访问网易云社区,了解更多网易技术产品运营经验. 五.K8s 1.8 新特性--ipvs ipvs与iptables的性能差异 随着服务的数量增长,IPTables 规则则会成倍增长,这样带来的问题 ...

  9. iframe底边多出4px或5px解决办法

    问题: 在处理iframe框架自适应时,并且已经去掉iframe的边框,但仍然出现底边多出4px或5px高度的情况.如图 <div id="content"> < ...

  10. C++学习009预处理器指令符号 # ## #@ 符号的使用

    # ## #@ 符号是预处理器指令符号. 当预处理器遇到#指令符号时,会将#之后的部分用双引号括起来 当预处理去遇到##指令符号时,直接将##前后部分连接起来 当预处理器遇到#@指令符号,将#@之后的 ...