You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ES Module中批量导出文件夹内所有文件?

解决批量导出文件夹内模块的问题

你的核心问题是ES模块的export是静态声明,必须放在模块顶层作用域,不能在函数、异步回调这类动态执行的代码块中使用。你现在把导出逻辑放在forEach的异步回调里,完全不符合ES模块的规则,所以根本无法生效。

下面给出两种可行的解决方案,根据你的模块环境(ES模块/CommonJS)选择:

方案1:ES模块环境(使用import())

ES模块允许顶层await(Node.js 14.8+支持,或在打包工具中配置启用),我们可以先异步收集所有模块,再在顶层导出一个整合的对象:

import fs from 'fs/promises';
import path from 'path';

// 替换为你的目标文件夹路径
const filesDir = './your-target-folder';

async function loadAllModules() {
  try {
    const files = await fs.readdir(filesDir);
    // 过滤出JS文件,排除当前index.js避免循环导入
    const jsFiles = files.filter(file => file.endsWith('.js') && file !== 'index.js');

    // 批量导入所有模块并整理成键值对
    const moduleEntries = await Promise.all(
      jsFiles.map(async file => {
        const modulePath = path.join(filesDir, file);
        const imported = await import(modulePath);
        // 用文件名(不带后缀)作为导出键
        const key = path.basename(file, '.js');
        // 兼容默认导出和命名导出
        return [key, imported.default || imported];
      })
    );

    return Object.fromEntries(moduleEntries);
  } catch (err) {
    console.error('加载模块失败:', err);
    return {};
  }
}

// 顶层导出所有模块(支持顶层await)
export const allModules = await loadAllModules();

// 如果不能用顶层await,导出Promise让使用者自行处理:
// export const allModules = loadAllModules();

使用方式:

// 其他文件中导入
import { allModules } from './index.js';

// 如果是顶层await版本,直接使用
console.log(allModules.moduleA);

// 如果是导出Promise的版本
allModules.then(modules => {
  console.log(modules.moduleA);
});

方案2:CommonJS环境(使用require)

如果你的项目用CommonJS(Node.js默认模块系统),可以直接动态修改module.exports,同步实现更简单:

const fs = require('fs');
const path = require('path');

const filesDir = './your-target-folder';

function exportAllFiles() {
  const files = fs.readdirSync(filesDir);
  const jsFiles = files.filter(file => file.endsWith('.js') && file !== 'index.js');

  jsFiles.forEach(file => {
    const modulePath = path.join(filesDir, file);
    const exported = require(modulePath);
    const key = path.basename(file, '.js');
    // 动态添加到exports对象
    module.exports[key] = exported.default || exported;
  });
}

exportAllFiles();

使用方式:

const { moduleA, moduleB } = require('./index.js');

关键注意事项

  • 必须排除当前的index.js,否则会触发循环导入错误
  • 用path.join拼接路径,避免相对路径出错
  • 兼容默认导出和命名导出:如果模块用export default,取imported.default;如果是命名导出,直接取整个模块对象

内容的提问来源于stack exchange,提问作者ololo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 21:55:39