当页面中一个文件过大并且还不一定用到的时候,我们希望在使用到的时候才开始加载这个文件俗称按需加载。这样可以减少页面的响应时间,提高访问速度。

使用webpack打包的出来的文件要实现以上的要求有两种方式,一个是webpack特有的require.ensure方法,还有一个是import方法。

require.ensure(dep: array, cb: function, name?: string)

第一个参数是该模块的依赖,第二个参数是模块加载完成后执行的回调,第三个参数是对应webpack.config.js中output.chunkFilename: ‘[name].js’ 中的name。

index.html文件

<button id='btn'>点击我
</button>

index.js文件

document.querySelector('#btn').onclick = function () {require.ensure([], function () {let a = require('./asynca.js')console.log('asynca模块加载完毕:'a)}, 'asynca')
}

asynca.js文件

console.log('我是async模块')
export const a = '模块async'

webpack.config.js文件

let path = require('path')
let HtmlWebpackPlugin = require('html-webpack-plugin')module.exports = {entry: './src/index.js',output: {path: path.resolve('./dist'),filename: '[name].[chunkHash].js',chunkFilename: '[name].[chunkHash].js'},plugins: [new HtmlWebpackPlugin({template: './src/index.html',filename: 'index.html'})]
}

打包结果如下:

预览index.html,查看资源请求和输出情况:

打开dist中打包后的文件发现,只有一个index.html文件和man…js文件被加载了,并且require.ensure的回调并没有被执行过的迹象:

点击按钮后资源请求和输出情况:


asynca文件被动态加载进来,并且require.ensure的回调函数被执行了。

小结

通过以上的观察我们通过require.ensure实现了我们动态加载模块的目的。

import()

该方法返回一个promise,文件加载完成之后会将模块导出给promise的回调。

index.import.js

document.querySelector('#btn').onclick = function () {console.log('我是通过import来实现按需加载的')let a = import('./asynca.js')a.then(function (res) {console.log('加载完成的async模块', res)})
}

注:其他文件和ensure方法的一致。

打包结果如下:

预览index.html,查看资源请求和输出情况:

点击按钮后资源请求和输出情况:

小结

观察发现import方法同样可以实现按需加载的需求,但是生成的文件名是按数字来命名的,并不能像ensure的第三个参数来指定,我想应该是有方法实现的

参考

https://segmentfault.com/q/1010000014699780/a-1020000015102124

webpack中实现按需加载相关推荐

  1. vue中路由按需加载的几种方式

    使用vue-cli构建项目后,我们会在Router文件夹下面的index.js里面引入相关的路由组件,如: import Hello from '@/components/Hello' import ...

  2. .NET中的按需加载/延迟加载 LazyT

    业务场景: 在项目开发中,经常会遇到特定的对象使用的加载问题,有的实例对象我们创建之后并非需要使用,只是根据业务场景来调用,所以可能会导致很多无效的实例加载 延迟初始化出现于.NET 4.0,主要用于 ...

  3. AngularJS中的按需加载ocLazyLoad

    欢迎大家讨论与指导 : ) 初学者,有不足的地方希望各位指出 一.前言 ocLoayLoad是AngularJS的模块按需加载器.一般在小型项目里,首次加载页面就下载好所有的资源没有什么大问题.但是当 ...

  4. vue单文件props写法_vue开发中怎么按需加载需要被填入props和自定义事件的组件?...

    这种场景你可能需要把模态框包装成插件.vue插件开发和组件的区别 - 水秋玄​im.mkinit.com vue插件和组件的区别 使用插件的方式包装组件和直接注册全局组件其实是一样的,都是注册组件.不 ...

  5. devtools 无法加载 sourcemap_用 babel-plugin 实现按需加载

    注意:本文并不是Babel的初学者教程,您需要具备一定的基础知识.在阅读本文前应具备babel基础知识,或者阅读用户手册 本文主要介绍babel的工作流程,插件的工作原理,以及一些在实战中实现按需加载 ...

  6. React-router 4 按需加载的实现方式及原理(Code Splitting)

    React-router 4 介绍了在router4以后,如何去实现按需加载Component,在router4以前,我们是使用getComponent的的方式来实现按需加载的,router4中,ge ...

  7. webpack中利用【require.ensure()】和【import()】实现按需加载

    1.require.ensure()themes为变量,设计多个文件名根据themes动态变化可以映入不同less文件如下require.ensure([], function (require) { ...

  8. webpack v3 结合 react-router v4 做 dynamic import — 按需加载(懒加载)

    为什么要做dynamic import? dynamic import不知道为什么有很多叫法,什么按需加载,懒加载,Code Splitting,代码分页等. 总之,就是在SPA,把JS代码分成N个页 ...

  9. EasyDSS高性能流媒体服务器前端重构(五)- webpack + vue-router 开发单页面前端实现按需加载 - 副本...

    为了让页面更快完成加载, 第一时间呈现给客户端, 也为了帮助客户端节省流量资源, 我们可以开启 vue-router 提供的按需加载功能, 让客户端打开页面时, 只自动加载必要的资源文件, 当客户端操 ...

最新文章

  1. C++100w个数中找出最大的前K个数
  2. c语言词法分析程序实验报告,实验一词法分析程序设计与实现
  3. C++双目/单目运算符的重载
  4. 《每日一题》62. Unique Paths 不同路径
  5. 通过标题区别自己的发帖
  6. 2021年全球知名开源项目大更新
  7. 暑期训练日志----2018.8.5
  8. VMware虚拟网络设置(NAT模式,桥接模式,仅主机模式设置),再也不用担心虚拟机连不上网了。
  9. matlab knn,matlab自带knn函数
  10. mac电脑开发环境配置
  11. ffmpeg支持的扩展库有哪些
  12. Ubiquant LGBM Baseline 九坤量化大赛 版本44
  13. 有道单词本修改背景颜色
  14. 教大家通过node爬取b站api数据
  15. 【2022年第十周周总结】拖延症啊。。。。算法题啊。。。。
  16. 一个脚本教你快速去除桌面图标烦人的小箭头
  17. 互联网券商新招式:富途证券备千万股票礼包 赠与注册用户
  18. 当图片被压缩时,图片变得模糊
  19. Sicily 1484. 守望者的逃离
  20. 2021年全球无水氢氟酸收入大约3120.8百万美元,预计2028年达到3634.6百万美元

热门文章

  1. Python 3实现k-邻近算法以及 iris 数据集分类应用
  2. 求立方根_「每日一学」数学七上:立方根的知识要点
  3. fastJson去掉指定字段
  4. golang linux安装
  5. java POI 写入百万数据到 excel
  6. 基于SharePoint 的企业信息平台架构
  7. 元素在父元素内垂直居中的思路
  8. UML 面向对象分析与设计
  9. eclipse 快捷键组合
  10. setjump和longjump