From 6acbd3ea21a8cbb62a59b09b1f8fadf73a9b206b Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sat, 19 Nov 2016 14:24:37 -0500 Subject: [PATCH] optimising build step for #5211 --- build.js | 10 ++++++++-- src/plugins.js | 20 +++----------------- src/plugins/load.js | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 19 deletions(-) diff --git a/build.js b/build.js index 96b7d7af26..dde837e0d6 100644 --- a/build.js +++ b/build.js @@ -3,7 +3,11 @@ var async = require('async'); var winston = require('winston'); +var buildStart; + exports.build = function build(targets, callback) { + buildStart = Date.now(); + var db = require('./src/database'); var meta = require('./src/meta'); var plugins = require('./src/plugins'); @@ -21,7 +25,7 @@ exports.build = function build(targets, callback) { async.series([ async.apply(db.init), async.apply(meta.themes.setupPaths), - async.apply(plugins.init, null, null) + async.apply(plugins.prepareForBuild) ], function (err) { if (err) { winston.error('[build] Encountered error preparing for build: ' + err.message); @@ -80,7 +84,9 @@ exports.buildTargets = function (targets, callback) { return process.exit(1); } - winston.info('[build] Asset compilation successful.'); + var time = (Date.now() - buildStart) / 1000; + + winston.info('[build] Asset compilation successful. Completed in ' + time + 's.'); if (typeof callback === 'function') { callback(); diff --git a/src/plugins.js b/src/plugins.js index 0f9348f9f3..224258997d 100644 --- a/src/plugins.js +++ b/src/plugins.js @@ -99,23 +99,9 @@ var middleware; next(); }); }, - function (next) { - db.getSortedSetRange('plugins:active', 0, -1, next); - }, - function (plugins, next) { - if (!Array.isArray(plugins)) { - return next(); - } - - plugins = plugins.filter(function (plugin) { - return plugin && typeof plugin === 'string'; - }).map(function (plugin) { - return path.join(__dirname, '../node_modules/', plugin); - }); - - async.filter(plugins, file.exists, function (plugins) { - async.eachSeries(plugins, Plugins.loadPlugin, next); - }); + async.apply(Plugins.getPluginPaths), + function(paths, next) { + async.eachSeries(paths, Plugins.loadPlugin, next); }, function (next) { // If some plugins are incompatible, throw the warning here diff --git a/src/plugins/load.js b/src/plugins/load.js index 7027c31d73..b6231fc7c4 100644 --- a/src/plugins/load.js +++ b/src/plugins/load.js @@ -1,5 +1,6 @@ 'use strict'; +var db = require('../database'); var fs = require('fs'); var path = require('path'); var semver = require('semver'); @@ -14,6 +15,49 @@ var meta = require('../meta'); module.exports = function (Plugins) { + Plugins.getPluginPaths = function (callback) { + async.waterfall([ + function (next) { + db.getSortedSetRange('plugins:active', 0, -1, next); + }, + function (plugins, next) { + if (!Array.isArray(plugins)) { + return next(); + } + + plugins = plugins.filter(function (plugin) { + return plugin && typeof plugin === 'string'; + }).map(function (plugin) { + return path.join(__dirname, '../../node_modules/', plugin); + }); + + async.filter(plugins, file.exists, function (plugins) { + next(null, plugins); + }); + }, + ], callback); + }; + + Plugins.prepareForBuild = function (callback) { + async.waterfall([ + async.apply(Plugins.getPluginPaths), + function(paths, next) { + async.map(paths, function(path, next) { + Plugins.loadPluginInfo(path, next); + }, next); + }, + function(plugins, next) { + async.each(plugins, function(pluginData, next) { + var idx = plugins.indexOf(pluginData); + async.parallel([ + async.apply(mapFiles, pluginData, 'css', 'cssFiles'), + async.apply(mapFiles, pluginData, 'less', 'lessFiles'), + async.apply(mapClientSideScripts, pluginData) + ], next); + }, next); + } + ], callback); + }; Plugins.loadPlugin = function (pluginPath, callback) { Plugins.loadPluginInfo(pluginPath, function (err, pluginData) {