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制作迷你背词汇工具
Jul 27 Javascript
JQuery一种取同级值的方式(比如你在GridView中)
Mar 15 Javascript
js函数调用常用方法详解
Dec 03 Javascript
jquery.post用法关于type设置问题补充
Jan 03 Javascript
js使用DOM操作实现简单留言板的方法
Apr 10 Javascript
解析js如何获取css样式
Dec 11 Javascript
bootstrap是什么_动力节点Java学院整理
Jul 14 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
Jan 03 Javascript
详解JavaScript 中 if / if...else...替换方式
Jul 15 Javascript
微信小程序CSS3动画下拉菜单效果
Nov 04 Javascript
JavaScript的Proxy可以做哪些有意思的事儿
Jun 15 Javascript
JavaScript实现单点登录的示例
Sep 23 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
了解咖啡雨林联盟认证 什么是雨林认证 雨林认证是什么意思
2021/03/05 新手入门
php替换超长文本中的特殊字符的函数代码
2012/05/22 PHP
php自动加载机制的深入分析
2013/06/08 PHP
linux中cd命令使用详解
2015/01/08 PHP
PHP的AES加密算法完整实例
2016/07/20 PHP
PHP实现多级分类生成树的方法示例
2017/02/07 PHP
ZendFramework2连接数据库操作实例
2017/04/18 PHP
laravel与thinkphp之间的区别与优缺点
2021/03/02 PHP
用JavaScript实现单继承和多继承的简单方法
2009/03/29 Javascript
获取HTML DOM节点元素的方法的总结
2009/08/21 Javascript
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
javascript操作excel生成报表全攻略
2014/05/04 Javascript
在HTML中插入JavaScript代码的示例
2015/06/03 Javascript
JavaScript中的toLocaleDateString()方法使用简介
2015/06/12 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
Angular发布1.5正式版,专注于向Angular 2的过渡
2016/02/18 Javascript
基于bootstrap实现收缩导航条
2017/03/17 Javascript
vue轮播图插件vue-concise-slider的使用
2018/03/13 Javascript
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
[01:35]辉夜杯战队访谈宣传片—iG.V
2015/12/25 DOTA
Python中的日期时间处理详解
2016/11/17 Python
python学生管理系统开发
2019/01/30 Python
python使用Plotly绘图工具绘制水平条形图
2020/03/25 Python
selenium处理元素定位点击无效问题
2019/06/12 Python
Python3基本输入与输出操作实例分析
2020/02/14 Python
python实现图像高斯金字塔的示例代码
2020/12/11 Python
Django使用django-simple-captcha做验证码的实现示例
2021/01/07 Python
CSS3 RGBA色彩模式使用实例讲解
2016/04/26 HTML / CSS
推荐10个HTML5响应式框架
2016/02/25 HTML / CSS
英国最大的电脑零售连锁店集团:PC World
2016/10/10 全球购物
享誉全球的多元化时尚精品购物平台:Farfetch发发奇(支持中文)
2017/08/08 全球购物
美国户外运动商店:Sun & Ski
2018/08/23 全球购物
新学期开学标语
2014/06/30 职场文书
2014年大学生社会实践自我鉴定
2014/09/26 职场文书
2015年办税服务厅工作总结
2015/07/23 职场文书
儿子满月酒致辞
2015/07/29 职场文书