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
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')
})
]
}
複製代碼
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') }) ] } 複製代碼
因爲動態連接庫咱們通常只編譯一次,除非依賴的三方庫更新,以後就不用編譯,所以入口的 index.js 文件中不包含這些模塊,因此要在 index.html 中單獨引入。
git
兩種方案github
因此咱們確定會採用第二種方式,下面着重講下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
}
])
]
}
複製代碼
<!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