diff --git a/package-lock.json b/package-lock.json index fca1da2c7c958a6e8877e4492e98628326e2520a..ffb0f5508c4a68e07e81536b805873a4cb938f3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "hipla-react", + "name": "hipla-full-stack", "version": "0.0.1", "lockfileVersion": 1, "requires": true, @@ -12709,7 +12709,6 @@ "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -12878,7 +12877,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -15324,6 +15322,15 @@ "uuid": "^3.1.0" } }, + "webpack-merge": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.2.tgz", + "integrity": "sha512-/0QYwW/H1N/CdXYA2PNPVbsxO3u2Fpz34vs72xm03SRfg6bMNGfMJIQEpQjKRvkG2JvT6oRJFpDtSrwbX8Jzvw==", + "dev": true, + "requires": { + "lodash": "^4.17.5" + } + }, "webpack-sources": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", diff --git a/package.json b/package.json index 0ac25db9d8d9a87ca4039a630f53329d61b4b399..f77fec8acd2dc34a85268179ea8ebeed0650a885 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,20 @@ { - "name": "hipla-react", + "name": "hipla-full-stack", "version": "0.0.1", "description": "", "private": true, "scripts": { - "start": "node src/server/index.js", - "build": "webpack --mode production", - "client": "webpack-dev-server --mode development --devtool inline-source-map --hot", "dev": "concurrently \"npm run server\" \"npm run client\"", - "server": "nodemon --exec babel-node src/server/index.js", + "build": "npm run build-client && npm run build-server", + "client": "webpack-dev-server --config webpack.client.dev.js", + "server": "nodemon src/server/index.js --exec babel-node ", + "build-client": "webpack --progress --config webpack.client.prod.js", + "build-server": "babel --no-babelrc --presets=es2015 -d ./dist/server ./src/server", + "serve": "NODE_ENV=production node dist/server/index.js", "test": "jest --watch" }, "jest": { - "setupTestFrameworkScriptFile": "<rootDir>/src/setupTests.js" + "setupTestFrameworkScriptFile": "<rootDir>/src/client/setupTests.js" }, "keywords": [], "author": "Esko Ikkala", @@ -24,6 +26,7 @@ "babel-jest": "^22.4.4", "babel-loader": "^7.1.4", "babel-preset-env": "^1.7.0", + "babel-preset-es2015": "^6.24.1", "babel-preset-react": "^6.24.1", "clean-webpack-plugin": "^0.1.19", "concurrently": "^3.5.1", @@ -44,7 +47,8 @@ "style-loader": "^0.20.3", "webpack": "^4.11.1", "webpack-cli": "^2.1.5", - "webpack-dev-server": "^3.1.4" + "webpack-dev-server": "^3.1.4", + "webpack-merge": "^4.1.2" }, "dependencies": { "@material-ui/core": "^1.2.0", diff --git a/webpack.client.common.js b/webpack.client.common.js new file mode 100644 index 0000000000000000000000000000000000000000..90039411f8a3b5166c03a59299a66342cad265dd --- /dev/null +++ b/webpack.client.common.js @@ -0,0 +1,54 @@ +const path = require('path'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const CleanWebpackPlugin = require('clean-webpack-plugin'); +const webpack = require('webpack'); + +const outputDirectory = 'dist/public'; + +module.exports = { + entry: { + app: './src/client/index.js', + }, + plugins: [ + new CleanWebpackPlugin(['dist']), + new HtmlWebpackPlugin({ + title: 'Hipla', + // Load a custom template + template: 'src/client/index.html', + }), + new webpack.NamedModulesPlugin(), + new webpack.HotModuleReplacementPlugin(), + ], + output: { + filename: '[name].bundle.js', + path: path.resolve(__dirname, outputDirectory), + }, + module: { + rules: [ + { + test: /\.js$/, + exclude: /node_modules/, + loader: 'babel-loader', + query: { + presets: ['es2015', 'react', 'stage-2'] + }, + }, + { + test: /\.css$/, + use: [ + 'style-loader', + 'css-loader', + ], + }, + { + test: /\.(png|svg|jpg|gif)$/, + use: [ + 'file-loader', + ], + }, + ], + }, + resolve: { + extensions: ['.js', '.jsx'], + }, +}; diff --git a/webpack.client.dev.js b/webpack.client.dev.js new file mode 100644 index 0000000000000000000000000000000000000000..422956d579cacb49e393f4fae81472cd35dd115e --- /dev/null +++ b/webpack.client.dev.js @@ -0,0 +1,16 @@ +const merge = require('webpack-merge'); +const common = require('./webpack.client.common.js'); + +module.exports = merge(common, { + mode: 'development', + devtool: 'inline-source-map', + devServer: { + contentBase: './dist', + hot: true, + port: 8080, + open: true, + proxy: { + '/api': 'http://localhost:3000' + } + } +}); diff --git a/webpack.client.prod.js b/webpack.client.prod.js new file mode 100644 index 0000000000000000000000000000000000000000..52a153eebda07f643a4e0bb0556d37beb37eb01e --- /dev/null +++ b/webpack.client.prod.js @@ -0,0 +1,17 @@ +const webpack = require('webpack'); +const merge = require('webpack-merge'); +const UglifyJSPlugin = require('uglifyjs-webpack-plugin'); +const common = require('./webpack.client.common.js'); + +module.exports = merge(common, { + mode: 'production', + devtool: 'source-map', + plugins: [ + new UglifyJSPlugin({ + sourceMap: true + }), + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify('production') + }) + ] +});