Parse and validate user configuration from .webpackrc files with support for environment-specific settings, real-time configuration watching, and comprehensive validation.
Parse user configuration from JSON or JavaScript configuration files with validation and environment support.
/**
* Parse user configuration from config files
* @param opts - Configuration parsing options
* @returns Configuration object with watch capability
*/
function getUserConfig(opts?: {
cwd?: string;
configFile?: string;
disabledConfigs?: string[];
preprocessor?: (config: object) => object;
}): {
config: object;
watch: (devServer: object, watchOpts?: object) => object;
};Parameters:
cwd (string, optional): Current working directory (default: process.cwd())configFile (string, optional): Configuration file name (default: .webpackrc)disabledConfigs (string[], optional): Array of configuration keys to disablepreprocessor (function, optional): Function to preprocess configuration before validationUsage Examples:
const getUserConfig = require('af-webpack/getUserConfig');
// Basic usage
const { config } = getUserConfig();
console.log('User configuration:', config);
// Custom configuration file
const { config } = getUserConfig({
cwd: process.cwd(),
configFile: '.mywebpackrc',
disabledConfigs: ['proxy', 'devServer']
});
// With preprocessor
const { config } = getUserConfig({
preprocessor: (config) => {
// Transform configuration before validation
if (config.theme && typeof config.theme === 'string') {
config.theme = require(config.theme);
}
return config;
}
});Watch configuration files for changes and handle hot reloading in development.
/**
* Watch configuration files for changes
* @param opts - Watch configuration options
* @returns File watcher instance
*/
function watchConfigs(opts?: {
cwd?: string;
configFile?: string;
}): object;
/**
* Stop watching configuration files
*/
function unwatchConfigs(): void;Usage Examples:
const { getUserConfig, watchConfigs, unwatchConfigs } = require('af-webpack/getUserConfig');
// Watch configuration changes during development
const { config, watch } = getUserConfig();
// In development server context
const watcher = watch(devServer, {
beforeChange: () => {
console.log('Configuration is about to change...');
}
});
// Manual file watching
const fileWatcher = watchConfigs({
cwd: process.cwd(),
configFile: '.webpackrc'
});
// Stop watching when done
unwatchConfigs();af-webpack supports multiple configuration file formats:
JSON Configuration (.webpackrc):
{
"entry": {
"index": "./src/index.js"
},
"outputPath": "dist",
"publicPath": "/",
"alias": {
"@": "./src"
},
"proxy": {
"/api": {
"target": "http://localhost:3001",
"changeOrigin": true
}
},
"env": {
"development": {
"define": {
"API_BASE": "http://localhost:3001"
}
},
"production": {
"define": {
"API_BASE": "https://api.example.com"
}
}
}
}JavaScript Configuration (.webpackrc.js):
export default {
entry: {
index: './src/index.js'
},
outputPath: 'dist',
publicPath: '/',
chainConfig: (config) => {
config.plugin('custom').use(CustomPlugin);
},
proxy: {
'/api': {
target: process.env.API_TARGET || 'http://localhost:3001',
changeOrigin: true
}
}
};Configure different settings for development, production, and custom environments.
// Configuration structure with environment overrides
{
// Base configuration
"outputPath": "dist",
"publicPath": "/",
// Environment-specific overrides
"env": {
"development": {
"publicPath": "/",
"devtool": "cheap-module-eval-source-map"
},
"production": {
"publicPath": "/static/",
"hash": true,
"minimize": true
},
"staging": {
"publicPath": "/staging/",
"define": {
"API_BASE": "https://staging-api.example.com"
}
}
}
}Automatic replacement of npm package variables in configuration values.
// Configuration with npm variables
{
"define": {
"PACKAGE_NAME": "$npm_package_name",
"PACKAGE_VERSION": "$npm_package_version"
}
}
// Variables are automatically replaced:
// $npm_package_name -> actual package name from package.json
// $npm_package_version -> actual version from package.jsonComprehensive validation system with helpful error messages and suggestions.
Validation Features:
Error Handling:
// Invalid configuration example
{
"outpuPath": "dist", // Typo in "outputPath"
"poxy": { // Typo in "proxy"
"/api": "http://localhost:3001"
}
}
// Validation errors:
// "Configuration item outpuPath is not valid, do you mean outputPath?"
// "Configuration item poxy is not valid, do you mean proxy?"Intelligent configuration merging for arrays and objects:
Special integration with development server for live configuration reloading:
// Watch configuration in development server
const { config, watch } = getUserConfig();
const watcher = watch(devServer, {
beforeChange: () => {
// Prepare for configuration change
clearConsole();
}
});
// Configuration change handling:
// - Automatic server restart for structural changes
// - Hot reload for compatible changes
// - Error overlay for invalid configurationsAll configuration options from the Configuration Generation documentation are supported, including:
entry, outputPath, publicPath, hashbabel, typescript, extraBabelPresets, extraBabelPluginstheme, lessLoaderOptions, sass, cssModules*devServer, proxy, devtoolcopy, alias, externalsminimizer, uglifyJSOptions, terserJSOptionsSee Configuration Plugins for the complete list of available options and their validation rules.