瀏覽代碼

Merge pull request #133 from gmetais/develop

v1.9.3
Gaël Métais 9 年之前
父節點
當前提交
55cd1160db

+ 18 - 10
front/src/main.html

@@ -19,6 +19,24 @@
     <link rel="stylesheet" type="text/css" href="/node_modules/angular-chart.js/dist/angular-chart.css">
     <!-- endbuild -->
 
+    <link rel="preconnect" href="//www.google-analytics.com">
+    <link rel="dns-prefetch" href="//www.google-analytics.com">
+    <link rel="preconnect" href="//ghbtns.com">
+    <link rel="dns-prefetch" href="//ghbtns.com">
+    <link rel="preconnect" href="https://api.github.com">
+    <link rel="dns-prefetch" href="https://api.github.com">
+
+<head>
+
+<body ng-app="YellowLabTools">
+    <div id="header"><h1>Yellow Lab <span class="icon-lab"></span> Tools</h1></div>
+    <div id="body" ng-view autoscroll="true"></div>
+    <div class="footer">
+        <span class="version">@@version</span>
+        <br><a href="/about">More about Yellow Lab Tools</a><br>
+        <div class="github"><iframe id="ghbtn" frameborder="0" scrolling="0" width="145px" height="30px"></iframe></div>
+    </div>
+
     <!-- build:js /js/all.js -->
     <script src="/node_modules/angular/angular.min.js"></script>
     <script src="/node_modules/chart.js/Chart.min.js"></script>
@@ -44,16 +62,6 @@
     <script src="/js/directives/gradeDirective.js"></script>
     <script src="/js/directives/offendersDirectives.js"></script>
     <!-- endbuild -->
-<head>
-
-<body ng-app="YellowLabTools">
-    <div id="header"><h1>Yellow Lab <span class="icon-lab"></span> Tools</h1></div>
-    <div id="body" ng-view autoscroll="true"></div>
-    <div class="footer">
-        <span class="version">@@version</span>
-        <br><a href="/about">More about Yellow Lab Tools</a><br>
-        <div class="github"><iframe id="ghbtn" frameborder="0" scrolling="0" width="145px" height="30px"></iframe></div>
-    </div>
 
     <script>
         (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');if('@@googleAnalyticsId'.indexOf('UA-')===0){ga('create','@@googleAnalyticsId','auto');}

+ 52 - 6
lib/tools/phantomas/custom_modules/core/scopeYLT/scopeYLT.js

@@ -110,29 +110,75 @@ exports.module = function(phantomas) {
                         phantomas.log('Entering deep Javascript analysis mode');
                     }
 
-                    // Add a child but don't enter his context
+                    // Add a child but don't enter its context
                     function pushContext(data) {
-                        if (depth === 0 || deepAnalysis) {
+                        
+                        // Some data is not needed on subchildren
+                        if (depth === 0) {
                             data.timestamp = Date.now() - responseEndTime;
                             data.loadingStep = phantomas.currentStep || '';
+                        }
+
+                        // Some data is not needed on subchildren
+                        if (depth > 0) {
+                            if (data.backtrace) {
+                                delete data.backtrace;
+                            }
+                            if (data.resultsNumber) {
+                                delete data.resultsNumber;
+                            }
+                        }
+
+                        if (depth === 0 || deepAnalysis) {
                             currentContext.addChild(data);
                         }
                     }
                     
-                    // Add a child to the current context and enter his context
+                    // Add a child to the current context and enter its context
                     function enterContext(data) {
-                        if (depth === 0 || deepAnalysis) {
+                        
+                        // Some data is not needed on subchildren
+                        if (depth === 0) {
                             data.timestamp = Date.now() - responseEndTime;
                             data.loadingStep = phantomas.currentStep || '';
+                        }
+
+                        // Some data is not needed on subchildren
+                        if (depth > 0) {
+                            if (data.backtrace) {
+                                delete data.backtrace;
+                            }
+                            if (data.resultsNumber) {
+                                delete data.resultsNumber;
+                            }
+                        }
+
+                        if (depth === 0 || deepAnalysis) {
                             currentContext = currentContext.addChild(data);
                         }
+
                         depth ++;
                     }
                     
                     // Save given data in the current context and jump change current context to its parent
                     function leaveContext(moreData) {
-                        if (depth === 1 || deepAnalysis) {
+                        
+                        // Some data is not needed on subchildren
+                        if (depth === 1) {
                             currentContext.data.time = Date.now() - currentContext.data.timestamp - responseEndTime;
+                        }
+
+                        // Some data is not needed on subchildren
+                        if (depth > 1) {
+                            if (moreData && moreData.backtrace) {
+                                delete moreData.backtrace;
+                            }
+                            if (moreData && moreData.resultsNumber) {
+                                delete moreData.resultsNumber;
+                            }
+                        }
+
+                        if (depth === 1 || deepAnalysis) {
 
                             // Merge previous data with moreData (ovewrites if exists)
                             if (moreData) {
@@ -148,6 +194,7 @@ exports.module = function(phantomas) {
                                 currentContext = parent;
                             }
                         }
+
                         depth --;
                     }
                     
@@ -161,7 +208,6 @@ exports.module = function(phantomas) {
                         if (root !== currentContext) {
                             return null;
                         }
-                        var current = currentContext;
 
                         function recusiveRead(node) {
                             if (node.children.length === 0) {

+ 101 - 93
lib/tools/weightChecker/weightChecker.js

@@ -408,113 +408,121 @@ var WeightChecker = function() {
 
         var statusCode;
 
-        request(requestOptions)
+        try {
 
-        .on('response', function(res) {
-            
-            // Raw headers were added in NodeJS v0.12
-            // (https://github.com/joyent/node/issues/4844), but let's
-            // reconstruct them for backwards compatibility.
-            var rawHeaders = ('HTTP/' + res.httpVersion + ' ' + res.statusCode +
-                              ' ' + http.STATUS_CODES[res.statusCode] + '\r\n');
-            Object.keys(res.headers).forEach(function(headerKey) {
-                rawHeaders += headerKey + ': ' + res.headers[headerKey] + '\r\n';
-            });
-            rawHeaders += '\r\n';
-
-            var uncompressedSize = 0;  // size after uncompression
-            var bodySize = 0;  // bytes size over the wire
-            var body = '';  // plain text body (after uncompressing gzip/deflate)
-            var isCompressed = false;
-
-            function tally() {
-
-                if (statusCode !== 200) {
-                    callback({code: statusCode});
-                    return;
-                }
+            request(requestOptions)
 
-                var result = {
-                    body: body,
-                    headersSize: Buffer.byteLength(rawHeaders, 'utf8'),
-                    bodySize: bodySize,
-                    isCompressed: isCompressed,
-                    uncompressedSize: uncompressedSize
-                };
+            .on('response', function(res) {
+                
+                // Raw headers were added in NodeJS v0.12
+                // (https://github.com/joyent/node/issues/4844), but let's
+                // reconstruct them for backwards compatibility.
+                var rawHeaders = ('HTTP/' + res.httpVersion + ' ' + res.statusCode +
+                                  ' ' + http.STATUS_CODES[res.statusCode] + '\r\n');
+                Object.keys(res.headers).forEach(function(headerKey) {
+                    rawHeaders += headerKey + ': ' + res.headers[headerKey] + '\r\n';
+                });
+                rawHeaders += '\r\n';
 
-                callback(null, result);
-            }
+                var uncompressedSize = 0;  // size after uncompression
+                var bodySize = 0;  // bytes size over the wire
+                var body = '';  // plain text body (after uncompressing gzip/deflate)
+                var isCompressed = false;
 
-            switch (res.headers['content-encoding']) {
-                case 'gzip':
-
-                    var gzip = zlib.createGunzip();
-
-                    gzip.on('data', function (data) {
-                        body += data;
-                        uncompressedSize += data.length;
-                    }).on('end', function () {
-                        isCompressed = true;
-                        tally();
-                    }).on('error', function(err) {
-                        debug('Error while decoding %s', requestOptions.url);
-                        debug(err);
-                        callback(err);
-                    });
+                function tally() {
 
-                    res.on('data', function (data) {
-                        bodySize += data.length;
-                    }).pipe(gzip);
-
-                    break;
-                case 'deflate':
-                    res.setEncoding('utf8');
-
-                    var deflate = zlib.createInflate();
-
-                    deflate.on('data', function (data) {
-                        body += data;
-                        uncompressedSize += data.length;
-                    }).on('end', function () {
-                        isCompressed = true;
-                        tally();
-                    }).on('error', function(err) {
-                        debug('Error while decoding %s', requestOptions.url);
-                        debug(err);
-                        callback(err);
-                    });
+                    if (statusCode !== 200) {
+                        callback({code: statusCode});
+                        return;
+                    }
 
-                    res.on('data', function (data) {
-                        bodySize += data.length;
-                    }).pipe(deflate);
+                    var result = {
+                        body: body,
+                        headersSize: Buffer.byteLength(rawHeaders, 'utf8'),
+                        bodySize: bodySize,
+                        isCompressed: isCompressed,
+                        uncompressedSize: uncompressedSize
+                    };
 
-                    break;
-                default:
-                    if (contentType === 'image/jpeg' || contentType === 'image/png') {
-                        res.setEncoding('binary');
-                    }
+                    callback(null, result);
+                }
 
-                    res.on('data', function (data) {
-                        body += data;
-                        uncompressedSize += data.length;
-                        bodySize += data.length;
-                    }).on('end', function () {
-                        tally();
-                    });
+                switch (res.headers['content-encoding']) {
+                    case 'gzip':
+
+                        var gzip = zlib.createGunzip();
+
+                        gzip.on('data', function (data) {
+                            body += data;
+                            uncompressedSize += data.length;
+                        }).on('end', function () {
+                            isCompressed = true;
+                            tally();
+                        }).on('error', function(err) {
+                            debug('Error while decoding %s', requestOptions.url);
+                            debug(err);
+                            callback(err);
+                        });
+
+                        res.on('data', function (data) {
+                            bodySize += data.length;
+                        }).pipe(gzip);
+
+                        break;
+                    case 'deflate':
+                        res.setEncoding('utf8');
+
+                        var deflate = zlib.createInflate();
+
+                        deflate.on('data', function (data) {
+                            body += data;
+                            uncompressedSize += data.length;
+                        }).on('end', function () {
+                            isCompressed = true;
+                            tally();
+                        }).on('error', function(err) {
+                            debug('Error while decoding %s', requestOptions.url);
+                            debug(err);
+                            callback(err);
+                        });
+
+                        res.on('data', function (data) {
+                            bodySize += data.length;
+                        }).pipe(deflate);
+
+                        break;
+                    default:
+                        if (contentType === 'image/jpeg' || contentType === 'image/png') {
+                            res.setEncoding('binary');
+                        }
+
+                        res.on('data', function (data) {
+                            body += data;
+                            uncompressedSize += data.length;
+                            bodySize += data.length;
+                        }).on('end', function () {
+                            tally();
+                        });
+
+                        break;
+                }
+            })
 
-                    break;
-            }
-        })
+            .on('response', function(response) {
+                statusCode = response.statusCode;
+            })
 
-        .on('response', function(response) {
-            statusCode = response.statusCode;
-        })
+            .on('error', function(err) {
+                debug('Error while downloading %s', requestOptions.url);
+                debug(err);
+                callback(err);
+            });
 
-        .on('error', function(err) {
+        } catch(err) {
             debug('Error while downloading %s', requestOptions.url);
             debug(err);
             callback(err);
-        });
+        }
     }
 
     return {

+ 4 - 4
package.json

@@ -1,6 +1,6 @@
 {
   "name": "yellowlabtools",
-  "version": "1.9.2",
+  "version": "1.9.3",
   "description": "Online tool to audit a webpage for performance and front-end quality issues",
   "license": "GPL-2.0",
   "author": {
@@ -22,13 +22,13 @@
   "dependencies": {
     "angular": "1.4.8",
     "angular-animate": "1.4.8",
-    "angular-chart.js": "0.8.6",
+    "angular-chart.js": "0.8.8",
     "angular-local-storage": "0.2.2",
     "angular-resource": "1.4.8",
     "angular-route": "1.4.8",
     "angular-sanitize": "1.4.8",
     "async": "1.5.0",
-    "body-parser": "1.14.1",
+    "body-parser": "1.14.2",
     "chart.js": "1.0.2",
     "clean-css": "3.4.8",
     "color-diff": "0.1.7",
@@ -73,7 +73,7 @@
     "grunt-mocha-test": "~0.12.7",
     "grunt-replace": "~0.11.0",
     "grunt-usemin": "~3.1.1",
-    "grunt-webfont": "~1.0.2",
+    "grunt-webfont": "~1.1.0",
     "matchdep": "~1.0.0",
     "mocha": "~2.3.2",
     "sinon": "~1.17.2",

+ 13 - 0
server_config/maintenance.js

@@ -0,0 +1,13 @@
+var express                 = require('express');
+var app                     = express();
+var server                  = require('http').createServer(app);
+
+var settings                = require('./settings.json');
+
+app.all('*', function(req, res) {
+    res.status(500).send('YellowLabTools is in maintenance. It should come back soon with a new version!');
+});
+
+server.listen(settings.serverPort, function() {
+    console.log('Maintenance mode started on port %d', server.address().port);
+});

+ 4 - 2
server_config/server_update.sh

@@ -2,8 +2,9 @@
 
 cd /space/YellowLabTools
 
-# Stop the server
+# Stop the server and start the maintenance mode
 forever stopall
+forever start server_config/maintenance.js
 
 # Keep the settings.json file
 git stash
@@ -18,5 +19,6 @@ npm install || exit 1
 rm -rf front/build
 grunt build
 
-# Restart the server
+# Stop the maintenance mode and restart the server
+forever stopall
 NODE_ENV=production forever start -c "node --stack-size=262000" bin/server.js