webpack-config-helper v2.0.16
webpack-config-helper
Utility to make it easier to construct your webpack config. It only supports the Webpack 2 config.
This helper is based on the material presented in Stephen Grider's Udemy course Webpack 2: The Complete Developer's Guide.
For more information about Webpack, be sure to read the Concepts and Guides.
Definitions
- Modules -- preprocessing on each file before it is added to the output.
- Webpack 1 - preprocessing steps are called loaders
- Webpack 2 - preprocessing is part of the module system with each loader as rule
- Plugins -- work outside the Webpack pipleine. Have the ability to keep files from ending up in the output.
Installation
This module is distributed via npm which is bundled with node and should
be installed as one of your project's devDependencies:
yarn add --dev webpack-config-helperUsage
It is expected that you use this in your webpack.config.js file. For example, to create a config that uses Babel, splits vendor code into a separate bundle, and bundles up CSS, you might using something like the following.
const wpConfig = require('webpack-config-helper');
function customizer(config) {
config
.entry('./src/index.jsx', 'bundle')
.entryAndCommonsChunk('vendor')
.addRuleForBabel()
.addRuleForExtractCssModules()
.addHtmlWebpackPlugin()
.echo();
}
module.exports = wpConfig.generate(customizer);Summary
generate-- generate a minimal webpack config and allow for customizationentry-- override the default entry pointentryAndCommonsChunk-- add entry point and code splittingoutput-- override the default outputaddRuleForBabel-- add a rule to support Babel (NOTE: requires prerequisites)addRuleForInlineCssModules-- add a rule to support inline CSS modules (NOTE: requires prerequisites)addRuleForExtractCssModules-- add a rule to support extracting CSS modules into a file (NOTE: requires prerequisites)addRuleForImages-- add a rule to support images (NOTE: requires prerequisites)addCommonsChunk-- add a plugin to support code splitting (NOTE: requires prerequisites)addHtmlWebpackPlugin-- add a plugin to support creating top-level html file (NOTE: requires prerequisites)addEnvironment-- add thewebpack --envvalue or theprocess.env.NODE_ENVas a window scope variable for Reactcustom-- invoke callback to allow custom changes to the config objectecho-- display the current state of the config object
generate ( callback )
The generate factory method creates a minimal webpack configuration choosing defaults for entry and output.
The options callback function takes an instance of the wpConfig.
const wpConfig = require('webpack-config-helper');
function customizer(config) {
}
module.exports = wpConfig.generate(customizer);will generate the following.
{
"entry": {
"bundle": "./src/index.js"
},
"output": {
"path": "/full/path/to/build",
"filename": "[name].[chunkhash].js"
},
"module": {
"rules": []
},
"plugins": []
}entry ( path , bundle )
Add a named entry point.
The first use of entry will override the default named entry point bundle to path ./src/index.js.
Additional uses of entry add additional named entry points.
For example,
function customizer(config) {
config.entry('./src/app.js', 'app');
}will update the config in the following way.
{
"entry": {
"app": "./src/app.js"
}
}output ( directory )
Override the default output. For example,
function customizer(config) {
config.output('dest');
}will update the config in the following way.
{
"output": {
"path": "/full/path/to/dest",
"filename": "[name].[chunkhash].js"
}
}addRuleForBabel ( overridePattern )
Add a rule to the module.rules for Babel. By default, the file test pattern includes both .js and .jsx. You can optionally pass in an override pattern. For example,
function customizer(config) {
config.addRuleForBabel();
}will push the following rule to module.rules.
{
use: 'babel-loader',
test: /\.jsx?$/,
exclude: "/node_modules/"
}There are two prerequisites to adding this to your config. First, you need to install Babel. For example,
yarn add --dev babel-core
yarn add --dev babel-loader
yarn add --dev babel-preset-es2015
yarn add --dev babel-preset-react
# yarn add --dev babel-preset-stage-0
# yarn add --dev babel-preset-envbabel-loader- teaches Babel how to work with Webpack (compatibility layer)babel-core- knows how to take in code, parse it, and generate some output files
And second, you need to create a .babelrc file. For example,
{
"presets": ["react", "es2015"]
}addRuleForInlineCssModules
Inject CSS modules into the head tag using a style tag. Add a rule to the module.rules for babel. For example,
function customizer(config) {
config.addRuleForInlineCssModules();
}will push the following rule to module.rules.
{
use: ['style-loader', 'css-loader?modules&localIdentName=[path][name]_[local]_[hash:base64:5]'],
test: /\.css$/
}There is a prerequisite to adding this to your config. You need to install the css and style loaders. For example,
css-loader- knows how to import and parse with CSS importsstyle-loader- takes CSS imports and adds them as astyletag in the HTML document
npm install --save-dev style-loader css-loader # for exampleaddRuleForExtractCssModules ( cssName )
Extract CSS modules into a file. Add a rule to the module.rules for babel. For example,
function customizer(config) {
config.addRuleForExtractCssModules();
}will push the following rule to module.rules.
{
use: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: 'css-loader?modules&localIdentName=[path][name]_[local]_[hash:base64:5]'
}),
test: /\.css$/
}and will push the following plugin to plugins
new ExtractTextPlugin('[name].[contenthash].css')There is a prerequisite to adding this to your config. You need to install the css loader and extract text plugin. For example,
css-loader- knows how to import and parse with CSS importsstyle-loader- takes CSS imports and adds them as astyletag in the HTML documentextract-text-webpack-plugin- associated with a loader and takes any text generated by the loader and save it to a file
npm install --save-dev css-loader style-loader extract-text-webpack-plugin # for exampleaddRuleForImages
Resize images and include small ones. Add a rule to the module.rules for babel. For example,
function customizer(config) {
config.addRuleForImages();
}will push the following rule to module.rules.
{
test: /\.(jpg|jpeg|png|gif|svg)$/,
use: [
{
loader: 'url-loader',
options: {limit: 40000} // 40K
},
'image-webpack-loader' // applied from right to left
]
}There is a prerequisite to adding this to your config. You need to install the image and url loaders. For example,
image-webpack-loader- resize the imageurl-loader- include small images as data, output large images as files
npm install --save-dev image-webpack-loader url-loader # for exampleaddHtmlWebpackPlugin ( options )
To add the html webpack plugin with a default template to plgins for . For example,
function customizer(config) {
config.addHtmlWebpackPlugin();
}will push the following plugin to plugins
new HtmlWebpackPlugin({
template: './src/index.html',
inject: 'body'
})You can also pass an options object to customize the plugin. For example,
function customizer(config) {
config.addHtmlWebpackPlugin({
template: './assets/index.html'
});
}will push the following plugin to plugins
new HtmlWebpackPlugin({
template: './assets/index.html'
})There is a prerequisite to adding this to your config. You need to install the html webpack plugin. For example,
yarn add --dev html-webpack-pluginaddCommonsChunk
Add a plugin to the plugins for babel. For example,
function customizer(config) {
config.addCommonsChunk('vendor');
}will push the following plugin to plugins.
new webpack.optimize.CommonsChunkPlugin({
names: ['vendor', 'manifest']
})There is a prerequisite to adding this to your config. You need to install the image and url loaders. For example,
npm install --save-dev webpackentryAndCommonsChunk ( bundle , modules )
Add an entry point for the CommonsChunkPlugin. You can specify the modules explicitly or have them read from package.json. For example, specifying explicitly,
function customizer(config) {
config.entryAndCommonsChunk('vendor', ['react', 'redux']);
}will update the entry in the following way.
{
"entry": {
"bundle": "./src/index.js",
"vendor": ["react", "redux"]
}
}and the plugins in the following way.
new webpack.optimize.CommonsChunkPlugin({
names: ['vendor', 'manifest']
});For example, reading from package.json,
function customizer(config) {
config.entryAndCommonsChunk('vendor');
}will update the entry in the following way. (Assuming that lodash was specified in the dependencies section of package.json)
{
"entry": {
"bundle": "./src/index.js",
"vendor": ["lodash"]
}
}custom ( config )
This helper covers the basics. There is no way to handle all possible cases. So the custom method gives you a chance
to add whatever additional configurations you need. For example,
function customize(config) {
var SomeJsPlugin = require('some-js-plugin');
config.module.rules.push({
use: 'some-js-loader'
test: /\.js$/
});
config.plugin.push(new SomeJsPlugin());
}
function customizer(config) {
config.custom(customize);
}addEnvironment
Add an environment to the window scope.
function customizer(config) {
config.addEnvironment();
}For example, using --env.
webpack --env=productionor using NODE_ENV
NODE_ENV=production webpackwill add this plugin to plugins in the following way.
new webpack.DefinePlugin({
'process.env.NODE_ENV': 'production'
});echo
Display the current state of the config. For example,
function customizer(config) {
config.addRuleForBabel().echo();
}will display the config showing the entry, output, and module.rules for Babel.
You can display the config multiple times to see how it changes. For example,
function customizer(config) {
config.echo().addRuleForBabel().echo();
}will display the config at two different points in time.
Other helpful things
Scripts
Add the following scripts to your package.json.
"scripts": {
"clean": "rm -rf build dist",
"start": "npm run clean && webpack-dev-server --host 192.168.33.60 --port 3000",
"build": "NODE_ENV=production npm run clean && webpack --progress -p"
},webpack-dev-server
Install the webpack-dev-server.
npm install --save-dev webpack-dev-serverLICENSE
MIT
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago