【问题标题】:Use import inside a nodejs usually using require在 nodejs 中使用 import 通常使用 require
【发布时间】:2021-10-18 02:13:27
【问题描述】:

我有一个 NodeJS 应用程序,其中包含很多路由、函数等。我有很多带有 const xxx = require('yyy') 的文件。 我现在想用这个:https://www.npmjs.com/package/simple-ldap-search 我以为我的旅程会像现在一样平静,但我不能使用它,让我解释一下:我必须使用import,而不是通常的import,如文档中所述:

import SimpleLDAP from 'simple-ldap-search';

我在 StackOverflow 上进行了搜索,发现我可以将 "type": "module" 放在顶部的 package.json 文件中,但是如果我这样做了,我就不能使用 require... 这似乎无法解决。

这是否意味着我必须在使用 ES6 或 CommonJS 之间做出选择?我读到了这个问题:Using Node.js require vs. ES6 import/export

  1. 我觉得import 更有效率,对吗?
  2. 是否可以在我当前的节点应用程序中使用simple-ldap-search 而无需进行大的更改?
  3. 是否可以将require 的使用“转换”(我知道这不是确切的术语,但我想你会理解)import 的使用,反之亦然?

感谢您的回答。

【问题讨论】:

    标签: javascript node.js ecmascript-6 es6-modules commonjs


    【解决方案1】:

    正如project issue 所述,无法在 package.json 中切换到 type: "module" 的项目中使用 require。对于这些用例,需要使用 Babel 等加载器。

    值得考虑切换到 ES 模块,即将type: "module" 添加到您的顶级 package.json。仍然可以使用 import 导入 CommonJS 模块,但反过来就不行了。

    或者,您可以切换回该软件包的 2.x 版本,据我所知,他们从 3.0.0 开始切换到 ES 模块。

    【讨论】:

      【解决方案2】:

      虽然您不能在 commonjs 文件中使用 import,但可以使用 import()

      这会在处理异步加载时变得更加烦人,但可能比将整个项目转换为 ESModules 更容易。

      const simpleLDAPLoader = import('simple-ldap-search');
      // later
      
      async function () {
        const {default: SimpleLDAP} = await simpleLDAPLoader;
      
        const simpleLDAP = new SimpleLDAP();
      
      }
      

      每次等待现有承诺时,这将使用缓存版本

      来源:https://nodejs.org/api/esm.html#esm_interoperability_with_commonjs

      不支持使用 require 加载 ES 模块,因为 ES 模块具有异步执行。相反,使用 import() 从 CommonJS 模块加载 ES 模块。

      【讨论】:

      • 其实不行,我有:TypeError: SimpleLDAP is not a constructor
      • 我会在runkit中试一试,看看
      • 啊,因为它是默认导出,您需要从模块中获取.default。我会编辑答案
      猜你喜欢
      • 2016-12-19
      • 2017-07-04
      • 2020-03-30
      • 1970-01-01
      • 2018-08-13
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      相关资源
      最近更新 更多