Webpack DllPlugin 讓構建速度柔順絲滑

概念

DLLPlugin 和 DLLReferencePlugin 用某種方法實現了拆分 bundles,同時還大大提高了構建的速度,將包含大量複用模塊且不會頻繁更新的庫進行編譯,只須要編譯一次,編譯完成後存在指定的文件中。在以後的構建過程當中不會再對這些模塊進行編譯,而是直接使用 DllReferencePlugin 來引用動態連接庫的代碼。通常會對經常使用的第三方模塊使用這種方式,例如 react、react-dom、lodash 等。只要這些模塊不升級更新,這些動態連接庫就不須要從新編譯。javascript

摘要

本文介紹了 Webpack 中 DllPlugin 插件的使用,以及配合使用 AddAssetHtmlPlugin 或者 HtmlWebpackIncludeAssetsPlugin 將構建好的 JS 文件插入到 html頁面中html

代碼地址

github: 源碼
歡迎交流,Star!java

項目目錄

常規webpack項目,搭建過程本文章不在描述react

myreact
|- /build
  |- webpack.config.js
  |- webpack.dll.conf.js
|- /dist
  |- dll
  |- js
|- /src
  |- index.js
|- package.json
|- index.html
複製代碼

具體項目結構,請看下圖webpack

下面開始DLL之旅

一.build目錄下建立webpack.dll.conf.js(DllPlugin)

const webpack = require("webpack")
const path = require('path')
const CleanWebpaclPlugin = require('clean-webpack-plugin');
const resolve = (dir) => path.join(__dirname, '..', dir);

module.exports = {
  entry: {
    # 將 react、lodash等模塊做爲入口編譯成動態連接庫
    vendor: ['react', 'react-dom', 'react-router-dom', 'lodash']
  },
  output: {
    # 指定生成文件所在目錄文件夾,
    # 將它們存放在了 src 文件夾下
    path: resolve('public'),
    # 指定文件名
    library: '_dll_[name]',
    # 存放動態連接庫的全局變量名稱,例如對應 lodash 來講就是 lodash_dll_lib
    # 這個名稱須要與 DllPlugin 插件中的 name 屬性值對應起來
    filename: 'dll/_dll_[name].[hash].js'
  },
  plugins: [
    new CleanWebpaclPlugin(['dll'], {
        root: resolve('public')
    }),
    new webpack.DllPlugin({
      name: '_dll_[name]',
    # 和output.library中一致,值就是輸出的manifest.json中的 name值
      path: path.join(__dirname, '../public/dll', '[name].manifest.json')
    })
  ]
}
複製代碼

二. 建立webpack.base.conf.js 使用 DllReferencePlugin

const path = require('path');
const webpack = require('webpack');
const HTMLWebpackPlugin = require('html-webpack-plugin');
const CleanWebpaclPlugin = require('clean-webpack-plugin');
const resolve = (dir) => path.join(__dirname, '..', dir);

module.exports = {
    entry: './src/index.js',
    output: {
        path: resolve('dist'),
        filename: 'js/[name].[hash].js',
        library: '_dll_[name]'
    },
    plugins: [
        # 需添加root 不然沒法刪除,exclude未生效
        new CleanWebpackPlugin(['dist'], {
          root: path.join(__dirname, '..')
        }),
        new HTMLWebpackPlugin({
            title: 'Webpak DllPlugin 的使用',
            template: resolve('index.html'),
            filename: 'index.html'
        }),
        new webpack.DefinePlugin({
            'process.env.NODE_ENV': JSON.stringify('production')
        }),
        # 告訴 Webpack 使用動態連接庫
        new webpack.DllReferencePlugin({
            // 描述 lodash 動態連接庫的文件內容
            manifest: require(../public/dll/vendor.manifest') }) ] } 複製代碼

3、在 index.html 文件中引入動態連接庫

因爲動態連接庫咱們通常只編譯一次,除非依賴的三方庫更新,以後就不用編譯,所以入口的 index.js 文件中不包含這些模塊,因此要在 index.html 中單獨引入。
git

兩種方案github

  1. 手動添加script,手動copy打包好的dll文件夾到dist,麻煩反覆,很不爽
  2. 使用add-asset-html-webpack-plugin或者html-webpack-include-assets-plugin插入到html中,簡單自動化,美滋滋

因此咱們確定會採用第二種方式,下面着重講下add-asset-html-webpack-plugin與html-webpack-include-assets-plugin插件的使用,項目中使用add-asset-html-webpack-pluginweb

安裝大同小異

npm install add-asset-html-webpack-plugin -D
npm install html-webpack-include-assets-plugin -D
複製代碼

使用也有類似的地方

webpack.base.conf.js 文件中進行使用npm

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

module.exports = {
    ...,
    plugins: [
        ...,
        # 給定的 JS 或 CSS 文件添加到 webpack 配置的文件中,並將其放入資源列表 html webpack插件注入到生成的 html 中。
        new AddAssetHtmlPlugin([
            {
                # 要添加到編譯中的文件的絕對路徑
                filepath: path.resolve(__dirname,'../public/dll/_dll_vendor.js'),
                outputPath: 'dll',
                publicPath: 'dll',
                includeSourcemap: false
            }
        ])
    ]
}

複製代碼
# html-webpack-include-assets-plugin
...;
const HtmlWebpackIncludeAssetsPlugin = require('html-webpack-include-assets-plugin');

module.exports = {
    ...,
    plugins: [
        ...,
        # 給定的 JS 或 CSS 文件添加到 webpack 配置的文件中,並將其放入資源列表 html webpack插件注入到生成的 html 中。
        new HtmlWebpackIncludeAssetsPlugin([
            {
                assets: ['dll/_dll_vendor.js'],
                append: false
            }
        ])
    ]
}

複製代碼

二者區別

index.html

<!DOCTYPE html>
<html>
    
    <head>
        <meta charset="UTF-8">
        <title>愛你的一隻貓哈哈哈1111</title>
    </head>
    
    <body>
        <div id='root'></div>

</html>
<script type="text/javascript" src="dll/_dll_vendor.js"></script>
<script type="text/javascript" src="/js/runtime.830efec54753fd6ed91b.js"></script>
<script type="text/javascript" src="/js/vendors.830efec54753fd6ed91b.js"></script>
<script type="text/javascript" src="/js/app.830efec54753fd6ed91b.js"></script>
複製代碼

運行項目

npm run build
複製代碼

查看dist文件下的文件json

相關文檔

webpack 中文

相關文章
相關標籤/搜索