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 AJAX 用于计算点击率(统计)
Jun 30 Javascript
JS+CSS 制作的超级简单的下拉菜单附图
Nov 22 Javascript
JavaScript中九种常用排序算法
Sep 02 Javascript
express的中间件basicAuth详解
Dec 04 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
Mar 30 Javascript
Bootstrap每天必学之滚动监听
Mar 16 Javascript
JQuery中Ajax的操作完整例子
Mar 07 Javascript
BootstrapTable加载按钮功能实例代码详解
Sep 22 Javascript
vue 监听屏幕高度的实例
Sep 05 Javascript
Angular6 用户自定义标签开发的实现方法
Jan 08 Javascript
使用Taro实现小程序商城的购物车功能模块的实例代码
Jun 05 Javascript
Vue使用轮询定时发送请求代码
Aug 10 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
第1次亲密接触PHP5(1)
2006/10/09 PHP
浅析php静态方法与非静态方法的用法区别
2016/05/17 PHP
PHP获取链表中倒数第K个节点的方法
2018/01/18 PHP
js jquery做的图片连续滚动代码
2008/01/06 Javascript
JavaScrip单线程引擎工作原理分析
2010/09/04 Javascript
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
2013/05/17 Javascript
当json键为数字时的取值方法解析
2013/11/15 Javascript
在浏览器中实现图片粘贴的jQuery插件-- pasteimg使用指南
2014/12/29 Javascript
jQuery鼠标悬浮链接弹出跟随图片实例代码
2016/01/08 Javascript
javascript实现表单验证
2016/01/29 Javascript
AngularJS入门教程之AngularJS模型
2016/04/18 Javascript
JS实现弹出居中的模式窗口示例
2016/06/20 Javascript
Vue.js创建Calendar日历效果
2016/11/03 Javascript
高效的jQuery代码编写技巧总结
2017/02/22 Javascript
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
vue项目打包后上传至GitHub并实现github-pages的预览
2019/05/06 Javascript
详细教你微信公众号正文页SVG交互开发技巧
2019/07/25 Javascript
Js实现复选框的全选、全不选反选功能代码实例
2020/02/28 Javascript
vue 实现基础组件的自动化全局注册
2020/12/25 Vue.js
django自定义Field实现一个字段存储以逗号分隔的字符串
2014/04/27 Python
解决Python中由于logging模块误用导致的内存泄露
2015/04/23 Python
CentOS中使用virtualenv搭建python3环境
2015/06/08 Python
python实现Adapter模式实例代码
2018/02/09 Python
Python实现合并两个列表的方法分析
2018/05/28 Python
python导包的几种方法(自定义包的生成以及导入详解)
2019/07/15 Python
详解pandas中MultiIndex和对象实际索引不一致问题
2019/07/23 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
2020/02/06 Python
使用Python实现牛顿法求极值
2020/02/10 Python
Python的in,is和id函数代码实例
2020/04/18 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
2020/10/30 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
2020/11/20 Python
CSS3中background-clip和background-origin的区别示例介绍
2014/03/10 HTML / CSS
Django项目如何获得SSL证书与配置HTTPS
2021/04/30 Python
总结三种用 Python 作为小程序后端的方式
2022/05/02 Python