150 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // Copyright (c) 2018 Dominic Masters
 | |
| //
 | |
| // MIT License
 | |
| //
 | |
| // Permission is hereby granted, free of charge, to any person obtaining
 | |
| // a copy of this software and associated documentation files (the
 | |
| // "Software"), to deal in the Software without restriction, including
 | |
| // without limitation the rights to use, copy, modify, merge, publish,
 | |
| // distribute, sublicense, and/or sell copies of the Software, and to
 | |
| // permit persons to whom the Software is furnished to do so, subject to
 | |
| // the following conditions:
 | |
| //
 | |
| // The above copyright notice and this permission notice shall be
 | |
| // included in all copies or substantial portions of the Software.
 | |
| //
 | |
| // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | |
| // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | |
| // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 | |
| // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 | |
| // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 | |
| // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 | |
| // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | |
| 
 | |
| //Includes
 | |
| const
 | |
|   path = require('path'),
 | |
|   webpack = require('webpack'),
 | |
|   HtmlWebpackPlugin = require('html-webpack-plugin'),
 | |
|   CompressionPlugin = require("compression-webpack-plugin"),
 | |
|   UglifyJsPlugin = require('uglifyjs-webpack-plugin'),
 | |
|   MiniCssExtractPlugin = require("mini-css-extract-plugin"),
 | |
|   OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");
 | |
| ;
 | |
| 
 | |
| //Constants
 | |
| const SOURCE_DIRECTORY = './public';
 | |
| const ENTRY_FILE = 'index.jsx';
 | |
| const ENTRY_WRAPPER = 'index.html';
 | |
| 
 | |
| module.exports = function(server, app) {
 | |
|   //Create our dirs
 | |
|   let entryDir = path.join(app.getPublicDirectory(), '..', 'public');
 | |
| 
 | |
|   //Create our output
 | |
|   let output = {};
 | |
| 
 | |
|   //Set the entry point
 | |
|   output.entry = path.join(entryDir, ENTRY_FILE);
 | |
| 
 | |
|   //Set the output
 | |
|   output.output = {
 | |
|     path: app.getPublicDirectory(),
 | |
|     filename: "app.js"
 | |
|   }
 | |
| 
 | |
|   //Set Resolves
 | |
|   output.resolve = {
 | |
|     modules: ['node_modules', SOURCE_DIRECTORY],
 | |
|     extensions: ['.js', '.jsx', '.css', '.scss' ]
 | |
|   };
 | |
| 
 | |
|   //Setup Modules
 | |
|   output.module = {
 | |
|     rules: [
 | |
|       {
 | |
|         test: /\.jsx?$|\.js?$/,
 | |
|         exclude: /node_modules/,
 | |
|         use: {
 | |
|           loader: 'babel-loader'
 | |
|         }
 | |
|       },
 | |
|       {
 | |
|         test: /\.scss$|\.css$/i,
 | |
|         use: [
 | |
|           MiniCssExtractPlugin.loader,
 | |
|           "css-loader",
 | |
|           'sass-loader',
 | |
|         ]
 | |
|       },
 | |
| 
 | |
|       {
 | |
|         test: /\.svg|\.webm|\.mp4$/i,
 | |
|         use: [{
 | |
|           loader: "file-loader",
 | |
|           options: {
 | |
|             name: "[path][name].[ext]",
 | |
|             context: 'public'
 | |
|           }
 | |
|         }]
 | |
|       },
 | |
| 
 | |
|       {
 | |
|         test: /\.jpe?g$|\.gif$|\.png$/i,
 | |
|         use: [{
 | |
|           loader: "responsive-loader",
 | |
|           options: {
 | |
|             sizes: [128, 256, 500, 750, 1000, 1250, 1500, 2000, 2250, 2500],
 | |
|             name: "[path][name]_[width]x.[ext]",
 | |
|             context: 'public'
 | |
|           }
 | |
|         }]
 | |
|       },
 | |
| 
 | |
|       {
 | |
|         test: /\.(eot|ttf|woff(2)?)(\?v=\d+\.\d+\.\d+)?/,
 | |
|         loader: 'url-loader'
 | |
|       }
 | |
|     ]
 | |
|   };
 | |
| 
 | |
|   //Setup the Plugins
 | |
|   let HTMLWebpackPluginConfig = new HtmlWebpackPlugin({
 | |
|     template: path.join(SOURCE_DIRECTORY, ENTRY_WRAPPER),
 | |
|     filename: ENTRY_WRAPPER,
 | |
|     inject: true
 | |
|   });
 | |
| 
 | |
|   let UglifyPluginConfig = new UglifyJsPlugin({
 | |
|     test: /\.js($|\?)/i
 | |
|   });
 | |
| 
 | |
|   let MiniCssExtractConfig = new MiniCssExtractPlugin({
 | |
|     filename: "[name].css",
 | |
|     chunkFilename: "[id].css"
 | |
|   })
 | |
| 
 | |
|   //Set the plugins
 | |
|   output.plugins = [
 | |
|     new webpack.DefinePlugin({
 | |
|       'process.env.NODE_ENV': JSON.stringify('production')
 | |
|     }),
 | |
|     MiniCssExtractConfig,
 | |
|     HTMLWebpackPluginConfig
 | |
|   ];
 | |
| 
 | |
|   //Minimization
 | |
|   output.optimization = {
 | |
|     minimize: true,
 | |
|     minimizer: [
 | |
|       UglifyPluginConfig,
 | |
|       new OptimizeCSSAssetsPlugin({})
 | |
|     ]
 | |
|    };
 | |
| 
 | |
|   //Now setup the production values
 | |
|   output.devtool = 'source-map';
 | |
| 
 | |
|   return output;
 | |
| }
 |