From 4a04731a38a9d9cc793771f5bdef45fbe59f89b5 Mon Sep 17 00:00:00 2001 From: Luke Bayes Date: Sun, 20 Jan 2019 12:27:15 -0500 Subject: [PATCH] Send minified client binary in production environment --- Makefile | 2 +- server/main.js | 6 ++++-- test/server_test.js | 31 +++++++++++++++++++++++++++---- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index c73a719..7a83fa3 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ BABEL=$(NODE_MODULES_BIN)/babel BABEL_NODE=$(NODE_MODULES_BIN)/babel-node WEBPACK_CLIENT_CONFIG=webpack-client.config.js -.PHONY: test test-w dev-install build build-module lint clean +.PHONY: test test-w dev-install build build-module lint clean serve dist: mkdir dist diff --git a/server/main.js b/server/main.js index df120ea..be17ecc 100644 --- a/server/main.js +++ b/server/main.js @@ -1,13 +1,15 @@ const dom = require('nomplate').dom; function main(options, renderView) { + // Use minified sources for production environment + const scriptSource = options.settings && options.settings.env === 'production' ? '/dist/client.min.js' : '/dist/client.js'; + return dom.html({lang: 'en'}, () => { dom.head(() => { dom.meta({charset: 'utf8'}); dom.title('Nomplate Project'); dom.link({rel: 'stylesheet', href: 'static/styles.css'}); - // TODO(lbayes): If production mode, use minified and gzipped binary. - dom.script({src: '/dist/client.js', type: 'text/javascript'}); + dom.script({src: scriptSource, type: 'text/javascript'}); }); dom.body(() => { dom.div({id: 'app-context'}, () => { diff --git a/test/server_test.js b/test/server_test.js index a682ee4..603aa46 100644 --- a/test/server_test.js +++ b/test/server_test.js @@ -1,15 +1,38 @@ const assert = require('chai').assert; const dom = require('nomplate').dom; -const server = require('../server'); +const {JSDOM} = require('jsdom'); +const main = require('../server/main'); +const renderElement = require('nomplate').renderElement; describe('Server', () => { let instance; - beforeEach(() => { - }); + function render(options) { + const fakeDoc = new JSDOM('').window.document; + return renderElement(main(options || {}, () => { + return dom.div({id: 'fake-client'}); + }), fakeDoc); + } it('is instantiable', () => { - assert(false, "Expected failure"); + assert.isNotNull(render()); + }); + + it('renders expected elements', () => { + const appContext = render().querySelector('#app-context'); + assert.isNotNull(appContext); + }); + + it('renders dev script source', () => { + const scriptTag = render({settings: {env: 'development'}}).querySelector('script'); + assert.isNotNull(scriptTag); + assert.equal(scriptTag.src, '/dist/client.js'); + }); + + it('renders minified script source', () => { + const scriptTag = render({settings: {env: 'production'}}).querySelector('script'); + assert.isNotNull(scriptTag); + assert.equal(scriptTag.src, '/dist/client.min.js'); }); });