更新
您可以将preload-webpack-plugin与html-webpack-plugin一起使用,它将定义要在配置中预加载的内容,并会自动插入标签以预加载您的块
请注意,如果您现在使用的是webpack v4,则必须使用 preload-webpack-plugin@next
例
plugins: [
new HtmlWebpackPlugin(),
new PreloadWebpackPlugin({
rel: 'preload',
include: 'asyncChunks'
})
]
对于使用动态名称(例如chunk.31132ae6680e598f8879.js
和)
生成两个异步脚本的项目chunk.d15e7fdfc91b34bb78c4.js
,以下预加载将注入到文档中head
<link rel="preload" as="script" href="chunk.31132ae6680e598f8879.js">
<link rel="preload" as="script" href="chunk.d15e7fdfc91b34bb78c4.js">
更新2
如果您不想预加载所有异步块,而仅预加载一次,也可以
您可以使用migcoder的babel插件,也可以preload-webpack-plugin
像下面这样使用
首先,您将不得不借助webpack
magic comment
示例来命名该异步块
import(/* webpackChunkName: 'myAsyncPreloadChunk' */ './path/to/file')
然后在插件配置中使用该名称,例如
plugins: [
new HtmlWebpackPlugin(),
new PreloadWebpackPlugin({
rel: 'preload',
include: ['myAsyncPreloadChunk']
})
]
首先,让我们看看指定script
标签或link
标签来加载脚本时浏览器的行为
- 每当浏览器遇到
script
标签时,它将加载该标签以解析并立即执行
- 你只能延缓解析,并帮助评估
async
和
defer
标签只有等到DOMContentLoaded
事件
- 如果您不插入脚本标签(只能将其预加载),则可以延迟执行(评估
link
)
现在还有其他一些不建议使用的 hackey方法是您发送整个脚本和string
/ comment
(或(因为注释或字符串的评估时间几乎可以忽略)),并且在需要执行时可以使用Function() constructor
或eval
不建议同时使用
另一个方法 服务工作者:(这将在页面重新加载后保留您的缓存事件,或者在加载缓存后用户脱机)
在现代浏览器中,您可以service worker
用来获取和缓存资源(JavaScript,图像,css any),当对该资源的主线程请求时,您可以拦截该请求并以这种方式从缓存中返回资源,而无需在以下情况下解析和评估脚本:您正在将其加载到缓存中,在此处了解有关服务人员的更多信息
例
self.addEventListener('install', function(event) {
event.waitUntil(
caches.open('v1').then(function(cache) {
return cache.addAll([
'/sw-test/',
'/sw-test/index.html',
'/sw-test/style.css',
'/sw-test/app.js',
'/sw-test/image-list.js',
'/sw-test/star-wars-logo.jpg',
'/sw-test/gallery/bountyHunters.jpg',
'/sw-test/gallery/myLittleVader.jpg',
'/sw-test/gallery/snowTroopers.jpg'
]);
})
);
});
self.addEventListener('fetch', function(event) {
event.respondWith(caches.match(event.request).then(function(response) {
// caches.match() always resolves
// but in case of success response will have value
if (response !== undefined) {
return response;
} else {
return fetch(event.request).then(function (response) {
// response may be used only once
// we need to save clone to put one copy in cache
// and serve second one
let responseClone = response.clone();
caches.open('v1').then(function (cache) {
cache.put(event.request, responseClone);
});
return response;
}).catch(function () {
// any fallback code here
});
}
}));
});
如您所见,这与webpack无关,这不在webpack的范围之内,但是在webpack的帮助下,您可以拆分软件包,这将有助于更好地利用Service Worker
if (false) import(…)
-我怀疑webpack会进行死代码分析吗?