From 9b1068e868eec951a3d1d4474b337993a83de54f Mon Sep 17 00:00:00 2001
From: Peter Jaszkowiak
Date: Sun, 19 Feb 2017 02:07:19 -0700
Subject: [PATCH 1/2] Minify all module scripts in production
---
src/meta/build.js | 2 +-
src/meta/js.js | 128 +++++++++++++++++++++++++++++++++++++++++-----
2 files changed, 116 insertions(+), 14 deletions(-)
diff --git a/src/meta/build.js b/src/meta/build.js
index 3f2feb8a2a..be34273e6e 100644
--- a/src/meta/build.js
+++ b/src/meta/build.js
@@ -71,7 +71,7 @@ exports.buildTargets = function (targets, callback) {
winston.info('[build] Building javascript');
var startTime = Date.now();
async.series([
- meta.js.linkModules,
+ meta.js.buildModules,
meta.js.linkStatics,
async.apply(meta.js.minify, 'nodebb.min.js'),
async.apply(meta.js.minify, 'acp.min.js')
diff --git a/src/meta/js.js b/src/meta/js.js
index b6b6e61ee6..60aa97d050 100644
--- a/src/meta/js.js
+++ b/src/meta/js.js
@@ -7,6 +7,7 @@ var async = require('async');
var fs = require('fs');
var mkdirp = require('mkdirp');
var rimraf = require('rimraf');
+var uglifyjs = require('uglify-js');
var file = require('../file');
var plugins = require('../plugins');
@@ -79,7 +80,7 @@ module.exports = function (Meta) {
'public/src/modules/string.js'
],
- // modules listed below are routed through express (/src/modules) so they can be defined anonymously
+ // modules listed below are built (/src/modules) so they can be defined anonymously
modules: {
"Chart.js": './node_modules/chart.js/dist/Chart.min.js',
"mousetrap.js": './node_modules/mousetrap/mousetrap.min.js',
@@ -89,24 +90,125 @@ module.exports = function (Meta) {
}
}
};
+
+ function minifyModules(modules, callback) {
+ async.eachLimit(modules, 500, function (mod, next) {
+ var filePath = mod.filePath;
+ var destPath = mod.destPath;
+ var minified;
+
+ async.parallel([
+ function (cb) {
+ mkdirp(path.dirname(destPath), cb);
+ },
+ function (cb) {
+ fs.readFile(filePath, function (err, buffer) {
+ if (err) {
+ return cb(err);
+ }
+ try {
+ minified = uglifyjs.minify(buffer.toString(), {
+ fromString: true,
+ compress: false,
+ });
+ } catch (e) {
+ return cb(e);
+ }
+
+ cb();
+ });
+ }
+ ], function (err) {
+ if (err) {
+ return next(err);
+ }
+
+ fs.writeFile(destPath, minified.code, next);
+ });
+ }, callback);
+ };
- Meta.js.linkModules = function (callback) {
- rimraf(path.join(__dirname, '../../build/public/src/modules'), function (err) {
+ function linkModules(callback) {
+ var modules = Meta.js.scripts.modules;
+
+ async.eachLimit(Object.keys(modules), 1000, function (relPath, next) {
+ var filePath = path.join(__dirname, '../../', modules[relPath]);
+ var destPath = path.join(__dirname, '../../build/public/src/modules', relPath);
+
+ mkdirp(path.dirname(destPath), function (err) {
+ if (err) {
+ return next(err);
+ }
+
+ file.link(filePath, destPath, next);
+ });
+ }, callback);
+ };
+
+ var moduleDirs = ['modules', 'admin', 'client'];
+
+ function getModuleList(callback) {
+ var modules = Object.keys(Meta.js.scripts.modules).map(function (relPath) {
+ return {
+ filePath: path.join(__dirname, '../../', Meta.js.scripts.modules[relPath]),
+ destPath: path.join(__dirname, '../../build/public/src/modules', relPath),
+ };
+ });
+
+ var dirs = moduleDirs.map(function (dir) {
+ return path.join(__dirname, '../../public/src', dir);
+ });
+
+ async.each(dirs, function (dir, next) {
+ utils.walk(dir, function (err, files) {
+ if (err) {
+ return next(err);
+ }
+
+ modules = modules.concat(files.map(function (filePath) {
+ return {
+ filePath: filePath,
+ destPath: path.join(__dirname, '../../build/public/src', path.relative(path.dirname(dir), filePath)),
+ };
+ }));
+
+ next();
+ });
+ }, function (err) {
if (err) {
return callback(err);
}
- async.eachLimit(Object.keys(Meta.js.scripts.modules), 1000, function (relPath, next) {
- var filePath = path.join(__dirname, '../../', Meta.js.scripts.modules[relPath]);
- var destPath = path.join(__dirname, '../../build/public/src/modules', relPath);
- mkdirp(path.dirname(destPath), function (err) {
- if (err) {
- return next(err);
- }
+ callback(null, modules);
+ });
+ }
+
+ function clearModules(callback) {
+ var builtPaths = moduleDirs.map(function (p) {
+ return '../../build/public/src/' + p;
+ });
+ async.each(builtPaths, function (builtPath, next) {
+ rimraf(path.join(__dirname, builtPath), next);
+ }, callback);
+ }
- file.link(filePath, destPath, next);
- });
- }, callback);
+ Meta.js.buildModules = function (callback) {
+ clearModules(function (err) {
+ if (err) {
+ return callback(err);
+ }
+
+ if (global.env === 'development') {
+ return linkModules(callback);
+ }
+
+ getModuleList(function (err, modules) {
+ if (err) {
+ return callback(err);
+ }
+
+ minifyModules(modules, callback);
+ });
});
};
From beb652ee43588e4fbd084772d00a9c6966c346e8 Mon Sep 17 00:00:00 2001
From: Peter Jaszkowiak
Date: Mon, 20 Feb 2017 00:44:04 -0700
Subject: [PATCH 2/2] Move `minifier.js` to `src/meta`
---
src/meta/js.js | 4 +++-
minifier.js => src/meta/minifier.js | 2 +-
2 files changed, 4 insertions(+), 2 deletions(-)
rename minifier.js => src/meta/minifier.js (97%)
diff --git a/src/meta/js.js b/src/meta/js.js
index 60aa97d050..969239f0a8 100644
--- a/src/meta/js.js
+++ b/src/meta/js.js
@@ -13,6 +13,8 @@ var file = require('../file');
var plugins = require('../plugins');
var utils = require('../../public/src/utils');
+var minifierPath = path.join(__dirname, 'minifier.js');
+
module.exports = function (Meta) {
Meta.js = {
@@ -236,7 +238,7 @@ module.exports = function (Meta) {
winston.verbose('[meta/js] Minifying ' + target);
var forkProcessParams = setupDebugging();
- var minifier = Meta.js.minifierProc = fork('minifier.js', [], forkProcessParams);
+ var minifier = Meta.js.minifierProc = fork(minifierPath, [], forkProcessParams);
Meta.js.target[target] = {};
diff --git a/minifier.js b/src/meta/minifier.js
similarity index 97%
rename from minifier.js
rename to src/meta/minifier.js
index 25c0177175..5c47bc3e4e 100644
--- a/minifier.js
+++ b/src/meta/minifier.js
@@ -3,7 +3,7 @@
var uglifyjs = require('uglify-js');
var async = require('async');
var fs = require('fs');
-var file = require('./src/file');
+var file = require('../file');
var Minifier = {
js: {}