'use strict'; // Modules var webpack = require('webpack'); var autoprefixer = require('autoprefixer'); var HtmlWebpackInlineSourcePlugin = require('html-webpack-inline-source-plugin'); var HtmlWebpackPlugin = require('html-webpack-plugin'); var CopyWebpackPlugin = require('copy-webpack-plugin'); var CompressionPlugin = require('compression-webpack-plugin'); var AssetsPlugin = require('assets-webpack-plugin'); var path = require('path'); var UglifyJsPlugin = require('uglifyjs-webpack-plugin'); var FilterChunkWebpackPlugin = require('filter-chunk-webpack-plugin'); var MiniCssExtractPlugin = require('mini-css-extract-plugin'); module.exports = (env, options) => { var isProd = options.mode === 'production'; /** * Config * Reference: http://webpack.github.io/docs/configuration.html * This is the object where all configuration gets set */ var config = {}; /** * Entry * Reference: http://webpack.github.io/docs/configuration.html#entry * Should be an empty object if it's generating a test build * Karma will set this when it's a test build */ config.entry = {app: './app/index.js'}; /** * Output * Reference: http://webpack.github.io/docs/configuration.html#output * Should be an empty object if it's generating a test build * Karma will handle setting it up for you when it's a test build */ config.output = { // Absolute output directory path: __dirname + '/dist', // Output path from the view of the page // Uses webpack-dev-server in development publicPath: '/', // Filename for entry points // Only adds hash in build mode filename: '[name].bundle.js', // Filename for non-entry points // Only adds hash in build mode chunkFilename: '[name].bundle.js' }; /** * Loaders * Reference: * http://webpack.github.io/docs/configuration.html#module-loaders * List: http://webpack.github.io/docs/list-of-loaders.html * This handles most of the magic responsible for converting modules */ // Initialize module config.module = { rules: [ { // JS LOADER // Reference: https://github.com/babel/babel-loader // Transpile .js files using babel-loader // Compiles ES6 and ES7 into ES5 code test: /\.js$/, use: 'babel-loader', exclude: /node_modules/ }, {test: /\.css$/, use: [MiniCssExtractPlugin.loader, 'css-loader']}, { // ASSET LOADER // Reference: https://github.com/webpack/file-loader // Copy png, jpg, jpeg, gif, svg, woff, woff2, ttf, eot files to // output // Rename the file using the asset hash // Pass along the updated reference to your code // You can add here any file extension you want to get copied to your // output test: /\.(png|jpg|jpeg|gif|svg|woff|woff2|ttf|eot|ico)$/, loader: 'file-loader', options: {name: '[path][name].[ext]'} }, { // HTML LOADER // Reference: https://github.com/webpack/raw-loader // Allow loading html through js test: /\.html$/, loader: 'html-loader' }, { test: /\.scss$/, use: [ { loader: 'style-loader' // creates style nodes from JS strings }, { loader: 'css-loader' // translates CSS into CommonJS }, { loader: 'sass-loader' // compiles Sass to CSS } ] } ] }; config.plugins = [ new HtmlWebpackPlugin({ template: './app/index.html', inject: 'body', favicon: './app/assets/images/favicon.ico', inlineSource: '.(js|css)$', // embed all javascript and css inline minify: {removeComments: true, collapseWhitespace: true}, }), new MiniCssExtractPlugin(), new HtmlWebpackInlineSourcePlugin(), new FilterChunkWebpackPlugin({ // The webpack inline source plugin will embed the css and javascript // into our html, so we need to strip it out here so it doesn't take // up space patterns: [ '*.css', '*.js', '*glyphicons-halflings-regular*.ttf', '*glyphicons-halflings-regular*.svg', '*glyphicons-halflings-regular*.eot', '*glyphicons-halflings-regular*.woff2', ] }) ]; // Add build specific plugins if (isProd) { config.plugins.push(new CompressionPlugin({deleteOriginalAssets: true})); } /** * Dev server configuration * Reference: http://webpack.github.io/docs/configuration.html#devserver * Reference: http://webpack.github.io/docs/webpack-dev-server.html */ config.devServer = {contentBase: './src/public', stats: 'minimal'}; return config; };