webpack.DllPlugin分包

437 阅读2分钟

前言

在webpack 进行分包前如果使用externals,会在html页面生成多个script链接,如果后面还有redux,react-redux,这些基础包都会通过script单独加在html页面中

new HtmlWebpackExternalsPlugin({
        externals: [{
            module: 'react', entry: 'cdn地址’, global:'React',
            module: 'react-dom', entry: 'cdn地址’, global:'ReactDOM'
        }]
    })

如果使用optimization.splitChunks 这个在每次提取基础包还是需要耗费构建时间

那有没有更好的方案了 其实我们可以使用预编译资源模块只需要预编译一次,后面的基础包时间都可以省略掉

使用

webpack.config.dll.js 使用DllPlugin进行分包

let path = require('path')
let webpack = require('webpack')

module.exports = {
    mode:'production',
    // context: process.cwd(),
    // resolve: {
    //     extensions: ['.js','.jsx','.json','.less','.css'],
    //     modules:[__dirname, 'node_modules']
    // },
    entry: {
        library: [
            'react', 
            'react-dom'
        ]
    },
    output: {
        filename: '[name].dll.js',  // 产生的文件名
        path: path.join(__dirname, 'dist/library'),
        library: '[name]',     // 给输出的结果加个名字
    },
    plugins: [
       new webpack.DllPlugin({
           name: '[name]',   // name === library
           path: path.resolve(__dirname, 'dist/library/[name].json')  // manifest.json 定义了各个模块的路径
       })
    ]
}

在package.json 中加入执行链接

"scripts": {
    "eslint": "eslint ./lib --fix",
    "dll":"webpack --config webpack.config.dll.js",
    ....
}

执行命令 npm run dll

在dist目录下生成文件

image.png

在webpack.config.js 使用DllReferencePlugin对library.json引用

const config = {
  ...,
  output: {
    path: path.join(projectRoot, 'dist'),
    filename: 'js/[name]_[chunkhash:8].js',
    clean: {
      keep: /library\// // 保留 'dist/library' 下的静态资源
    },
  },
  plugins: [
     new webpack.DllReferencePlugin({
      manifest: require('./dist/library/library.json')
    }),
  ]
}

执行npm run dev

 DONE  Compiled successfully in 1383ms                                                                                                           下午6:05:46

assets by status 11 KiB [cached] 2 assets
assets by status 77 KiB [emitted]
  assets by path js/*.js 76.2 KiB
    asset js/runtime_b230fa0e.js 47.4 KiB [emitted] [immutable] (name: runtime) 1 related asset
    asset js/search_5cd5baf8.js 28.1 KiB [emitted] [immutable] (name: search) 1 related asset
    asset js/src_search_text_js_3db03168.js 775 bytes [emitted] [immutable] 1 related asset
  assets by status 784 bytes [compared for emit]
    asset search.html 422 bytes [emitted] [compared for emit]
    asset index.html 362 bytes [emitted] [compared for emit]

引用的search.js文件已经将react 文件拿出去了 未使用分包前执行npm run dev,可以看到search文件有1.11M

assets by status 11 KiB [cached] 2 assets
assets by status 1.16 MiB [emitted]
  assets by path js/*.js 1.16 MiB
    asset js/search_d92b1a37.js 1.11 MiB [emitted] [immutable] [big] (name: search) 1 related asset
    asset js/runtime_c210059e.js 47.7 KiB [emitted] [immutable] (name: runtime) 1 related asset
    asset js/src_search_text_js_d4d80e80.js 927 bytes [emitted] [immutable] 1 related asset
  assets by status 784 bytes [compared for emit]
    asset search.html 422 bytes [emitted] [compared for emit]

在html 文件中将基础包单独引入进去

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="root"></div>
    <script src="/library/library.dll.js"></script>
</body>
</html>