React-如何在编译/构建时而不是运行时运行node_modules包?

时间:2019-07-07 23:08:54

标签: node.js reactjs npm next.js

我在自己创建的自定义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进行获取,因为在运行时进行获取会大大减慢初始加载时间,并且获取的数据不会经常更改。

我该怎么做?

1 个答案:

答案 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

访问变量