DllPlugin e DllReferencePlugin
Os plugins Dll e DllReference permitem que o código seja dividido em vários pacotes de forma que os pacotes possam ser compilados independentemente.
É possível construir scripts “fornecedor” em uma biblioteca que não precisa ser compilada com frequência (ex: React, jQuery, Bootstrap, Fontawesome…) e referenciá-la em seu pacote de aplicativos que precisará desses scripts.
O pacote de aplicativos, aquele que será constantemente alterado, estará em uma configuração separada apenas referenciando um pacote de “fornecedor” já construído.
Sintaxe
- new webpack.DllPlugin({ caminho: ‘[nome]-manifest.json’, nome: ‘[nome]_[hash]’ })
- new webpack.DllReferencePlugin({ context: __dirname, manifest: require(’./packname-manifest.json’) })
Configuração do fornecedor (DllPlugin)
Nota: O output.library
e o name
(em DllPlugin) devem ser os mesmos.
const path = require('path');
const webpack = require('webpack');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const extractCSS = new ExtractTextPlugin('vendor.css');
const isDevelopment = process.env.NODE_ENV !== 'production';
module.exports = {
resolve: {
extensions: ['.js'],
},
module: {
rules: [
{ test: /\.(png|woff|woff2|eot|ttf|svg)$/, loader: 'url-loader?limit=100000' },
{ test: /\.s?css$/i, loader: extractCSS.extract(['css-loader?minimize', 'sass-loader']) },
{ test: /\.json$/, loader: 'json-loader' },
],
},
entry: {
vendor: [
'babel-polyfill',
'font-awesome/scss/font-awesome.scss',
'bootstrap/scss/bootstrap.scss',
'jquery',
'history',
'react',
'react-dom',
'redux',
'react-redux',
'react-router',
'react-router-dom',
'react-router-redux',
'redux-thunk',
],
},
output: {
path: path.resolve('./dist'),
filename: '[name].js',
library: '[name]_[hash]',
},
plugins: [
extractCSS,
new webpack.DllPlugin({
path: path.join(__dirname, 'dist', '[name]-manifest.json'),
name: '[name]_[hash]',
})
].concat(isDevelopment ? [] : [
new webpack.optimize.UglifyJsPlugin({
beautify: false,
comments: false,
}),
]),
};
Referenciando um pacote de DLL (DllReferencePlugin)
Nota: manifest
(em DllReferencePlugin) deve referenciar path
(definido em DllPlugin)
const webpack = require('webpack');
const path = require('path');
const isDevelopment = process.env.NODE_ENV !== 'production';
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const extractCSS = new ExtractTextPlugin('app.css');
const merge = require('extendify')({ isDeep: true, arrays: 'concat' });
module.exports = merge({
context: __dirname,
entry: {
app: (isDevelopment ? ['webpack-hot-middleware/client'] : []).concat(['./src/']),
},
output: {
path: path.resolve('./dist'),
publicPath: '/static',
filename: '[name].js',
},
resolve: {
extensions: ['.js', '.ts', '.tsx'],
},
module: {
loaders: [
{
test: /\.tsx?$/,
loader: 'babel-loader!awesome-typescript-loader?forkChecker=true',
include: /src|spec/,
},
{
test: /\.s?css$/,
loader: extractCSS.extract(['css-loader?minimize', 'sass-loader']),
include: /src/,
},
],
},
plugins: [
new webpack.DllReferencePlugin({
context: __dirname,
manifest: require('./dist/vendor-manifest.json'),
}),
new webpack.DefinePlugin({
'process.env': {
'ENV': JSON.stringify(process.env.NODE_ENV),
},
}),
extractCSS,
],
}, isDevelopment ? require('./webpack.config.development') : require('./webpack.config.production'));