跳到主要内容

DllPlugin 和 DLLReferencePlugin

一、认识


有些时候,如果所有的JS文件都打成一个JS文件,会导致最终生成的JS文件很大,这个时候,我们就要考虑拆分 bundles

DllPluginDLLReferencePlugin 可以实现拆分 bundles,并且可以大大提升构建速度,DllPluginDLLReferencePlugin 都是 webpack 的内置模块。

我们使用 DllPlugin 将不会频繁更新的库进行编译,当这些依赖的版本没有变化时,就不需要重新编译。

二、语法


  1. 新建一个 webpack 的配置文件,来专门用于编译动态链接库,例如名为: webpack.config.dll.js

    //webpack.config.dll.js
    const webpack = require('webpack');
    const path = require('path');

    module.exports = {
    entry: {
    react: ['react', 'react-dom']
    },
    mode: 'production',
    output: {
    filename: '[name].dll.[hash:6].js',
    path: path.resolve(__dirname, 'dist', 'dll'),
    library: '[name]_dll' //暴露给外部使用
    //libraryTarget 指定如何暴露内容,缺省时就是 var
    },
    plugins: [
    new webpack.DllPlugin({
    //name和library一致
    name: '[name]_dll',
    path: path.resolve(__dirname, 'dist', 'dll', 'manifest.json') //manifest.json的生成路径
    })
    ]
    }
  2. package.jsonscripts 中增加:

    {
    "scripts": {
    "dev": "NODE_ENV=development webpack-dev-server",
    "build": "NODE_ENV=production webpack",
    "build:dll": "webpack --config webpack.config.dll.js"
    },
    }

    执行 npm run build:all,可以看到 dist 目录如下,之所以将动态链接库单独放在 dll 目录下,主要是为了使用 CleanWebpackPlugin 更为方便的过滤掉动态链接库。

  3. 修改 webpack 的主配置文件: webpack.config.js 的配置

    //webpack.config.js
    const webpack = require('webpack');
    const path = require('path');
    module.exports = {
    //...
    devServer: {
    contentBase: path.resolve(__dirname, 'dist')
    },
    plugins: [
    new webpack.DllReferencePlugin({
    manifest: path.resolve(__dirname, 'dist', 'dll', 'manifest.json')
    }),
    new CleanWebpackPlugin({
    cleanOnceBeforeBuildPatterns: ['**/*', '!dll', '!dll/**'] //不删除dll目录
    }),
    //...
    ]
    }
  4. 修改 public/index.html 文件,在其中引入 react.dll.js

    <script src="/dll/react.dll.9dcd9d.js"></script>