diff --git a/public/src/app.js b/public/src/app.js index e5d52daf94a5..87c2767f95ba 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -88,7 +88,19 @@ app.cacheBuster = null; app.showCookieWarning(); registerServiceWorker(); - require(['taskbar', 'helpers', 'forum/pagination'], function (taskbar, helpers, pagination) { + require([ + 'taskbar', + 'helpers', + 'forum/pagination', + 'translator', + 'forum/unread', + 'forum/header/notifications', + 'forum/header/chat', + 'timeago/jquery.timeago', + ], function (taskbar, helpers, pagination, translator, unread, notifications, chat) { + notifications.prepareDOM(); + chat.prepareDOM(); + translator.prepareDOM(); taskbar.init(); helpers.register(); diff --git a/public/src/client/login.js b/public/src/client/login.js index 23d0d07d625d..a35c7e171642 100644 --- a/public/src/client/login.js +++ b/public/src/client/login.js @@ -1,7 +1,7 @@ 'use strict'; -define('forum/login', [], function () { +define('forum/login', ['jquery-form'], function () { var Login = {}; Login.init = function () { diff --git a/public/src/client/register.js b/public/src/client/register.js index 7b61ca11d9ae..ca286afb4b58 100644 --- a/public/src/client/register.js +++ b/public/src/client/register.js @@ -1,7 +1,7 @@ 'use strict'; -define('forum/register', ['translator', 'zxcvbn'], function (translator, zxcvbn) { +define('forum/register', ['translator', 'zxcvbn', 'jquery-form'], function (translator, zxcvbn) { var Register = {}; var validationError = false; var successIcon = ''; diff --git a/public/src/modules/uploader.js b/public/src/modules/uploader.js index 9df3fe2dbddb..88d86d9e92e8 100644 --- a/public/src/modules/uploader.js +++ b/public/src/modules/uploader.js @@ -1,7 +1,7 @@ 'use strict'; -define('uploader', ['translator', 'benchpress'], function (translator, Benchpress) { +define('uploader', ['translator', 'benchpress', 'jquery-form'], function (translator, Benchpress) { var module = {}; module.show = function (data, callback) { diff --git a/src/meta/js.js b/src/meta/js.js index ddabd7acfeff..8473c9579368 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -102,10 +102,11 @@ JS.scripts = { 'zxcvbn.js': 'node_modules/zxcvbn/dist/zxcvbn.js', ace: 'node_modules/ace-builds/src-min', 'clipboard.js': 'node_modules/clipboard/dist/clipboard.min.js', - 'nprogress.js': 'node_modules/nprogress/nprogress.js', 'tinycon.js': 'node_modules/tinycon/tinycon.js', 'slideout.js': 'node_modules/slideout/dist/slideout.min.js', 'compare-versions.js': 'node_modules/compare-versions/index.js', + 'timeago/locales': 'node_modules/timeago/locales', + 'jquery-form.js': 'node_modules/jquery-form/dist/jquery.form.min.js', }, }; @@ -272,6 +273,44 @@ JS.buildModules = function (fork, callback) { ], callback); }; +function requirejsOptimize(target, callback) { + const requirejs = require('requirejs'); + let scriptText = ''; + const sharedCfg = { + paths: { + jquery: 'empty:', + }, + optimize: 'none', + out: function (text) { + scriptText += text; + }, + }; + const bundledModules = [ + { + baseUrl: './node_modules', + name: 'timeago/jquery.timeago', + }, + { + baseUrl: './node_modules/nprogress', + name: 'nprogress', + }, + ]; + + async.eachSeries(bundledModules, function (moduleCfg, next) { + requirejs.optimize({ ...sharedCfg, ...moduleCfg }, function () { + next(); + }, function (err) { + next(err); + }); + }, function (err) { + if (err) { + return callback(err); + } + const filePath = path.join(__dirname, '../../build/public/rjs-bundle-' + target + '.js'); + fs.writeFile(filePath, scriptText, callback); + }); +} + JS.linkStatics = function (callback) { rimraf(path.join(__dirname, '../../build/public/plugins'), function (err) { if (err) { @@ -348,6 +387,9 @@ JS.buildBundle = function (target, fork, callback) { }; async.waterfall([ + function (next) { + requirejsOptimize(target, next); + }, function (next) { getBundleScriptList(target, next); }, @@ -357,6 +399,10 @@ JS.buildBundle = function (target, fork, callback) { }); }, function (files, next) { + files.push({ + srcPath: path.join(__dirname, '../../build/public/rjs-bundle-' + target + '.js'), + }); + var minify = process.env.NODE_ENV !== 'development'; var filePath = path.join(__dirname, '../../build/public', fileNames[target]); diff --git a/test/controllers.js b/test/controllers.js index d7573ba40506..db739925b9d4 100644 --- a/test/controllers.js +++ b/test/controllers.js @@ -1839,7 +1839,7 @@ describe('Controllers', function () { describe('timeago locales', function () { it('should load timeago locale', function (done) { - request(nconf.get('url') + '/assets/vendor/jquery/timeago/locales/jquery.timeago.af.js', function (err, res, body) { + request(nconf.get('url') + '/assets/src/modules/timeago/locales/jquery.timeago.af.js', function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body.includes('Afrikaans')); @@ -1848,7 +1848,7 @@ describe('Controllers', function () { }); it('should return not found if NodeBB language exists but timeago locale does not exist', function (done) { - request(nconf.get('url') + '/assets/vendor/jquery/timeago/locales/jquery.timeago.ms.js', function (err, res, body) { + request(nconf.get('url') + '/assets/src/modules/timeago/locales/jquery.timeago.ms.js', function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 404); done(); @@ -1856,7 +1856,7 @@ describe('Controllers', function () { }); it('should return not found if NodeBB language does not exist', function (done) { - request(nconf.get('url') + '/assets/vendor/jquery/timeago/locales/jquery.timeago.muggle.js', function (err, res, body) { + request(nconf.get('url') + '/assets/src/modules/timeago/locales/jquery.timeago.muggle.js', function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 404); done();