我试图在运行时通过require.context
我的 CRA(使用 Typescript)项目做一些要求,但我只收到这些类型的错误:
TypeError: __webpack_require__(...).context 不是函数
和
关键依赖:require函数的使用方式不能静态提取依赖
我在某处读到现在需要通过 Babel 或cra-rewired
. 好吧,我已经在使用 Craco 来启用 Less-support,但我不知道如何添加require.context
到我的 Craco 配置中。
有人知道怎么做吗?
更新:这就是我调用 require.context 的方式:
const packagesDirectory = path.join(__dirname, '../../../../packages');
const textDataContext = require.context(packagesDirectory, true, /(\w+)\.(\w+)\.(mdx?)/);
更新 2:
正如该线程中的一些评论所暗示的那样,我尝试babel-plugin-require-context-hook
像这样添加到我的应用程序中:
// craco.config.js
const CracoLessPlugin = require('craco-less');
module.exports = {
plugins: [
{plugin: CracoLessPlugin}
],
babel: {
plugins: ['require-context-hook']
}
};
然后我试过require.context
这样打电话:
// myfile.js
import registerRequireContextHook from 'babel-plugin-require-context-hook/register';
registerRequireContextHook();
const packagesDirectory = path.join(__dirname, '../../../../packages');
const textDataContext = require.context(packagesDirectory, true, /(\w+)\.(\w+)\.(mdx?)/);
但后来我得到这个错误:
TypeError:fs.readdirSync 不是函数
更新 3:
似乎 CRA确实支持 require.context 而根本不需要任何 polyfill。但是当它通过导入的模块执行时似乎失败了。在我之前的尝试中,我一直在执行对require.context
in myfile.js
(见上文)的调用,该调用已通过index.js
如下方式导入:
// index.js
import myModules from 'myfile.js';
ReactDOM.render(...);
但是,如果我改成index.js
这样:
// index.js
const something = require.context('../../packages/', true, /(\w+)\.(\w+)\.(mdx?)/);
something.keys().forEach(key => console.log(key));
ReactDOM.render(...);
它就像一个魅力!为什么?!