UNPKG

@batch/craft-webpack

Version:

Batch's Webpack setup made for the Craft Starter.

171 lines (160 loc) 4.11 kB
// webpack.dev.js - developmental builds const LEGACY_CONFIG = "legacy"; const MODERN_CONFIG = "modern"; // node modules const { merge } = require("webpack-merge"); const path = require("path"); const fs = require("fs"); const webpack = require("webpack"); // config files const common = require("./webpack.common.js"); const settings = require("./webpack.settings.js"); let projectConfig = {}; if (fs.existsSync(path.resolve(process.cwd(), "webpack.config.js"))) { projectConfig = require(path.resolve(process.cwd(), "webpack.config.js")); } // Configure the webpack-dev-server const configureDevServer = (buildType) => { return { public: settings.devServerConfig.public(), contentBase: path.resolve(process.cwd(), settings.paths.templates), host: settings.devServerConfig.host(), port: settings.devServerConfig.port(), https: !!parseInt(settings.devServerConfig.https()), disableHostCheck: true, hot: true, overlay: true, watchContentBase: true, watchOptions: { poll: !!parseInt(settings.devServerConfig.poll()), ignored: /node_modules/, }, headers: { "Access-Control-Allow-Origin": "*", }, }; }; // Configure Image loader const configureImageLoader = (buildType) => { return { test: /\.(png|jpe?g|gif|webp)$/i, use: [ { loader: require.resolve("file-loader"), options: { name: "img/[name].[hash].[ext]", }, }, ], }; }; // Configure SVG loader const configureSVGLoader = () => { return { test: /\.svg$/, rules: [ { oneOf: [ { loader: require.resolve("vue-svg-loader"), }, { resourceQuery: /^\?external/, loader: require.resolve("file-loader"), options: { name: "img/[name].[hash].[ext]", }, }, ], }, ], }; }; // Configure the Postcss loader const configurePostcssLoader = (buildType) => { return { test: /\.(pcss|css)$/, use: [ { loader: require.resolve("style-loader"), }, { loader: require.resolve("vue-style-loader"), }, { loader: require.resolve("css-loader"), options: { importLoaders: 2, sourceMap: true, }, }, { loader: require.resolve("resolve-url-loader"), }, { loader: require.resolve("postcss-loader"), options: { sourceMap: true, }, }, ], }; }; // Define the legacy webpack config const legacyConfig = merge( common.legacyConfig, { output: { filename: path.join("./js", "[name]-legacy.[hash].js"), publicPath: settings.devServerConfig.public() + "/", }, mode: "development", devtool: "eval-source-map", devServer: configureDevServer(LEGACY_CONFIG), module: { rules: [ configurePostcssLoader(LEGACY_CONFIG), configureImageLoader(LEGACY_CONFIG), configureSVGLoader(LEGACY_CONFIG), ], }, plugins: [new webpack.HotModuleReplacementPlugin()], }, projectConfig ); // Define the modern webpack config const modernConfig = merge( common.modernConfig, { output: { filename: path.join("./js", "[name].[hash].js"), publicPath: settings.devServerConfig.public() + "/", }, mode: "development", devtool: "eval-source-map", devServer: configureDevServer(MODERN_CONFIG), module: { rules: [ configurePostcssLoader(MODERN_CONFIG), configureImageLoader(MODERN_CONFIG), configureSVGLoader(MODERN_CONFIG), ], }, plugins: [new webpack.HotModuleReplacementPlugin()], }, projectConfig ); module.exports = (env) => { const BUILD_TYPE = env && env.BUILD_TYPE; // Output either a legacy, modern or combined config. // Defaults to modern for development. switch (BUILD_TYPE) { case "combined": return [legacyConfig, modernConfig]; case "legacy": return [legacyConfig]; case "modern": default: return [modernConfig]; } };