详解webpack import()动态加载模块踩坑


Posted in Javascript onJuly 17, 2018

import

webpack根据ES2015 loader 规范实现了用于动态加载的import()方法。

这个功能可以实现按需加载我们的代码,并且使用了promise式的回调,获取加载的包。

在代码中所有被import()的模块,都将打成一个单独的包,放在chunk存储的目录下。在浏览器运行到这一行代码时,就会自动请求这个资源,实现异步加载。

这里是一个简单的demo。

import('lodash').then(_ => {
  // Do something with lodash (a.k.a '_')...
 })

可以看到,import()的语法十分简单。该函数只接受一个参数,就是引用包的地址,这个地址与es6的import以及CommonJS的require语法用到的地址完全一致。可以实现无缝切换【写个正则替换美滋滋】。

并且使用了Promise的封装,开发起来感觉十分自在。【包装一个async函数就更爽了】

然而,以上只是表象。

只是表象。

我在开发的时候就遇到了问题。场景是这样的:一个对象,存储的是各级的路由信息,及其对应的页面组件。为减少主包大小,我们希望动态加载这些页面。

同时使用了react-loadable来简化组件的懒加载封装。代码如下所示。

function lazyLoad(path) {
 return Loadable({
  loader: () => import(path),
  loading: Spin,
 });
}

然后我就开始开心的在代码中写上lazyLoad('./pages/xxx')。果不其然,挂了。浏览器表示,没有鱼丸没有粗面,也不知道这个傻逼模块在哪里。

于是我查看了官方文档,发现有一个黄条提示。

详解webpack import()动态加载模块踩坑

emmm,看来问题出在这里了。

这个现象其实是与webpack import()的实现高度相关的。由于webpack需要将所有import()的模块都进行单独打包,所以在工程打包阶段,webpack会进行依赖收集。

此时,webpack会找到所有import()的调用,将传入的参数处理成一个正则,如:

import('./app'+path+'/util') => /^\.\/app.*\/util$/

也就是说,import参数中的所有变量,都会被替换为【.*】,而webpack就根据这个正则,查找所有符合条件的包,将其作为package进行打包。

详解webpack import()动态加载模块踩坑

因此,如果我们直接传入一个变量,webpack就会把 (整个电脑的包都打包进来[不闹]) 认为你在逗他,并且抛出一个WARNING: Critical dependency: the request of a dependency is an expression。

所以import的正确姿势,应该是尽可能静态化表达包所处的路径,最小化变量控制的区域

如我们要引用一堆页面组件,可以使用import('./pages/'+ComponentName),这样就可以实现引用的封装,同时也避免打包多余的内容。

另外一个影响功能封装的点,是import()中的相对路径,是import语句所在文件的相对路径,所以进一步封装import时会出现一些麻烦。

因为import语句中的路径会在编译后被处理成webpack命令执行目录的相对路径.

友情链接:https://webpack.js.org/api/module-methods/#import

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
动态载入/删除/更新外部 JavaScript/Css 文件的代码
Jul 03 Javascript
jquery 面包屑导航 具体实现
Jun 05 Javascript
使用javascript做的一个随机点名程序
Feb 13 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
Jun 07 Javascript
JavaScript函数模式详解
Nov 07 Javascript
基于javascript实现判断移动终端浏览器版本信息
Dec 09 Javascript
Javascript类型系统之String字符串类型详解
Jun 21 Javascript
完美解决jQuery符号$与其他javascript 库、框架冲突的问题
Aug 09 Javascript
javascript中的 object 和 function小结
Aug 14 Javascript
JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】
Feb 21 Javascript
vue实现图片懒加载的方法分析
Feb 05 Javascript
JS指定音频audio在某个时间点进行播放
Nov 28 Javascript
vue-router中的hash和history两种模式的区别
Jul 17 #Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
Jul 17 #Javascript
SVG实现时钟效果
Jul 17 #Javascript
JS中实现隐藏部分姓名或者电话号码的代码
Jul 17 #Javascript
基于D3.js实现时钟效果
Jul 17 #Javascript
vue生成token并保存到本地存储中
Jul 17 #Javascript
vue脚手架搭建项目的兼容性配置详解
Jul 17 #Javascript
You might like
基于PHP CURL用法的深入分析
2013/06/09 PHP
PHP static局部静态变量和全局静态变量总结
2014/03/02 PHP
PHP防止表单重复提交的几种常用方法汇总
2014/08/19 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
PHP实现微信提现功能
2018/09/30 PHP
js类 from qq
2006/11/13 Javascript
google 搜索框添加关键字实现代码
2010/04/24 Javascript
浅谈javascript的数据类型检测
2010/07/10 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
2014/03/03 Javascript
JavaScript实现的购物车效果可以运用在好多地方
2014/05/09 Javascript
DOM基础教程之使用DOM控制表单
2015/01/20 Javascript
jQuery结合AJAX之在页面滚动时从服务器加载数据
2015/06/30 Javascript
深入理解jQuery layui分页控件的使用
2016/08/17 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
JS 组件系列之 bootstrap treegrid 组件封装过程
2017/04/28 Javascript
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
2018/09/04 Javascript
VUE v-for循环中每个item节点动态绑定不同函数的实例
2018/09/26 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
使用form-create动态生成vue自定义组件和嵌套表单组件
2019/01/18 Javascript
多个Vue项目部署到服务器的步骤记录
2020/10/22 Javascript
分享给Python新手们的几道简单练习题
2017/09/21 Python
PyCharm鼠标右键不显示Run unittest的解决方法
2018/11/30 Python
python 获得任意路径下的文件及其根目录的方法
2019/02/16 Python
深入浅析python变量加逗号,的含义
2020/02/22 Python
鲜为人知的HTML5语音合成功能
2019/05/17 HTML / CSS
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
鼓励运动员的广播稿
2014/02/08 职场文书
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
2015年外联部工作总结
2015/04/03 职场文书
出生证明范本
2015/06/15 职场文书
红楼梦读书笔记
2015/06/25 职场文书
同乡会致辞
2015/07/30 职场文书
班主任经验交流心得体会
2015/11/02 职场文书
python 爬取京东指定商品评论并进行情感分析
2021/05/27 Python
详解JSON.parse和JSON.stringify用法
2022/02/18 Javascript
spring IOC容器的Bean管理XML自动装配过程
2022/05/30 Java/Android