通过Node.js中的ES6模块进行内联导入

时间:2019-03-18 13:48:13

标签: javascript node.js ecmascript-6 module babel

以“旧方式”管理Node.JS(CommonJS模块)中的模块,您可以执行以下操作:

Express.js路由示例:app.use('/user', require("./user"));

当我使用ES6模块(导入,导出)并通过babel通过Node.JS服务器进行转录时,该怎么做?

我不能只是做:app.use('/user', import {user} from './user');

2 个答案:

答案 0 :(得分:1)

尝试将其分成多个表达式-import(以及export)在与尝试使用该示例相同的词汇级别上不可用:

import { user } from './user'

...

app.use('/user', user)

答案 1 :(得分:0)

有一种方法可以在 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
    (
      ...
    );
  `
};

我在 package.json 中使用带有 "type": "module" 的节点 v12.18.4。当我运行脚本时,我收到一条警告,指出 ESM 模块加载器是实验性的,但它可以工作。但是,上面链接的页面上有一条说明:

<块引用>

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

我希望这会有所帮助。我相信您应该能够将其应用于您的问题。