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 相关文章推荐
google地图的路线实现代码
Aug 20 Javascript
js 调用父窗口的具体实现代码
Jul 15 Javascript
使用Jquery实现点击文字后变成文本框且可修改
Sep 21 Javascript
使用typeof方法判断undefined类型
Sep 09 Javascript
freemarker判断对象是否为空的方法
Aug 13 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
Jan 26 Javascript
jQuery遍历json的方法(推荐)
Jun 12 Javascript
vue 解决addRoutes动态添加路由后刷新失效问题
Jul 02 Javascript
JavaScript实现新年倒计时效果
Nov 17 Javascript
关于微信公众号开发无法支付的问题解决
Dec 28 Javascript
nodemon实现Typescript项目热更新的示例代码
Nov 19 Javascript
vue 重塑数组之修改数组指定index的值操作
Aug 09 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
zend framework配置操作数据库实例分析
2012/12/06 PHP
PHP 登录记住密码实现思路
2013/05/07 PHP
详解php的socket通信
2015/08/11 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
2017/04/25 PHP
php实现银联商务公众号+服务窗支付的示例代码
2019/10/12 PHP
PHP 图片合成、仿微信群头像的方法示例
2019/10/25 PHP
javascript中的void运算符语法及使用介绍
2013/03/10 Javascript
JavaScript实现表格排序方法
2013/06/14 Javascript
jquery实现table鼠标经过变色代码
2013/09/25 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
2016/05/05 Javascript
深入浅出ES6之let和const命令
2016/08/25 Javascript
AngularJS 与Bootstrap实现表格分页实例代码
2016/10/14 Javascript
jQuery模拟实现的select点击选择效果【附demo源码下载】
2016/11/09 Javascript
Bootstrap select下拉联动(jQuery cxselect)
2017/01/04 Javascript
在Angular中使用JWT认证方法示例
2018/09/10 Javascript
微信小程序实现跑马灯效果
2020/10/21 Javascript
使用javascript做时间倒数读秒功能的实例
2019/01/23 Javascript
在Web关闭页面时发送Ajax请求的实现方法
2019/03/07 Javascript
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
Python实现的彩票机选器实例
2015/06/17 Python
Python设计模式之模板方法模式实例详解
2019/01/17 Python
解决python文件双击运行秒退的问题
2019/06/24 Python
Django 实现admin后台显示图片缩略图的例子
2019/07/28 Python
Python+OpenCV实现实时眼动追踪的示例代码
2019/11/11 Python
Python模块_PyLibTiff读取tif文件的实例
2020/01/13 Python
matplotlib jupyter notebook 图像可视化 plt show操作
2020/04/24 Python
python os模块在系统管理中的应用
2020/06/22 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
2020/06/29 Python
怎么解决pycharm license Acti的方法
2020/10/28 Python
英国领先的葡萄酒专家:Majestic Wine
2017/05/30 全球购物
泰国第一在线超市:Tops
2021/02/13 全球购物
编程用JAVA解析XML的方式
2013/07/07 面试题
大学奖学金获奖感言
2014/08/15 职场文书
群众路线班子对照检查材料
2014/09/25 职场文书
python基础之类方法和静态方法
2021/10/24 Python
「睡美人」爱洛公主粘土人开订
2022/03/22 日漫