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 相关文章推荐
JQuery 学习笔记 element属性控制
Jul 23 Javascript
jQuery插件的写法分享
Jun 12 Javascript
jQuery之尺寸调整组件的深入解析
Jun 19 Javascript
JavaScript实现SHA-1加密算法的方法
Mar 11 Javascript
总结Javascript中数组各种去重的方法
Oct 04 Javascript
JavaScript实现汉字转换为拼音的库文件示例
Dec 22 Javascript
javascript history对象详解
Feb 09 Javascript
Vue-Router实现页面正在加载特效方法示例
Feb 12 Javascript
js中怎么判断两个字符串相等的实例
Jan 17 Javascript
javaScript中indexOf用法技巧
Nov 26 Javascript
微信小程序登陆注册功能的实现代码
Dec 10 Javascript
JS实现页面鼠标点击出现图片特效
Aug 19 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学习笔记 面向对象中[接口]与[多态性]的应用
2011/06/16 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
PHP递归统计系统中代码行数
2019/09/19 PHP
用JavaScript编写COM组件的步骤
2009/03/17 Javascript
不用锚点也可以平滑滚动到页面的指定位置实现代码
2013/05/08 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
2014/06/16 Javascript
深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解
2015/03/05 Javascript
jQuery实现当前页面标签高亮显示的方法
2015/03/10 Javascript
js+cookies实现悬浮购物车的方法
2015/05/25 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
2016/04/15 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
JavaScript运动框架 链式运动到完美运动(五)
2017/05/18 Javascript
vue2.0学习之axios的封装与vuex介绍
2018/05/28 Javascript
小程序实现列表删除功能
2018/10/30 Javascript
详解一个基于套接字实现长连接的express
2019/03/28 Javascript
JS实现骰子3D旋转效果
2019/10/24 Javascript
详解Vue Cli浏览器兼容性实践
2020/06/08 Javascript
Vue作用域插槽实现方法及作用详解
2020/07/08 Javascript
Vue组件简易模拟实现购物车
2020/12/21 Vue.js
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
[22:07]DOTA2-DPC中国联赛 正赛 iG vs Magma 选手采访
2021/03/11 DOTA
python 删除指定时间间隔之前的文件实例
2018/04/24 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
python三引号输出方法
2019/02/27 Python
Django使用中间件解决前后端同源策略问题
2019/09/02 Python
使用python获取邮箱邮件的设置方法
2019/09/20 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
keras实现调用自己训练的模型,并去掉全连接层
2020/06/09 Python
Python如何在windows环境安装pip及rarfile
2020/06/15 Python
如何Tkinter模块编写Python图形界面
2020/10/14 Python
html2canvas生成清晰的图片实现打印的示例代码
2019/09/30 HTML / CSS
法国包包和行李箱销售网站:Bagage24.fr
2020/03/24 全球购物
毕业生自我鉴定范文
2013/11/08 职场文书
渡河少年教学反思
2014/02/12 职场文书
跑出一片天观后感
2015/06/08 职场文书
网络研修心得体会
2016/01/08 职场文书