【问题标题】:How do I import all files in a folder as an module and export all as an object? [duplicate]如何将文件夹中的所有文件作为模块导入并将所有文件作为对象导出? [复制]
【发布时间】:2019-03-25 12:14:14
【问题描述】:

我正在尝试将每个文件导出为某个文件夹中的模块,以作为单个对象导入。我该怎么做?

我制作了一个带有很长的单个文件的 javascript 插件。我现在正试图让它被几个文件分开。我正在使用 Webpack。

而且,在我的插件代码中,有一个名为“fn”的巨大对象,其中包含 40~50 个函数,每个函数有 200~300 行。为了拆分它们,我创建了一个名为“fn”的文件夹并将每个函数作为每个文件。每个文件名和函数名都是相同的。所以名为“foo”的函数默认导出到“fn”文件夹中名为“foo.js”的文件中。

现在我正在尝试将它们全部导入并将其导出为像这样的单个对象。

src/fn/foo_or_whatever.js

export default function aFunctionWhichIUse(){
  // return whatever;
}

src/fn/index.js

import foo from './foo';
import bar from './bar';
import fooz from './fooz';
import baz from './baz';
import kee from './kee';
import poo from './poo';
import tar from './tar';
import doo from './doo';
.
.
.
import foo_or_whatever from './foo_or_whatever';

export default {
  foo,
  bar,
  fooz,
  baz,
  kee,
  poo,
  tar,
  doo,
  .
  .
  .
  foo_or_whatever,
}

src/index.js

import fn from './fn'

但我认为这没有意义。现在我必须每四次输入相同的单词才能在“fn”对象中添加一个函数。

我发现导入/导出系统不支持从文件夹中导入所有文件。那么,我应该使用什么以及如何编写代码来做到这一点?

有没有办法做到这一点?方式是否是导入/导出系统我不关心,只要该方式在 webpack 上有效。

src/index.js

import * as fn from './fn';

【问题讨论】:

标签: javascript webpack ecmascript-6


【解决方案1】:
const fs = require('fs');
const path = require('path');

const basename = path.basename(__filename);
const functions = {}

fs
  .readdirSync("./")
  .filter(file => (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'))
  .map((file) => {functions[file.slice(0, -3)] = require(path.join(__dirname, file})))

module.exports = functions;

这样的东西会有帮助吗?

【讨论】:

  • 我可以在 webpack 中使用 fs 吗?我正在做的事情没有在网络服务器上运行
  • can I use fs in webpack? webpack 只是一个 node 包,所以如果可以运行 webpack,就可以运行上面的代码。
  • @keith 不是真的。
  • @JonasWilms 不确定你的意思,你是说你不再需要 node 来让 webpack 工作了吗?。
  • @JonasWilms 我不确定以上内容是否是海报在运行时运行的内容,而是他可以用来制作.js 文件的代码。
【解决方案2】:

自动执行此操作似乎是个好主意,但使用 webpack 时需要特殊的插件来处理它。

但是如果重复部分是您主要关心的另一个选择,我可能会为您提供另一个想法。

Webpack 也可以处理 commonjs 模块。所以你可以做的是 ->

module.exports = {
  foo: require('./foo'),
  bar: require('./bar'),
  fooz: require('./fooz'),
  baz: require('./baz'),
  kee: require('./kee'),
  poo: require('./poo'),
  tar: require('./tar'),
  doo: require('./doo')
};

另一个建议是,如果您想暂时替换 baz,您可以将要求更改为 ./baz-temp 等。

另外,以小写命名文件总是一个好主意,所以如果你想包含一个自动执行此操作的类将是一个问题。但只要这样做 -> Foo: require('./foo') 就可以了。

【讨论】:

  • 可以更改它的名称是好的。但就我而言,我需要一些不需要处理的东西。
猜你喜欢
  • 2020-01-26
  • 2018-09-09
  • 2016-11-04
  • 2016-02-26
  • 1970-01-01
  • 2020-12-23
  • 1970-01-01
  • 2019-08-25
  • 1970-01-01
相关资源
最近更新 更多