【问题标题】:Using ES6 modules in Express在 Express 中使用 ES6 模块
【发布时间】:2020-10-25 20:10:15
【问题描述】:

有没有办法

  1. Express app 中使用ES6 模块编写我的代码;
  2. 不恢复到babel@std/esm ?

一旦我致力于Express 中的app.js,我就找不到摆脱它的方法。

这似乎应该已经在网络上,但我能找到的只是上面的选项(转译,esm)。

【问题讨论】:

  • 你读过这个吗:nodejs.org/api/esm.html
  • 对那篇文章或多或少熟悉。我看到的唯一途径是使用动态导入()。我试过了,但无法让它工作。就像在 app.js 中放入下面一样。应用程序运行,但 url 导致“未找到”。它从模块中提取正确的对象,但 app.use() 部分好像没有发生。可能等到解决这个问题时为时已晚? import('./routes/lecture.mjs') .then (lectureModule => { app.use('/lectures', LectureModule.router); })
  • 您需要向我们展示您尝试使用的精确代码,以便我们知道建议什么作为修复。 ESM 模块可以在更高版本的 nodejs 中正常工作。我只使用 ESM 导入运行程序,但是 NPM 上的某些 ComonJS 模块存在一些兼容性问题,因此除非您仅使用专门支持 ESM 导入的模块,否则您可能需要进行一些故障排除才能查看问题所在。
  • 我想要做的就是在 Express 的 app.js 中有 app.use('/someUrl', someRouter)。如果我按本书来做, const someRouter = require('someModule') 就可以了。但我更喜欢使用 ES6 格式的 someModule 而不是 commonJS。我宁愿避免使用 babel 或 @std/esm

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


【解决方案1】:

使用 node.js,您必须告诉它您正在加载的主文件是一个 ESM 模块。有几种方法可以做到这一点。最简单的方法是只给主文件一个.mjs 文件扩展名。

// app.mjs

import express from 'express';

const app = express();

app.get("/", (req, res) => {
    res.send("hello");
});

app.listen(80);

然后,启动您的程序:

node app.mjs

这行得通 - 我只是用节点 v14.4.0: 运行它。在我之前给你here的链接中讨论了其他方法。根据该文档,有三种方法可以指定您将 ESM 模块加载为顶级模块文件:

  1. .mjs 结尾的文件。

  2. .js 结尾的文件,当最近的父package.json 文件包含值为“module”的顶级字段“type”时。

  3. 作为参数传入--eval 的字符串,或通过STDIN 管道传送到节点,带有--input-type=module 标志。

【讨论】:

  • 好吧,受您的经验鼓舞,继续将所有内容都转换为 ES6,包括 \bin\www(我一直在使用 express-generator)。最后设法使其工作(将默认导入转换为名称,硬编码__dirname等)。我会看看它的效果如何,虽然有点担心会到处出现一些错误。另一种方法是在 CommonJS 中保留顶层(app.js)并从路由向下切换到 ES6,这也有效。希望它(Express)默认是 ES6 并且开箱即用。感谢@jfriend00 的帮助
  • @GiorgiSh。 - 如果这回答了您的问题,您可以通过单击答案左侧的复选标记向社区表明这一点。遵循正确的程序,这也将为您赢得一些声誉积分。
  • @GiorgiSh。 - IMO,ESM 模块大约有 2/3 在 nodejs 中实现,并且仍然有一些粗糙的边缘。我们也处于过渡时期,一些 NPM 模块正在致力于更好的 ESM 兼容性。因此,您绝对可以使 ESM 代码工作,但您可能需要处理一些限制或兼容性问题。
猜你喜欢
  • 1970-01-01
  • 2022-08-20
  • 2022-12-02
  • 2021-12-08
  • 1970-01-01
  • 2020-01-15
  • 2015-07-23
  • 2018-10-20
  • 2021-04-07
相关资源
最近更新 更多