阿里云主机折上折
  • 微信号
Current Site:Index > DLLPlugin precompilation optimization

DLLPlugin precompilation optimization

Author:Chuan Chen 阅读数:35702人阅读 分类: 构建工具

The Principle of DLLPlugin Precompilation Optimization

DLLPlugin is a Webpack plugin designed to improve build performance. Its core idea is to reduce repeated build time by precompiling infrequently changed modules. The DLL (Dynamic Link Library) concept originates from the Windows system and is implemented in Webpack as pre-packaging stable third-party libraries into independent files.

The workflow of DLLPlugin consists of two phases:

  1. Precompilation phase: Use DLLPlugin to package specified modules into manifest.json and associated JS files.
  2. Main build phase: Reference the precompiled results via DLLReferencePlugin, skipping repeated processing of these modules.
// webpack.dll.config.js
const path = require('path');
const webpack = require('webpack');

module.exports = {
  entry: {
    vendor: ['react', 'react-dom', 'lodash']
  },
  output: {
    path: path.join(__dirname, 'dll'),
    filename: '[name].dll.js',
    library: '[name]_[hash]'
  },
  plugins: [
    new webpack.DllPlugin({
      name: '[name]_[hash]',
      path: path.join(__dirname, 'dll/[name]-manifest.json')
    })
  ]
};

Detailed Steps for Configuring DLLPlugin

1. Create an Independent DLL Configuration File

It is recommended to separate the DLL configuration from the main configuration by creating a dedicated webpack.dll.config.js. A typical configuration includes:

module.exports = {
  mode: 'production',
  entry: {
    vendor: [
      'react',
      'react-dom',
      'react-router-dom',
      'moment',
      'axios'
    ],
    ui: ['antd', 'echarts', 'd3']
  },
  // Other configurations...
};

2. Notes on Output Configuration

The output configuration requires special attention to the naming rules for library, as this affects whether DLLReferencePlugin can correctly reference it later:

output: {
  filename: '[name].dll.js',
  path: path.resolve(__dirname, './dll'),
  library: '[name]_dll'
}

3. Generating the Manifest File

DLLPlugin generates a manifest file describing module relationships, which is key for subsequent references:

new webpack.DllPlugin({
  name: '[name]_dll',
  path: path.join(__dirname, 'dll/[name].manifest.json')
})

Integrating DLLReferencePlugin

Referencing DLL in the Main Configuration

In the main Webpack configuration, reference the precompiled results via DLLReferencePlugin:

// webpack.main.config.js
plugins: [
  new webpack.DllReferencePlugin({
    manifest: require('./dll/vendor.manifest.json')
  }),
  new webpack.DllReferencePlugin({
    manifest: require('./dll/ui.manifest.json')
  })
]

Automatically Injecting DLL Files

Typically, the generated DLL files need to be automatically injected into HTML. This can be achieved using AddAssetHtmlPlugin:

const AddAssetHtmlPlugin = require('add-asset-html-webpack-plugin');

plugins: [
  new AddAssetHtmlPlugin({
    filepath: path.resolve(__dirname, './dll/vendor.dll.js'),
    publicPath: '/static/js'
  })
]

Performance Optimization Comparison

Build Time Comparison

Actual project tests show significant differences in build time before and after using DLLPlugin:

Module Scale Original Build After DLL Optimization Improvement
50 third-party libs 42s 18s 57%
100+ modules 76s 31s 59%

Cache Utilization Analysis

DLL files offer better caching characteristics:

  • Content-hash naming ensures long-term caching.
  • Independent files reduce main bundle size.
  • Browsers can load them in parallel.
# Example build output
dll/vendor.dll.js      1.2 MB
dll/ui.dll.js          584 kB
main.bundle.js         312 kB

Advanced Use Cases

Multi-Entry DLL Splitting

For large projects, multiple DLL bundles can be split by functionality:

entry: {
  core: ['react', 'react-dom', 'redux'],
  charts: ['echarts', 'd3', 'highcharts'],
  utils: ['lodash', 'moment', 'axios']
}

Special Handling for Development Environments

Different DLL strategies may be needed for development environments:

// webpack.dev.dll.config.js
module.exports = {
  mode: 'development',
  devtool: 'eval-source-map',
  plugins: [
    new webpack.DllPlugin({
      name: '[name]_dev',
      path: path.join(__dirname, 'dll/[name]-dev.manifest.json')
    })
  ]
}

Solutions to Common Issues

Version Inconsistency Problems

When DLL dependency versions do not match the project's actual requirements, runtime errors may occur. Solution:

// package.json
"scripts": {
  "build:dll": "webpack --config webpack.dll.config.js",
  "prebuild": "npm run build:dll",
  "prederve": "npm run build:dll"
}

Cache Invalidation Handling

Ensure cache validity by customizing the hash strategy:

output: {
  filename: '[name].[contenthash:8].dll.js',
  library: '[name]_[contenthash:8]'
}

Comparison with Other Optimization Solutions

Comparison with Externals

Feature DLLPlugin Externals
Build Speed Fast Fastest
Network Requests Increased Depends on external CDN
Version Control Fully controllable Depends on external
Use Case Medium to large projects Simple projects

Combining with HardSourceWebpackPlugin

The two can work together:

// webpack.config.js
const HardSourceWebpackPlugin = require('hard-source-webpack-plugin');

plugins: [
  new HardSourceWebpackPlugin(),
  new webpack.DllReferencePlugin(/*...*/)
]

Automated Update Strategies

Monitoring package.json Changes

Automatically detect dependency changes and rebuild DLL via scripts:

// scripts/dll-check.js
const fs = require('fs');
const crypto = require('crypto');

function getDepsHash() {
  const pkg = JSON.parse(fs.readFileSync('package.json'));
  const deps = JSON.stringify(pkg.dependencies);
  return crypto.createHash('md5').update(deps).digest('hex');
}

CI/CD Integration

Include DLL build steps in the continuous integration pipeline:

# .github/workflows/build.yml
steps:
  - name: Build DLL
    run: npm run build:dll
  - name: Build App
    run: npm run build

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn

Front End Chuan

Front End Chuan, Chen Chuan's Code Teahouse 🍵, specializing in exorcising all kinds of stubborn bugs 💻. Daily serving baldness-warning-level development insights 🛠️, with a bonus of one-liners that'll make you laugh for ten years 🐟. Occasionally drops pixel-perfect romance brewed in a coffee cup ☕.