【发布时间】:2020-05-21 07:57:22
【问题描述】:
我想从两个文件夹“NL”和“JP”导入帖子。并为此使用动态设置的文件夹。
当我静态编写文件夹时,它可以工作:
import { useState, useEffect } from 'react';
import importAllMarkdown from '../importAllMarkdown';
import { Data, PostBlog } from '../shared.types';
type countryCode = 'NL' | 'JP';
function usePosts(countryCode: countryCode): Data<PostBlog>[] | null {
const [posts, setPosts] = useState<Data<PostBlog>[] | null>(null);
useEffect(() => {
// this codeblock for each country :(
if (countryCode === 'NL') {
const importedPosts: Data<PostBlog>[] =
importAllMarkdown(require.context('../posts/NL', true, /\.md$/));
setPosts(importedPosts);
}
if (countryCode === 'JP') {
const importedPosts: Data<PostBlog>[] =
importAllMarkdown(require.context('../posts/JP', true, /\.md$/));
setPosts(importedPosts);
}
}, [countryCode, setPosts]);
return posts;
}
export default usePosts;
正如您在此示例中所见,对于每个国家/地区,您必须添加一个完整的块来导入该文件夹中的文件。
当您动态设置文件夹时:
const folderPath = `../posts/${countryCode}`;
const importedPosts: Data<PostBlog>[] =
importAllMarkdown(require.context(folderPath, true, /\.md$/));
..它给出了错误:TypeError: __webpack_require__(...).context is not a function.
现在从这个Github thread看来ContextReplacementPlugin可以用于动态设置文件夹。
"另一种方法是使用 require(variable) 并使用 ContextReplacementPlugin 通过 config 提供“静态性”。在这种情况下,您需要在插件的参数中指定变量的所有可能值(或抓取一个目录)。”
所以我正在尝试:
./next.config.js
module.exports = {
webpack(config, { webpack }) {
config.plugins.push(new webpack.ContextReplacementPlugin(
/^\..\/posts/,
/NL|JP/,
));
return config;
},
};
这仍然会产生错误:TypeError: __webpack_require__(...).context is not a function。
出了什么问题?
【问题讨论】:
-
你找到解决方案了吗?
-
有点。添加了一个答案。希望这对您的问题也有帮助。
-
谢谢,我确实做了类似的事情。