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 target与currentTarget区别说明
Aug 28 Javascript
js动态修改表格行colspan列跨度的方法
Mar 30 Javascript
关于js函数解释(包括内嵌,对象等)
Nov 20 Javascript
js常用的继承--组合式继承
Mar 06 Javascript
微信小程序 标签传入数据
May 08 Javascript
如何在AngularJs中调用第三方插件库
May 21 Javascript
微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法分析
Nov 27 Javascript
Vue仿今日头条实例详解
Feb 06 Javascript
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
Apr 13 Javascript
JavaScript事件发布/订阅模式原理与用法分析
Aug 21 Javascript
JS 遍历 json 和 JQuery 遍历json操作完整示例
Nov 11 jQuery
你不知道的 TypeScript 高级类型(小结)
Aug 28 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基于socket实现SMTP发送邮件的方法
2015/03/05 PHP
Zend Framework教程之Zend_Layout布局助手详解
2016/03/04 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
PHP判断数组是否为空的常用方法(五种方法)
2017/02/08 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
2019/06/25 PHP
ajax 文件上传应用简单实现
2009/03/03 Javascript
javascript获取当前ip的代码
2009/05/10 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
jQuery的css() 方法使用指南
2015/05/03 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
2015/05/16 Javascript
纯javascript实现图片延时加载方法
2015/08/21 Javascript
通过bootstrap全面学习less
2016/11/09 Javascript
node+express制作爬虫教程
2016/11/11 Javascript
vue实现购物车抛物线小球动画效果的方法详解
2019/02/13 Javascript
图解NodeJS实现登录注册功能
2019/09/16 NodeJs
javascript设计模式 ? 命令模式原理与用法实例分析
2020/04/20 Javascript
在Vue中使用Echarts实例图的方法实例
2020/10/10 Javascript
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
解决iView Table组件宽度只变大不变小的问题
2020/11/13 Javascript
python 多线程应用介绍
2012/12/19 Python
更改Python命令行交互提示符的方法
2015/01/14 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
浅析python中的迭代与迭代对象
2018/10/08 Python
python实现输出一个序列的所有子序列示例
2019/11/18 Python
Python3 把一个列表按指定数目分成多个列表的方式
2019/12/25 Python
python中安装django模块的方法
2020/03/12 Python
Django如何使用redis作为缓存
2020/05/21 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
2020/07/03 Python
HTML5不支持frameset的两种解决方法
2016/11/14 HTML / CSS
美丽的现代设计家具:2Modern
2018/07/26 全球购物
西班牙鞋子和箱包在线销售网站:zapatos.es
2020/02/17 全球购物
敬业奉献模范事迹材料
2014/12/24 职场文书
酒店开业主持词
2015/07/02 职场文书
关于战胜挫折的名言警句大全!
2019/07/05 职场文书
html中显示特殊符号(附带特殊字符对应表)
2021/06/21 HTML / CSS