[前端]动态加载问题-按条件加载

[前端]动态加载问题-按条件加载

场景描述

可以根据条件判断是否需要加载某些文件,例如当开发环境的时候我们需要加载 MOCK 文件或者不需要加载 MOCK 文件的情况,可以根据设置的 MOCK 的开关来决定是否需要加载

实践

在使用 webpack 时我们一般通过 require.context 实现动态的加载

export function importMocks() {
  try {
    //require.context("查找目录",是否查找子文件夹,符合规则的正则表达式) :
    //require.context 所有参数不能使用变量作为参数,只能直接使用表达式的字面值/(mock)_?([A-Z]\*)?\.ts$/或目录的字面值"../views"
    //require.context 不能在循环中使用
    const fileRequireContext: __WebpackModuleApi.RequireContext = require.context("../views", true, /(mock)*?([A-Z]_)?\.ts$/);
    fileRequireContext.keys().forEach((fileName) => {
      console.debug(fileName);
      // 获取内容
      fileRequireContext(fileName);
    });
  } catch (error) {
    console.debug(error);
  }
}

//根据flag决定是否加载mock文件
const mockData = async (flag) => {
  if (flag) {
    importMocks();
  }
};

以上是wepack方式

export function importMocks() {
  try {
    const fileRequireContext = import.meta.glob('../views/**/mock*.ts')
    Object.keys(fileRequireContext).forEach((fileFullName) => {
      fileRequireContext[fileFullName]();
      import(fileFullName);
    });
  } catch (error) {
    console.debug(error);
  }
}

//根据flag决定是否加载mock文件
const mockData = async (flag) => {
  if (flag) {
    importMocks();
  }
};

以上方式两种方式实现文件的按条件加载完全没有问题,但是 ES6 方式,发现当所谓的flag位置发生变化并且在import旁时判断就会失效,举例说明:

//根据flag决定是否加载mock文件
export function importMocks(flag) {
  try {
    const fileRequireContext: __WebpackModuleApi.RequireContext = require.context("../views", true, /(mock)*?([A-Z]_)?\.ts$/);
    fileRequireContext.keys().forEach((fileName) => {
      console.debug(fileName);
      // 获取内容
      flag?fileRequireContext(fileName):null;
    });
  } catch (error) {
    console.debug(error);
  }
}

wepack以上方式仍成功的根据flag决定是否加载mock文件

//根据flag决定是否加载mock文件
export function importMocks(flag) {
   try {
    const fileRequireContext = import.meta.glob('../views/**/mock*.ts')
    //该循环是flag是否失效的分界点
    Object.keys(fileRequireContext).forEach((fileFullName) => {
      fileRequireContext[fileFullName]();
      flag ?import(fileFullName):null;
      // if(flag){
      //   import(fileFullName)
      // }
    });
  } catch (error) {
    console.debug(error);
  }
}

而ES通过import方式加载mock文件,当通过三目表达式或if判断是否加载mock文件时flag失效,不论 flag 是什么都会加载mock文件的,思考并测试了一下,发现只要forEach内部判断都会导致flag失效,都会编译import语句实现文件的加载,但是flag判断是发生在forEach之外就不会失效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三知之灵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值