我做到了,是
- 分離重要的CSS到自己的資產與separate loader rule and ExtractTextPlugin instance的方式;
- 禁用默認注入
html-webpack-plugin
以手動在模板中注入資產;
- 非關鍵資產通過鏈接注入文件(example)。關鍵CSS使用
compilation
變量(example)內聯注入。
注。您可以將邏輯放入HtmlWebpackPlugin
選項中的函數中。示例在答案的最後。
這樣一來,人們幾乎可以完全控制資產的包含方式,如標籤,屬性,位置。
有幾個插件,也可能與內聯CSS和JS幫助,如
但他們帶走具有充分的靈活性控制格式,邏輯和輸出,並將其替換爲有限的配置選項。
實例配置
plugins: [
//...
new HtmlWebpackPlugin({
template: 'path-to-index-template',
inject: false,
injectCriticalCss(htmlWebpackPluginStats, compilation) {
return lodash(htmlWebpackPluginStats.files.chunks)
.map(chunk => chunk.css)
.flatten()
.filter(cssFilename => /^critical\b/.test(cssFilename))
.map(cssFilename => `<style>${
compilation.assets[cssFilename].source()
}</style>`)
.join('\n');
},
injectNonCriticalCss(htmlWebpackPluginStats) {
return lodash(htmlWebpackPluginStats.files.chunks)
.map(chunk => chunk.css)
.flatten()
.filter(cssFilename => !/^critical\b/.test(cssFilename))
.map(cssFilename => `<link rel="preload" as="style" href="${
cssFilename
}" onload="this.rel='stylesheet'"/>`)
.join('\n');
},
//...
}),
//...
]
,然後在模板
<html>
<head>
<!-- ... -->
<%= htmlWebpackPlugin.options.injectCriticalCss(htmlWebpackPlugin, compilation) %>
</head>
<body>
<!-- ... -->
<%= htmlWebpackPlugin.options.injectNonCriticalCss(htmlWebpackPlugin) %>
</body>
</html>
但怎麼能只用於CSS的一部分?此外,這將加載作爲外部源的CSS,並且我希望它被打印到HEAD –
您的js文件中的每個css和scss導入都將被鏈接到您提到的ExtractTextPlugin的css文件中。例如。所有用於entry.js文件的導入的css或scss文件都將寫入您指定給ExtractTextPlugin的css文件。請試試看,我相信它會起作用。 – wrufesh
好吧,這樣可以讓我生成部分CSS,但它仍然會將其作爲外部資源加載。如何將其打印到HEAD以便立即可用? –