webpack下实现动态引入文件方法
作者:_小刀 发布时间:2024-06-08 16:28:49
刚开始使用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数组以及解析过程写在一个文件的。也许是使用相对路径在不同文件中解析的问题,使用的时候需要注意下。
来源:http://blog.csdn.net/u014445339/article/details/72730155


猜你喜欢
- 这个项目到一开始的kickoff到现在,持续了很长的一段时间,现在差不多也接近了尾声,所以要好好做个总结,下面不会设计到太多技术层面上的东西
- 定位色块常用到hsv色彩空间下的颜色阈值,笔者曾经用openmv时,其IDE有自带一个阈值编辑器,使用起来非常方便,现在在linux上跑cv
- 前言我们可以给视图函数加装饰器来判断是用户是否登录,把没有登录的用户请求跳转到登录页面等等。我们通过给几个特定视图函数加装饰器实现了这个需求
- 更改mysql密码-- 查询用户权限show grants for 'root'@'%';update my
- 9月23,Django 发布了2.0a1版本,这是一个 feature freeze 版本,如果没有什么意外的话,2.0正式版不会再增加新的
- 每个浏览器都有自己的默认样式,这是一段预定义的CSS,用以简单地呈现网页。在Firefox中的地址栏中输入resource://gre/re
- TO_DATE格式(以时间:2007-11-02 13:45:25为例)1. 日期和字符转换函数用法(to_date,to_char)sel
- Python编写一个简易银行账户系统,供大家参考,具体内容如下文章中主要涉及的方法是Python中的open(filename, ‘r
- 本文实例为大家分享了python实现文件夹远程传输的具体代码,供大家参考,具体内容如下实现功能:通过tcp协议模拟文件夹的下载,注意是文件夹
- 一、实验内容编写一Python程序,要求实现以下功能:读入一幅图像。使用两种以上的方法分别向图像中添加噪声。输出一幅二值图像,图像中未加入噪
- 我目标文件夹下有一大批图片,我要把它转变为指定尺寸大小的图片,用pthon和opencv实现的。以上为原图片。import cv2impor
- 一,什么是JSON文件JSON和XML都是互联网上数据交换的主要载体。在JSON出现之前,大家一直用XML来传递数据。因为XML是一种纯文本
- ScrapyScrapy是一个比较好用的Python爬虫框架,你只需要编写几个组件就可以实现网页数据的爬取。但是当我们要爬取的页面非常多的时
- pyquery的使用一、pyquery的介绍使用pyquery需要在Web和了解jQuery的基础上,使用该CSS选择器。二、pyquery
- sys模块 与 os包一样,也是对系统资源进行调用。功能同样也是非常丰富,接下来我们会对 sys模块的一些简单且常用的函数进行介绍,主要针对
- 序言:php错误就是会使脚本运行不正常的情况。php的错误有很多种,包括warning、notice、deprecated、fetal er
- Sun公司和Zmanda在3月18号声称他们正在一起合作,为MySQL Enterprise用户交付一种全面、全局数据备份与恢复解决方案。现
- 什么是浮动?浮动是 css 的定位属性。我们可以看一下印刷设计来了解它的起源和作用。印刷布局中,文本可以按照需要围绕图片。一般把这种方式称为
- 一、JDBC概述JDBC全称Java Database Connectivity,它是一个独立于特定数据库管理系统、通用的SQL数据库存取和
- 介绍本期案例是带着大家制作一个属于自己的GUI图形化界面—>用于设计签名的哦(效果如下图),是不是感觉很好玩,是不