第八篇[《教你搞懂webpack如果实现代码分片(code splitting)》] (https://blog.csdn.net/lfcss/article/details/104099412) 主要分享了webpack实现代码分片 的几种方式:合理地规划入口,使用Commons-ChunkPlugin或SplitChunks配置。这几种方法实现了资源按需加载。今天我分享另外一种实现方法–资源异步加载。

资源异步加载主要解决的问题是,当模块数量过多、资源体积过大时,可以把一些暂时使用不到的模块延迟加载。这样使页面初次渲染的时候用户下载的资源尽可能小,后续的模块等到恰当的时机再去触发加载。

webpack资源异步加载的方法

在webpack中主要提供两种方法:import函数和require.ensure。在webpack4之前,webpack 在编译时,会静态地解析代码中的 require.ensure(),同时将模块添加到一个分开的 chunk 当中。这个新的 chunk 会被 webpack 通过 jsonp 来按需加载。今天主要webpack4以后的import加载。

Webpack中的import

与正常ES6中的import语法不同,通过import函数加载的模块及其依赖会被异步地进行加载,并返回一个Promise对象。
一般正常的模块加载代码如下:

// index.js
import { add } from  './index2.js';
console.log(add(2,3));// index2.js
export function add(a, b) {return a + b
}

打包的效果及运行效果:


假设index2.js的资源体积很大,并且我们在页面初次渲染的时候并不需要使用它,就可以对它进行异步加载。
index.js和index2.js代码如下:

// index.js
import('./index2.js').then(({add}) => {console.log(add(2,3))
})// index2.js
export function add(a, b) {return a + b
}

webpack.config.js配置代码如下:

const path = require('path')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = {context: path.join(__dirname, './src'),entry: {index: './index.js'},output: {//path: path.join(__dirname, 'dist'),filename: '[name].js',publicPath: '/dist/'},mode: 'development',module: {rules: [{test: /\.css$/i,use: ['style-loader', {loader: 'css-loader',options: {modules: {localIdentName: '[path][name]__[local]--[hash:base64:5]',}}}]},{test: /\.js$/,exclude: /(node_modules|bower_components)/,use: {loader: 'babel-loader',options: {cacheDirectory: true,presets: [['env', {modules: false}]]}}}],}
}

打包的效果及运行效果:


首屏加载的JS资源地址是通过页面中的script标签来指定的,而间接资源(通过首屏JS再进一步加载的JS)的位置则要通过output.publicPath来指定。上面我们的import函数相当于使index2.js成为了一个间接资源,我们需要配置publicPath来告诉Webpack去哪里获取它。

由上图可以看出,Chrome的nextwork面板看到一个0.js的请求,它就是index2及其依赖产生的资源。观察面板中的Initinator字段,可以看出它是有index.js产生的请求。查看index.js可以看出,是由这段代码动态的在head头部添加script标签引入的方式,引入0.js,查看源代码并不能找到这段引入的代码,所以是js动态添加进去的。

在element 面板能查到script标签动态插入的0.js代码。

注意:import函数还有一个比较重要的特性。ES6 Module中要求import必须出现在代码的顶层作用域,而Webpack的import函数则可以在任何我们希望的时候调用

异步chunk的配置

由上面的方法我们已经实现了异步资源,但是此产生的资源名称都是数字如0.js,比较随机,不具有可读可维护性。此时就需要我们去配置Webpack的一些参数来为其添加有意义的名字,便于我们维护它们。

我们在Webpack的配置中添加了output.chunkFilename,用来指定异步chunk的文件名。其命名规则与output.filename基本一致,不过由于异步chunk默认没有名字,其默认值是[id].js。
配置代码为:

const path = require('path')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = {context: path.join(__dirname, './src'),entry: {index: './index.js'},output: {//path: path.join(__dirname, 'dist'),filename: '[name].js',publicPath: '/dist/',chunkFilename:'[name].js'},mode: 'development',// optimization: {//   splitChunks: {//     chunks: 'all'//   }// },module: {rules: [{test: /\.css$/i,use: ['style-loader', {loader: 'css-loader',options: {modules: {localIdentName: '[path][name]__[local]--[hash:base64:5]',}}}]},{test: /\.js$/,exclude: /(node_modules|bower_components)/,use: {loader: 'babel-loader',options: {cacheDirectory: true,presets: [['env', {modules: false}]]}}}],}
}

index.js修改为:

import(/* webpackChunkName:'index2'*/'./index2.js').then(({add}) => {console.log(add(2,3))
})


在index.js中,我们通过特有的注释来让Webpack获取到异步chunk的名字,并配置output.chunkFilename为[name].js,由上图可以看出,0变成了index2.js

chrome network上的element面板效果如下图:

总结

资源异步加载方法import()和require.ensure(),也可以有效地缩小资源体积,同时更好地利用缓存,给用户更友好的体验。如果想了解更多,请扫描二维码:

Webpack实战(九):实现资源按需加载-资源异步加载相关推荐

  1. 关于同步加载与异步加载的区别

    关于同步加载与异步加载的区别 同步加载:同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止了后续的解析,因此停止了后续的文件加载(如图像).渲染.代码执行. 异步加载:异步加载又叫非阻塞,浏览器在下 ...

  2. 浏览器渲染阻塞与优化-详解推迟加载、异步加载。

    我认为一个前端工程师是否优秀,很大程度上取决于对前端性能上优化的功力.所以性能优化对前端真的很重要!!! 本文介绍了什么是阻塞.为什么会阻塞?阻塞优化常用的5种方式以及他们的注意事项. 浏览器渲染阻塞 ...

  3. javascript 文件的同步加载与异步加载

    原文:[转载]javascript 文件的同步加载与异步加载 HTML 4.01 的script属性 charset: 可选.指定src引入代码的字符集,大多数浏览器忽略该值. defer: bool ...

  4. 同步加载与异步加载的区别

      同步加载: 同步模式,又称阻塞模式,就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去:   即同步加载会阻止浏览器 ...

  5. Jquery前端分页插件pagination同步加载和异步加载

    上一篇文章介绍了Jquery前端分页插件pagination的基本使用方法和使用案例,大致原理就是一次性加载所有的数据再分页.https://www.jianshu.com/p/a1b8b1db025 ...

  6. 同步加载、异步加载、延迟加载

    一.同步加载 平常默认用的都是同步加载.如:<script src="http://yourdomain.com/script.js"></script>  ...

  7. css 同步加载,同步加载,异步加载,懒加载,预加载

    同步加载 默认的就是同步加载 同步加载: 同步模式又称阻塞模式,会阻止浏览器的后续处理,停止了后续的文件的解析,执行,如图像的渲染.流览器之所以会采用同步模式,是因为加载的js文件中有对dom的操作, ...

  8. element tree ui 全选_element UI tree 控件,点击父节点进行异步加载,异步加载的数据不能全选...

    异步加载不能有多级数据,异步的只能一级级加载 贴上我的代码 html :load="loadNode" node-key='id' lazy ref="tree" ...

  9. 百度地图测加载的两种 方式 直接加载和异步加载

    1.直接加载 <html> <head><meta http-equiv="Content-Type" content="text/html ...

  10. android 异步图片加载 开源,异步加载图片BitmapFun分析

    博客地址:http://my.oschina.net/lifj/blog/313866 -------- 2014年8月19日BY拉风的道长 开源项目地址 项目简介 如果图片资源是静态的,当我们要在V ...

最新文章

  1. iOS基础问答面试题连载-附答案
  2. 全国计算机等级考试题库二级C操作题100套(第67套)
  3. because it is not a variable 编译错误解决方案
  4. POJ 3696 欧拉函数+快速幂
  5. linux切换目录使用命令,linux命令切换目录的使用方法
  6. 计算机视觉中的人类感知、理解和生成 (ICCV 2019 Workshop)
  7. 172篇文献:NUS颜水成等发布首篇《深度长尾学习》综述
  8. 【2022最新Java面试宝典】—— Nginx面试题(23道含答案)
  9. 2021互联网大厂中秋礼盒大盘点
  10. F5安全专栏 | 什么是零信任架构(ZTA)?
  11. 令人激动的语音UI背后
  12. C语言——判断两个数组中是否有相同的元素
  13. 对于学习率与梯度下降的通俗总结:
  14. cv.threshold()浅谈
  15. 【web系列十五】Ubuntu系统部署Web项目
  16. UBuntu安装OMNET++ 安装教程-可行版
  17. 大众汽车如何在智能电动汽车时代做好汽车安全?
  18. awesome图标库
  19. WIN10无法创建或加入家庭组的解决办法
  20. 揭秘360背后不为人知的产品文化

热门文章

  1. 将之前写完的猜数字游戏改为通过javabean_42个宝宝益智游戏良心整理!让宝宝快人一步更聪明...
  2. VDO-SLAM论文阅读
  3. 相机模型和双目立体匹配
  4. 板式橡胶支座弹性模量怎样计算_Midas Civil支座模拟的详细解决方法
  5. c#重命名文件 递归_文件结构、文件操作及压缩解压操作
  6. Java基础---封装继承静态
  7. loj#2340. 「WC2018」州区划分
  8. SSM框架中的前后端分离
  9. Spring+Quartz实现定时任务的配置步骤
  10. [改善Java代码]三元操作符的类型务必一致