[webpack问题]TypeError: __webpack_require__(...).context is not a function

require.context(directory,useSubdirectories,regExp)

  • directory:表示检索的目录
  • useSubdirectories:表示是否检索子文件夹
  • regExp:匹配文件的正则表达式,一般是文件名

例如 require.context("@/views/components",false,/.vue$/)

使用场景

大量加载某些文件的时候

批量注册组件

// 自定义组件
const requireComponents = require.context('@/components', true, /\.vue/)
// 遍历出每个组件的路径
requireComponents.keys().forEach(fileName => {
  // 组件实例
  const reqCom = requireComponents(fileName)
  // 截取路径或者组件的name作为组件名
  const reqComName =reqCom.name|| fileName.replace(/\.\/(.*)\.vue/,'$1')
  // 组件挂载 或者其它地方挂载
  Vue.component(reqComName, reqCom.default || reqCom)
})

批量加载国际化文件

  const modules= {};
  const contextList=[];
  try {
    // 导入 @/views 下文件,包含子目录,文件名为:[/\\]locales[/\\]([a-z]{2})-?([A-Z]{2})?\.ts
    //require.context("查找目录",是否查找子文件夹,符合规则的正则表达式) 
    //require.context不能在循环中使用,因为require.context的参数只能使用字面值,不能使用变量代替
    // 公共内容
    const folderRequireContext: __WebpackModuleApi.RequireContext = require.context("../router",true,/[/\\]locales[/\\]([a-z]{2})_?([A-Z]{2})?\.ts$/);
    contextList.push(folderRequireContext);
    //页面
    const commonRequireContext: __WebpackModuleApi.RequireContext = require.context("../views",true,/[/\\]locales[/\\]([a-z]{2})_?([A-Z]{2})?\.ts$/);
    contextList.push(commonRequireContext);

    contextList.forEach(requireCtx=>{
      requireCtx.keys().forEach(fileName => {
        // 获取内容
        const modulesConent = requireCtx(fileName);
        if (modulesConent.default) {
          // 获取 PascalCase 命名
          const modulesName = fileName.replace(/(.*\/)*([^.]+).*/gi, "$2");
          if (modules[modulesName]) {
            Object.assign(modules[modulesName],modulesConent.default)
          } else {
            modules[modulesName] = modulesConent.default;
          }
        }
      });
    })

  } catch (error) {
    console.log(error);
  }
  return modules;

实际应用

报错信息

TypeError: webpack_require(…).context is not a function
at importAllMocks (mock.ts?61ca:28)
at eval (mock.ts?61ca:40)
at Module…/src/config/mock.ts (app.js:173)
at webpack_require (app.js:1673)
at fn (app.js:1955)
at eval (main.ts?cd49:11)
at Module…/src/main.ts (app.js:206)
at webpack_require (app.js:1673)
at app.js:2864
at Function.webpack_require.O (app.js:1722)

报错相关代码

const localesFolderReg = new RegExp(/(mock)_?([A-Z]*)?.ts$/,“g”);
require.context("…/views",true,localesFolderReg );

报错分析 & 解决方案

Warning

The arguments passed to require.context must be literals!

require.context("…/views",true,/(mock)_?([A-Z]*)?.ts$/);

因此,require.context不能在循环中使用,因为require.context的参数只能使用字面值,不能使用变量代替

### 回答1: execjs.programerror: typeerror: require is not a function这个错误通常出现在使用ExecJS运行JavaScript代码时。它的意思是在代码中使用了require函数,但是该函数在ExecJS中并不可用。 问题的根本原因是ExecJS是一个简单的JavaScript运行时库,它并不支持像Node.js一样的模块加载机制。因此,在ExecJS中无法直接使用require函数加载其他的模块。 要解决这个问题,有以下几种方式: 1. 使用原生的JavaScript代码,避免使用require函数。如果你在代码中使用了require函数,可以尝试去掉该函数,看看是否能够正常运行。 2. 使用适合ExecJS的其他依赖管理工具。ExecJS本身虽然不支持模块加载,但是可以配合一些其他的依赖管理工具来实现模块的加载。例如,可以使用Browserify或webpack等工具将代码打包成一个单独的文件,然后再使用ExecJS来运行。 3. 使用支持模块加载的JavaScript运行时。如果你的代码中确实需要使用require函数加载其他模块,那么ExecJS可能并不是一个合适的选择。你可以考虑使用支持模块加载的JavaScript运行时,如Node.js或Rhino。 总之,execjs.programerror: typeerror: require is not a function错误的出现是因为在ExecJS中使用了不支持的require函数。要解决这个问题,可以尝试改变代码,使用其他依赖管理工具,或者考虑使用支持模块加载的JavaScript运行时。 ### 回答2: execjs.programerror: typeerror: require is not a function 是由于在使用 ExecJS 运行 JavaScript 代码时发生的一个错误。错误消息表明在 JavaScript 代码中使用了 require 函数,但是这个函数在 ExecJS 中并不存在。下面是一个用300字中文回答的解释: ExecJS 是一个用于在 Ruby 程序中执行 JavaScript 代码的库。在这个错误中,require 函数不是 ExecJS 对象的一部分,所以无法使用它。 require 函数在 JavaScript 中通常用于加载外部模块或库,例如在 Node.js 中使用它来引入其他文件或第三方库。然而,ExecJS 并不支持加载外部模块的功能,所以 require 函数在 ExecJS 中是未定义的。 要解决这个错误,有几种可能的方法。首先,可以尝试将 JavaScript 代码中使用 require 函数的部分去除或注释掉,看看是否还会报错。如果代码中确实需要使用外部模块,那么就需要考虑使用其他适用于 ExecJS 的方法来加载这些模块。 替代方法可能包括手动将外部模块的代码复制粘贴到 JavaScript 代码中,或者将需要的功能手动实现而不依赖外部模块。当然,这些替代方法可能会导致代码的复杂性增加,并且不适合所有情况。 另外,如果需要在 Ruby 程序中执行 JavaScript 代码并使用外部模块,那么考虑使用其他支持加载外部模块的库,如 Node.js。Node.js 提供了 require 函数的功能,可以通过适当的设置和配置在 Ruby 程序中使用它来加载外部模块。 综上所述,execjs.programerror: typeerror: require is not a function 是由于在 ExecJS 中调用了未定义的 require 函数导致的错误。解决方法包括去除 require 函数、手动实现需要的功能或者考虑使用其他支持加载外部模块的库。 ### 回答3: `execjs.programerror: typeerror: require is not a function`是一个错误提示,说明在使用ExecJS库执行JavaScript代码时发生了错误。这个错误通常发生在尝试在JavaScript代码中使用`require`函数时。 `require`函数在Node.js中常用于引入其他JavaScript模块,用于模块之间的依赖关系管理。而ExecJS是一个在Python中执行JavaScript代码的库,它并不支持`require`函数。 要解决这个错误,可以考虑以下几个方法: 1. 检查代码:确保JavaScript代码中没有使用`require`函数,或者尝试将其替换为其他适合ExecJS的方法。 2. 修改代码逻辑:如果确实需要使用`require`函数,可以考虑将代码逻辑修改为ExecJS可以支持的方式,例如手动加载所需的模块或使用全局变量引入所需的功能。 3. 考虑其他库:如果需要在Python中执行带有`require`函数的JavaScript代码,可以考虑使用其他支持的JavaScript引擎库,例如PyV8或PyExecJS。这些库可能提供对`require`函数的支持。 总之,`execjs.programerror: typeerror: require is not a function`错误提示表明在使用ExecJS执行JavaScript代码时尝试使用了不被支持的`require`函数,需要根据具体情况修改代码或切换使用其他支持`require`函数的JavaScript引擎库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

三知之灵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值