Skip to content

Instantly share code, notes, and snippets.

@Lodo4ka
Created June 19, 2018 15:35
Show Gist options
  • Save Lodo4ka/65b00c524c7e330feac11996d9e9252c to your computer and use it in GitHub Desktop.
Save Lodo4ka/65b00c524c7e330feac11996d9e9252c to your computer and use it in GitHub Desktop.
let webpack = require('webpack');
let webpackDefaultConfig = require('./webpack-default');
let Entry = require('./Entry');
let webpackRules = require('./webpack-rules');
let webpackPlugins = require('./webpack-plugins');
process.noDeprecation = true;
class WebpackConfig {
/**
* Create a new instance.
*/
constructor() {
this.webpackConfig = webpackDefaultConfig();
}
/**
* Build the Webpack configuration object.
*/
build() {
this.buildEntry()
.buildOutput()
.buildRules()
.buildPlugins()
.buildResolving()
.mergeCustomConfig();
Mix.dispatch('configReady', this.webpackConfig);
return this.webpackConfig;
}
/**
* Build the entry object.
*/
buildEntry() {
let entry = new Entry();
if (! Mix.bundlingJavaScript) {
entry.addDefault();
}
Mix.dispatch('loading-entry', entry);
this.webpackConfig.entry = entry.get();
return this;
}
/**
* Build the output object.
*/
buildOutput() {
let http = process.argv.includes('--https') ? 'https' : 'http';
if (Mix.isUsing('hmr')) {
this.webpackConfig.devServer.host = Config.hmrOptions.host;
this.webpackConfig.devServer.port = Config.hmrOptions.port;
}
this.webpackConfig.output = {
path: path.resolve(Mix.isUsing('hmr') ? '/' : Config.publicPath),
filename: '[name].js',
chunkFilename: '[name].js',
publicPath: Mix.isUsing('hmr')
? http +
'://' +
Config.hmrOptions.host +
':' +
Config.hmrOptions.port +
'/'
: '/'
};
return this;
}
/**
* Build the rules array.
*/
buildRules() {
this.webpackConfig.module.rules = this.webpackConfig.module.rules.concat(
webpackRules()
);
Mix.dispatch('loading-rules', this.webpackConfig.module.rules);
return this;
}
/**
* Build the plugins array.
*/
buildPlugins() {
this.webpackConfig.plugins = this.webpackConfig.plugins.concat(
webpackPlugins()
);
Mix.dispatch('loading-plugins', this.webpackConfig.plugins);
return this;
}
/**
* Build the resolve object.
*/
buildResolving() {
this.webpackConfig.resolve = {
extensions: ['*', '.js', '.jsx', '.vue'],
alias: {
vue$: 'vue/dist/vue.common.js'
}
};
return this;
}
/**
* Merge the user's custom Webpack configuration.
*/
mergeCustomConfig() {
if (Config.webpackConfig) {
this.webpackConfig = require('webpack-merge').smart(
this.webpackConfig,
Config.webpackConfig
);
}
}
}
module.exports = WebpackConfig;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment