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实现原理的模拟代码 -6 代码下载
Aug 16 Javascript
jquery easyui 结合jsp简单展现table数据示例
Apr 18 Javascript
JavaScript中读取和保存文件实例
May 08 Javascript
基于socket.io和node.js搭建即时通信系统
Jul 30 Javascript
JS使用eval解析JSON的注意事项分析
Nov 14 Javascript
基于Node.js的JavaScript项目构建工具gulp的使用教程
May 20 Javascript
js实现可键盘控制的简单抽奖程序
Jul 13 Javascript
JS实现搜索框文字可删除功能
Dec 28 Javascript
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
May 07 Javascript
浅谈Webpack下多环境配置的思路
Jun 27 Javascript
Vue.js组件通信之自定义事件详解
Oct 19 Javascript
vue 实现setInterval 创建和销毁实例
Jul 21 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
DC漫画《蝙蝠侠和猫女》图透 猫女怀孕老爷当爹
2020/04/09 欧美动漫
发布一个用PHP fsockopen写的HTTP下载的类
2007/02/22 PHP
php 设计模式之 工厂模式
2008/12/19 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
2013/01/29 PHP
php mysql 封装类实例代码
2016/09/18 PHP
PHP的Json中文处理解决方案
2016/09/29 PHP
PHP内置函数生成随机数实例
2019/01/18 PHP
再谈javascript 动态添加样式规则 W3C校检
2009/12/25 Javascript
JS格式化数字保留两位小数点示例代码
2013/10/15 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
jQuery判断指定id的对象是否存在的方法
2015/05/22 Javascript
jQuery mobile转换url地址及获取url中目录部分的方法
2015/12/04 Javascript
bootstrap table 多选框分页保留示例代码
2017/03/08 Javascript
bootstrap table实现点击翻页功能 可记录上下页选中的行
2017/09/28 Javascript
JS文件中加载jquery.js的实例代码
2018/05/05 jQuery
浅谈PDF.js使用心得
2018/06/07 Javascript
vue和webpack安装命令详解
2018/06/15 Javascript
详解一个基于react+webpack的多页面应用配置
2019/01/21 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
python发送邮件示例(支持中文邮件标题)
2014/02/16 Python
Python中使用wxPython开发的一个简易笔记本程序实例
2015/02/08 Python
python如何派生内置不可变类型并修改实例化行为
2018/03/21 Python
python看某个模块的版本方法
2018/10/16 Python
在PyCharm下使用 ipython 交互式编程的方法
2019/01/17 Python
Python实现简单查找最长子串功能示例
2019/02/26 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
2019/07/03 Python
python中单下划线(_)和双下划线(__)的特殊用法
2019/08/29 Python
canvas之万花筒效果的简单实现(推荐)
2016/08/16 HTML / CSS
设计师大码女装:11 Honoré
2020/05/03 全球购物
国际经济贸易专业推荐信
2013/11/06 职场文书
学习2014年全国两会心得体会
2014/03/12 职场文书
欢迎标语大全
2014/06/21 职场文书
上课迟到检讨书
2015/05/06 职场文书
2015暑假假期总结
2015/07/13 职场文书
Nginx本地目录映射实现代码实例
2021/03/31 Servers
Redis模仿手机验证码发送的实现示例
2021/11/02 Redis