【问题标题】:React - How to run a node_modules package at compile/build time instead of run time?React - 如何在编译/构建时而不是运行时运行 node_modules 包?
【发布时间】:2019-07-08 11:52:32
【问题描述】:

我在我创建的自定义 npm 包中使用 find-up 将配置数据从项目根目录加载到 npm 包中。我遇到的问题是 file-up 使用了 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/... 中的其他组件使用。然后我将组件导入我的应用程序。例如,我可能在pages/index.js 中有import CoolComponent from "myPackage"

由于配置的合并是在运行时完成的,并且它需要 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 获取,因为在运行期间获取会显着减慢初始加载时间,并且获取的数据不会经常更改。

我该怎么做?

【问题讨论】:

  • 为什么不使用标准配置加载器库呢?除非您打算编写新的配置加载器,否则重新实现配置加载器被认为是不好的做法,我认为这里不是这种情况。 rcdotenv 将解决您的需求
  • 我去看看 rc.我的理解是这些在运行时不起作用(就像查找在运行时如何不起作用),这就是为什么我询问如何让它们在 React 的编译期间工作(特别是 Next. js) 应用程序
  • 是的,那也行不通。我可以看到它需要“fs”模块,所以会出现同样的问题 - github.com/davidtheclark/cosmiconfig/blob/…
  • 你不应该在运行时使用fs,react 是一个基于网络的应用程序,你不会在浏览器中有fs 模块。编译时获取实际上比运行时获取更快。我认为您问错了问题,我假设您的开发环境很慢,并且您得出结论是因为配置加载,这可能是真的,也可能不是。没有实际指标很难判断。
  • 我想你可能对我的问题感到困惑。我在问如何进行编译时间获取。这正是我想要实现的目标。

标签: node.js reactjs npm next.js


【解决方案1】:

可以使用提供的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访问你的变量

【讨论】:

  • next.config.js 是项目的一部分,而不是 npm 包的一部分
  • 另外,我需要存储嵌套对象。 process.env 只允许我存储字符串。
  • @GCM 存储嵌套对象并将这些配置存储在 npm 包中不是您的问题的一部分。您的问题是编译时配置加载。
  • 是的 - “在 node_modules/myPackage/index.js 中有代码将 myConfig.js 中导出的对象与 node_modules/myPackage/defaultConfig.js 中的默认配置文件合并。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
  • 2020-10-19
  • 2015-04-08
  • 1970-01-01
相关资源
最近更新 更多