如何使用ECMAScrip6导入带参数的函数?

时间:2018-03-19 12:44:04

标签: node.js express ecmascript-6 babeljs


我正在使用 Babel ESLint Express 中设置一个全新的项目,我正在尝试设置动态路由。唯一的问题是我无法弄清楚如何为路由调用加载器。这是我目前关于装载机的代码。

路由/ index.js

import fs from 'fs';

/**
 * Register Default Routes
 * @param {Object} app express.Application
 */
export default function(app) {
    fs.readdirSync(__dirname).forEach((fileName) => {
        if (fileName == __filename.slice(__dirname.length + 1)) return;
        let fileNameStripped = fileName.substring(0, fileName.lastIndexOf('.'));
        require('./' + fileNameStripped)(app); // does not work
    });
}

index.js

import express from 'express';
import routes from './routes/index.js';

const app = express();

app.use(express.static('public'));

routes(app); // works now

...

Babel错误

TypeError: require(...) is not a function
    at /app/build/routes/index.js:1:314
    at Array.forEach (<anonymous>)
    at exports.default (/app/build/routes/index.js:1:195)
    at Object.<anonymous> (/app/build/index.js:1:393)    
    at Module._compile (module.js:649:30)
    at Object.Module._extensions..js (module.js:660:10)
    at Module.load (module.js:561:32)
    at tryModuleLoad (module.js:501:12)
    at Function.Module._load (module.js:493:3)
    at Function.Module.runMain (module.js:690:10)

该问题似乎与https://github.com/babel/babel/issues/2683

有关

1 个答案:

答案 0 :(得分:1)

由于嵌套路由文件应该是具有default导出的ES模块,因此require('./' + fileNameStripped)是模块对象而不是函数。它应该是:

require('./' + fileNameStripped).default(app);

根据Babel配置(dynamic-import-node插件是必需的),require()可以替换为动态import(),但这里不太理想,因为动态import不是同步的会导致竞争条件。