const webpack = require('webpack') const fs = require('fs') // NODE_ENV const nodeEnv = process.env.NODE_ENV || 'development' const isProd = nodeEnv === 'production' module.exports = (options) => { let entryFile, outputPath, isClient, isServer switch(options.side) { case 'client': entryFile = { client: './app/client.jsx' } outputPath = __dirname + '/app/public' isClient = true break case 'server': entryFile = { server: './app/server.js' } outputPath = __dirname + '/dist' isServer = true break } return { entry: entryFile, devtool: isProd ? 'source-map' : 'eval', output: { filename: '[name].bundle.js', path: outputPath }, resolve: { extensions: ['.js', '.jsx', '.styl'], modules: ['node_modules', 'shared'] }, module: { rules: [ { test: /\.jsx$/, exclude: /node_modules/, loader: "babel-loader", options: { presets: [ ["env", { "targets": { "browsers": ["last 2 versions"] } }], 'react', 'stage-2' ] } }, { test: /\.styl$/, use: [ { loader: "style-loader" }, { loader: "css-loader" }, { loader: "postcss-loader", options: { plugins: () => { return [ require('autoprefixer')({ browsers: 'last 2 versions' }) ] } } }, { loader: "stylus-loader" } ] } ] }, externals: isServer ? fs.readdirSync(__dirname + '/node_modules') .concat([ 'react-dom/server' ]) .reduce(function (ext, mod) { ext[mod] = 'commonjs ' + mod; return ext }, {}) : '', target: isServer ? 'node' : 'web', plugins: isProd ? [ new webpack.DefinePlugin({ "process.env": { NODE_ENV: JSON.stringify('production') } }), new webpack.optimize.OccurrenceOrderPlugin(), new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false, screw_ie8: true, conditionals: true, unused: true, comparisons: true, sequences: true, dead_code: true, evaluate: true, if_return: true, join_vars: true, }, output: { comments: false }, }), new webpack.LoaderOptionsPlugin({ minimize: true, debug: false }) ] : [] } }