webpack下实现动态引入文件方法


Posted in Javascript onFebruary 22, 2018

刚开始使用webpack时,可能很多人都会有过这样的想法,在require文件时,能不能不写静态的字符串路径,而是使用一个更灵活的方式,比如定义一个变量,根据具体的运行情况来确定需要require哪个文件!

比如,笔者就遇到了一个这样的需求。

当时是使用vue-router开发一个管理系统,管理系统自身有一个目录数组,而vue-router也需要一个route配置数组,而这两者恰恰是对应关系的。当时就想,能不能只维护一个目录数组,然后动态的生成route数组呢?

于是我实现了一个小demo,如下:

// directory
let dir = [
 {
 name: 'a',
 path: '/a',
 componentPath: './a.vue'
 },
 { 
 ...
 }
];
let route = [];
for (let i = 0; i < dir.length; ++i) {
 let item = dir[i];
 route.push({
 path: item.path,
 component: r => require.ensure([], () => r(require(item.componentPath)), 'demo')
 });
}

大致如上,当时没留源码,大概手写个例子,忽略一些可能的语法错误。

当使用这段代码运行的时候,就开始报错了:Critical dependencies。

在查了一些资料后,我大致明白了webpack的运行机制,也明白了一个事实,那就是:使用webpack动态require文件是不可能实现的。

要知道,webpack是一个打包工具,它运行的时机属于预编译,而我们的想法呢,要在运行时才能确定到底要require哪些文件,这显然是不行的,因为这样,webpack不知道该把哪些包打包起来,结果就是那些文件都没有被打包进去,那么require也肯定require不到啊。

明白了这个机制,我们就应该确定直接传递path来动态注册route是一种不可能实现的方案。

那么如果又想实现动态引入文件,怎么办呢?我们可以考虑一些曲线救国的方案。

1. 预编译阶段确定require路径。

我们之所以使用动态的变量来存储路径字符串,无非是想要程序替我们执行一些动作,比如拼接字符串等等。那么很多情况下这些程序在运行时执行和在预编译时执行是一样效果的。比如我们上面的例子,就是不想手动去维护两张表。那么我们可以在打包的时候,执行读写文件,来动态执行解析操作,并将解析得到的route数组写入指定的文件。这样不就实现了目标吗?

2.直接传递component对象呢?比如下面的实现方式:

// directory
let dir = [
 {
 name: 'a',
 path: '/a',
 component: r => require.ensure([], () => r(require('./a.vue')), 'demo')
 
 },
 { 
 ...
 }
];
let route = [];
for (let i = 0; i < dir.length; ++i) {
 let item = dir[i];
 route.push({
 path: item.path,
 component: item.component
 });
}

这种方案主要针对我们的例子,当然对其他情况也能给一个启发作用。

不过说来说去,这都是委曲求全的方案,我们必须明白一点,那就是在预编译阶段,webpack必须明确知道该引入哪些文件,否则什么方案都是不可行的。

顺便一提,网上还有说法require(path),只要path不是纯变量,比如require('./root/' + path),这样组合一下就行?我在这里require.ensure函数中尝试过,不行。也许是我使用方式不对吧。

再一提,传递component对象时,好像在跨文件时会有点问题,反正我是将目录数组和route数组以及解析过程写在一个文件的。也许是使用相对路径在不同文件中解析的问题,使用的时候需要注意下。

以上这篇webpack下实现动态引入文件方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS的递增/递减运算符和带操作的赋值运算符的等价式
Dec 08 Javascript
神奇的代码 通杀各种网站-可随意修改复制页面内容
Jul 17 Javascript
超级有用的13个基于jQuery的内容滚动插件和教程
Jul 31 Javascript
jQuery+css+html实现页面遮罩弹出框
Mar 21 Javascript
超简单JS二级、多级联动的简单实例
Feb 18 Javascript
父页面显示遮罩层弹出半透明状态的dialog
Mar 04 Javascript
js的延迟执行问题分析
Jun 23 Javascript
一种基于浏览器的自动小票机打印实现方案(js版)
Jul 26 Javascript
js控住DOM实现发布微博效果
Aug 30 Javascript
node中Express 动态设置端口的方法
Aug 04 Javascript
基于vue-cli配置lib-flexible + rem实现移动端自适应
Dec 26 Javascript
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
Sep 16 Javascript
JavaScript 有用的代码片段和 trick
Feb 22 #Javascript
3种vue路由传参的基本模式
Feb 22 #Javascript
webpack打包并将文件加载到指定的位置方法
Feb 22 #Javascript
vue2.0 elementUI制作面包屑导航栏
Feb 22 #Javascript
webpack将js打包后的map文件详解
Feb 22 #Javascript
浅谈用Webpack路径压缩图片上传尺寸获取的问题
Feb 22 #Javascript
深入理解ES6中let和闭包
Feb 22 #Javascript
You might like
PHP完整的日历类(CLASS)
2006/11/27 PHP
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
phpstorm编辑器乱码问题解决
2014/12/01 PHP
smarty内置函数foreach用法实例
2015/01/22 PHP
php实现以只读方式打开文件的方法
2015/03/16 PHP
PHP获取当前日期和时间及格式化方法参数
2015/05/11 PHP
Yii Framework框架开发微信公众平台示例
2020/04/26 PHP
论坛特效代码收集(落伍转发-不错)
2006/12/02 Javascript
js获取select标签选中值的两种方式
2014/01/09 Javascript
js关于字符长度限制的问题示例探讨
2014/01/24 Javascript
JS实现设置ff与ie元素绝对位置的方法
2016/03/08 Javascript
web前端开发中常见的多列布局解决方案整理(一定要看)
2017/10/15 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
vue cli使用绝对路径引用图片问题的解决
2017/12/06 Javascript
vue轮播图插件vue-concise-slider的使用
2018/03/13 Javascript
Vuex入门到上手教程
2018/06/20 Javascript
js实现继承的方法及优缺点总结
2019/05/08 Javascript
Python多线程编程(五):死锁的形成
2015/04/05 Python
Python实用技巧之利用元组代替字典并为元组元素命名
2018/07/11 Python
Django 对象关系映射(ORM)源码详解
2019/08/06 Python
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
2019/09/16 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
2020/04/14 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
2020/05/22 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
2020/09/03 Python
Python实现列表索引批量删除的5种方法
2020/11/16 Python
Pycharm配置lua编译环境过程图解
2020/11/28 Python
python中remove函数的踩坑记录
2021/01/04 Python
网页切图的CSS和布局经验与要点
2015/04/09 HTML / CSS
ManoMano英国:欧洲第一家专注于DIY和园艺市场的电商平台
2020/03/12 全球购物
大学运动会通讯稿
2014/01/28 职场文书
安全生产责任书范本
2014/04/15 职场文书
团日活动总结书
2014/05/08 职场文书
2015年公司后勤管理工作总结
2015/05/13 职场文书
交通事故赔偿起诉书
2015/05/20 职场文书
使用Python的开发框架Brownie部署以太坊智能合约
2021/05/28 Python