const path = require("path"); const HtmlWebPackPlugin = require("html-webpack-plugin"); // checks if it is production bundling or development bundling const isEnvProduction = process.argv.includes("production") // our root file const entrypoint = './src/index.js' const productionSettings = { mode: "production", entry: entrypoint, output: { // output directory will be the root directory of django path: path.resolve(__dirname, '../'), // this is the bundled code we wrote filename: 'static/js/[name].js', // this is the bundled library code chunkFilename: 'static/js/[name].chunk.js' }, optimization: { minimize: true, splitChunks: { chunks: 'all', name: true, }, runtimeChunk: false, }, devServer: { historyApiFallback: true, stats: 'normal', }, module: { rules: [ { // for bundling transpiled javascript test: /\\.m?js$/, exclude: /(node_modules|bower_components)/, use: { loader: "babel-loader", } }, { test: /\\.css$/i, use: [ // IMPORTANT => don't forget `injectType` option // in some cases some styles can be missing due to // inline styling. { loader: 'style-loader', options: { injectType: 'styleTag' } }, "css-loader" ], }, ] }, plugins: [ new HtmlWebPackPlugin({ // this is where webpack read our app for bundling template: "./src/index.html", // this is emitted bundle html file // django will use this as template after bundling filename:"./templates/index.html" }), ] }; const devSettings = { mode: "development", entry: entrypoint, output: { path: path.resolve(__dirname, './build'), publicPath: "/", filename: 'static/js/bundle.js', chunkFilename: 'static/js/[name].chunk.js', }, devtool: 'inline', devServer: { historyApiFallback: true, contentBase: './dist', stats: 'minimal', }, module: { rules: [ { // using transpiled javascript test: /\\.m?js$/, exclude: /(node_modules|bower_components)/, include: path.resolve(__dirname, 'src'), use: { loader: "babel-loader", options: { presets: ["@babel/preset-env"], plugins: ["@babel/plugin-proposal-object-rest-spread"], // for fast development environment // enable caching transpilation cacheDirectory: true }, } }, { test: /\\.css$/i, use: [ // IMPORTANT => don't forget `injectType` option // in some cases some styles can be missing due to // inline styling. { loader: 'style-loader', options: { injectType: 'styleTag' } }, "css-loader", 'postcss-loader' //{ loader: 'sass-loader' }, ], }, ] }, plugins: [ new HtmlWebPackPlugin({ template: "./src/index.html", }) ] }; module.exports = isEnvProduction ? productionSettings : devSettings;