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

 更新时间:2018年02月22日 10:09:02   作者:_小刀  
下面小编就为大家分享一篇webpack下实现动态引入文件方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

刚开始使用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下实现动态引入文件方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Bootstrap 中data-[*] 属性的整理

    Bootstrap 中data-[*] 属性的整理

    本文给大家收藏整理了关于Bootstrap 中data-[*] 属性的相关知识,感兴趣的朋友一起看看吧
    2018-03-03
  • JavaScript异步队列进行try catch时的问题解决

    JavaScript异步队列进行try catch时的问题解决

    这篇文章主要介绍了JavaScript异步队列进行try catch时的问题解决,文章围绕主题展开详细的的相关内容介绍,需要的朋友可以参考一下
    2022-07-07
  • webpack该如何打包(打包流程)

    webpack该如何打包(打包流程)

    这篇文章主要介绍了webpack该如何打包及打包流程,本文通过图文示例相结合给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2023-12-12
  • JavaScript实现动态添加,删除行的方法实例详解

    JavaScript实现动态添加,删除行的方法实例详解

    这篇文章主要介绍了JavaScript实现动态添加,删除行的方法,较为详细的分析了javascript操作table表格实现针对表格元素动态操作的相关技巧,需要的朋友可以参考下
    2015-07-07
  • 微信小程序实现判断是分享到群还是个人功能示例

    微信小程序实现判断是分享到群还是个人功能示例

    这篇文章主要介绍了微信小程序实现判断是分享到群还是个人功能,结合实例形式分析了微信小程序分享与判断功能的实现原理、步骤及相关操作技巧,需要的朋友可以参考下
    2019-05-05
  • layui数据表格重载实现往后台传参

    layui数据表格重载实现往后台传参

    今天小编就为大家分享一篇layui数据表格重载实现往后台传参,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Bootstrap中datetimepicker使用小结

    Bootstrap中datetimepicker使用小结

    这篇文章主要为大家详细介绍了Bootstrap中datetimepicker的使用方法,一款功能强大的日期选择控件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • JavaScript中的E-mail 地址格式验证

    JavaScript中的E-mail 地址格式验证

    本文给大家分享JavaScript中的E-mail 地址格式验证,项目要求输入的数据必须包含@符号和点号。代码简单易懂,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2018-03-03
  • 20行代码实现的一个CSS覆盖率测试脚本

    20行代码实现的一个CSS覆盖率测试脚本

    这里我们只求CSS规则的覆盖率,所以访问 querySelectorAll().length 即可。通过排序就可看出各个CSS使用情况
    2013-07-07
  • 一起盘点JavaScript中一些强大的运算符

    一起盘点JavaScript中一些强大的运算符

    javascript中的运算符大多由标点符号表示,少数由关键字表示,它们的语法言简意赅,它们的数量却着实不少,下面这篇文章主要给大家介绍了关于JavaScript中一些强大的运算符的相关资料,需要的朋友可以参考下
    2021-11-11

最新评论