ES6模块在Node.js中的内联导入

9
在 Node.JS 中管理模块的“旧方法”(CommonJS 模块)中,您可以这样做:
Express.js 路由的示例:`app.use('/user', require("./user"));`
当我使用 ES6 模块(import、export)并通过 babel 对 Node.JS 服务器进行转录时,应该如何实现呢?
我不能只用:`app.use('/user', import {user} from './user');`

2
将导入作为单独的语句,然后使用 app.use("/user", user); - Pointy
当然这是一种选择,但这失去了我问题的重点,因为同样的方式我可以将模块要求进变量,然后执行 app.use('/user', user); - Baterka
1
好的,“import”和“export”必须在外部词汇级别上完成,因此您无法做到您所要求的。 - Pointy
import("./user") 是做什么用的? - Baterka
1
@Baterka 这只是一个提议,不是标准语法,它返回一个 Promise。 - Bergi
显示剩余2条评论
3个回答

4

在Node中有一种动态内联导入的方法,详见:https://javascript.info/modules-dynamic-imports

以下代码对我有效:

let {default: foo} = await import('./foo.js');

这是我在Node中编写的数据库迁移工具中的一个函数的工作示例。
const getMigrations = async (path) => {
  const migrateDir = await fs.readdirSync(path);
  const migrations = await Promise.all(migrateDir.map(async (filename) => {
    let {default: migration} = await import(`${path}/${filename}`);
    return migration;
  }));
  migrations.sort((a, b) => {
    return a.seq - b.seq;
  });
  return migrations;
};

一个示例迁移可能如下:

export default {
  seq: 1.1,
  label: 'create user table',
  sql: `
    DROP TABLE IF EXISTS user;
    CREATE TABLE user
    (
      ...
    );
  `
};

我正在使用node v12.18.4,并在我的package.json中设置了"type": "module"。当我运行脚本时,会收到一个警告,提示ESM模块加载器是实验性的,但它可以正常工作。然而,上面链接页面上有一条注释说:

动态导入在常规脚本中可以工作,不需要script type="module"。

我希望这能帮到你。我相信你应该能够将其应用于你的问题。

1
尝试将其分成多个表达式 - import(以及export)不在与您尝试在示例中使用它的词法级别相同的词法级别上可用:
import { user } from './user'

...

app.use('/user', user)

如果真的无法像旧模块那样做,我认为这是正确的答案。 - Baterka

0
你可以使用以下语法来实现你想要的功能:
app.use('/user', (await import('./user')).user)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接