1414 * See the License for the specific language governing permissions and
1515 * limitations under the License.
1616 */
17-
17+ const HtmlWebpackPlugin = require ( 'html-webpack-plugin' )
1818const defaultOptions = require ( './lib/default-options' )
1919const determineAsValue = require ( './lib/determine-as-value' )
2020const doesChunkBelongToHTML = require ( './lib/does-chunk-belong-to-html' )
@@ -23,6 +23,7 @@ const extractChunks = require('./lib/extract-chunks')
2323class PreloadPlugin {
2424 constructor ( options ) {
2525 this . options = Object . assign ( { } , defaultOptions , options )
26+ this . webpackMajorVersion = 4
2627 }
2728
2829 generateLinks ( compilation , htmlPluginData ) {
@@ -33,18 +34,23 @@ class PreloadPlugin {
3334 } )
3435
3536 const htmlChunks = options . include === 'allAssets'
36- // Handle all chunks.
37+ // Handle all chunks.
3738 ? extractedChunks
38- // Only handle chunks imported by this HtmlWebpackPlugin.
39+ // Only handle chunks imported by this HtmlWebpackPlugin.
3940 : extractedChunks . filter ( ( chunk ) => doesChunkBelongToHTML ( {
4041 chunk,
4142 compilation,
42- htmlAssetsChunks : Object . values ( htmlPluginData . assets . chunks )
43+ htmlPluginData,
44+ pluginOptions : options
4345 } ) )
4446
4547 // Flatten the list of files.
4648 const allFiles = htmlChunks . reduce ( ( accumulated , chunk ) => {
47- return accumulated . concat ( chunk . files )
49+ return accumulated . concat ( [
50+ ...chunk . files ,
51+ // sourcemap files are inside auxiliaryFiles in webpack5
52+ ...chunk . auxiliaryFiles || [ ]
53+ ] )
4854 } , [ ] )
4955 const uniqueFiles = new Set ( allFiles )
5056 const filteredFiles = [ ...uniqueFiles ] . filter ( file => {
@@ -62,7 +68,13 @@ class PreloadPlugin {
6268 const sortedFilteredFiles = filteredFiles . sort ( )
6369
6470 const links = [ ]
65- const publicPath = compilation . outputOptions . publicPath || ''
71+ const webpackPublicPath = compilation . outputOptions . publicPath
72+
73+ // webpack 5 set publicPath default value 'auto'
74+ const publicPath = this . webpackMajorVersion >= 5
75+ ? webpackPublicPath . trim ( ) !== '' && webpackPublicPath !== 'auto'
76+ ? webpackPublicPath : ''
77+ : webpackPublicPath || ''
6678 for ( const file of sortedFilteredFiles ) {
6779 const href = `${ publicPath } ${ file } `
6880
@@ -99,6 +111,11 @@ class PreloadPlugin {
99111 }
100112
101113 apply ( compiler ) {
114+ // for webpack5+, we can get webpack version from `compiler.webpack`
115+ if ( compiler . webpack ) {
116+ this . webpackMajorVersion = compiler . webpack . version . split ( '.' ) [ 0 ]
117+ }
118+
102119 const skip = data => {
103120 const htmlFilename = data . plugin . options . filename
104121 const exclude = this . options . excludeHtmlNames
@@ -112,26 +129,28 @@ class PreloadPlugin {
112129 compiler . hooks . compilation . tap (
113130 this . constructor . name ,
114131 compilation => {
115- compilation . hooks . htmlWebpackPluginBeforeHtmlProcessing . tap (
132+ HtmlWebpackPlugin . getHooks ( compilation ) . beforeAssetTagGeneration . tapAsync (
116133 this . constructor . name ,
117- ( htmlPluginData ) => {
134+ ( htmlPluginData , callback ) => {
118135 if ( skip ( htmlPluginData ) ) {
136+ callback ( )
119137 return
120138 }
121139 this . generateLinks ( compilation , htmlPluginData )
140+ callback ( )
122141 }
123142 )
124143
125- compilation . hooks . htmlWebpackPluginAlterAssetTags . tap (
144+ HtmlWebpackPlugin . getHooks ( compilation ) . alterAssetTags . tap (
126145 this . constructor . name ,
127146 ( htmlPluginData ) => {
128147 if ( skip ( htmlPluginData ) ) {
129148 return
130149 }
131150 if ( this . resourceHints ) {
132- htmlPluginData . head = [
151+ htmlPluginData . assetTags . styles = [
133152 ...this . resourceHints ,
134- ...htmlPluginData . head
153+ ...htmlPluginData . assetTags . styles
135154 ]
136155 }
137156 return htmlPluginData
0 commit comments