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 相关文章推荐
Javascript学习笔记二 之 变量
Dec 15 Javascript
Javascript中的this绑定介绍
Sep 22 Javascript
一个基于jquery的文本框记数器
Sep 19 Javascript
javascript实现数字验证码的简单实例
Feb 10 Javascript
JQuery异步加载PartialView的方法
Jun 07 Javascript
AngularJS表单提交实例详解
Feb 18 Javascript
AngularJS实现根据不同条件显示不同控件
Apr 20 Javascript
Vue的百度地图插件尝试使用
Sep 06 Javascript
JavaScript累加、迭代、穷举、递归等常用算法实例小结
May 08 Javascript
vue+elementUI实现表单和图片上传及验证功能示例
May 14 Javascript
ES6函数和数组用法实例分析
May 23 Javascript
JavaScript大数相加相乘的实现方法实例
Oct 18 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全排列递归算法代码
2012/10/09 PHP
PHP数据库表操作的封装类及用法实例详解
2016/07/12 PHP
PHP三种方式实现链式操作详解
2017/01/21 PHP
jQuery之$(document).ready()使用介绍
2012/04/05 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战一)
2013/08/21 Javascript
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
javascript模拟枚举的简单实例
2014/03/06 Javascript
JavaScript获取图片的原始尺寸以宽度为例
2014/05/04 Javascript
jquery单行文字向上滚动效果的实现代码
2014/09/05 Javascript
jQuery Tags Input Plugin(添加/删除标签插件)详解
2016/06/20 Javascript
jQuery简单注册和禁用全局事件的方法
2016/07/25 Javascript
JavaScript prototype属性详解
2016/10/25 Javascript
JavaScript计算值然后把值嵌入到html中的实现方法
2016/10/29 Javascript
js中数组的常用方法小结
2016/12/30 Javascript
vue、react等单页面项目应该这样子部署到服务器
2018/01/03 Javascript
Vue源码解析之数据响应系统的使用
2019/04/24 Javascript
详解关于表格合并span-method方法的补充(表格数据由后台动态返回)
2019/05/21 Javascript
matplotlib作图添加表格实例代码
2018/01/23 Python
详解python 注释、变量、类型
2018/08/10 Python
python3中numpy函数tile的用法详解
2019/12/04 Python
Python socket处理client连接过程解析
2020/03/18 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
Python+OpenCV图像处理——图像二值化的实现
2020/10/24 Python
想学画画?python满足你!
2020/12/24 Python
css3简单练习实现遨游浏览器logo的绘制
2013/01/30 HTML / CSS
澳大利亚自然和有机的健康美容产品一站式商店:Ziani Beauty
2017/12/28 全球购物
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
MAC彩妆澳洲官网:M·A·C AU
2021/01/17 全球购物
文秘专业大学生求职信
2013/11/10 职场文书
建筑经济管理专业求职信分享
2014/01/06 职场文书
简历中的自我评价范文
2014/02/05 职场文书
小学生综合素质评语
2014/04/23 职场文书
团日活动总结怎么写
2014/06/25 职场文书
2014年加油站工作总结
2014/12/04 职场文书
python 通过使用Yolact训练数据集
2021/04/06 Python
Python爬虫实战之爬取携程评论
2021/06/02 Python