我做到了,是
- 分离重要的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以便立即可用? –