我在自己创建的自定义npm软件包中使用find-up,将配置数据从项目根目录加载到npm软件包中。我遇到的问题是文件上载使用fs
模块,该模块仅在编译时运行。当我尝试在项目中使用npm软件包时,由于找不到fs
软件包而失败。
该项目是Next.js应用程序。
因此,基本上,在 project 根目录下,我有一个配置文件(我们将其称为myConfig.js
)。
我已经为此项目安装了一个npm软件包(我们将其称为myPackage
)。
在node_modules/myPackage/index.js
中,有代码将myConfig.js
中导出的对象与node_modules/myPackage/defaultConfig.js
中的默认配置文件合并。
此新合并的配置文件然后由node_modules/myPackage/components/...
中的其他组件使用。然后,我将组件导入到我的应用程序中。例如,我可能在import CoolComponent from "myPackage"
中有pages/index.js
。
由于配置的合并是在运行时完成的,并且需要fs
模块,因此失败并出现错误,指出无法找到fs
模块。我想做的是能够在编译时运行它,但是我不知道该怎么做。
代码如下:
// node_modules/myPackage/index.js
import findUp from "find-up";
import deepMerge from "deepmerge";
import defaultConfig from "./defaultConfig";
const config = (() => {
const path = findUp.sync("myConfig.js");
if (path && path.length) {
const userConfigModule = module.require(path);
return deepMerge(defaultConfig, userConfigModule);
}
return defaultConfig;
})();
export default config;
类似地,我也希望能够在编译期间从CMS进行获取,因为在运行时进行获取会大大减慢初始加载时间,并且获取的数据不会经常更改。
我该怎么做?
答案 0 :(得分:0)
您可以将提供的example用于Next.js配置管理
在next.config.js
import findUp from "find-up";
import deepMerge from "deepmerge";
import defaultConfig from "./defaultConfig";
const config = (() => {
const path = findUp.sync("myConfig.js");
if (path && path.length) {
const userConfigModule = module.require(path);
return deepMerge(defaultConfig, userConfigModule);
}
return defaultConfig;
})();
module.exports = {
env: {
...config
}
}
然后您可以通过process.env.YOUR_VARIABLE