【问题标题】:ESM importing all files from folder with index.js not workingESM 从 index.js 的文件夹中导入所有文件不起作用
【发布时间】:2023-04-04 11:23:01
【问题描述】:

考虑这个非常简单的项目:esm-test

Node.js v13 上运行。

这个项目在他的package.json 中有"type":"module",所以默认情况下Node.js 会将所有文件.js 视为ECMAScript 模块。见:ECMAScript Modules - Enabling

它有以下非常简单的结构:

- package.json
- src/
  - stuff/
    - a.js
    - b.js
    - index.js
  - app.js

文件app.js是包入口点。

我的目的是使用index.js 文件从stuff/ 文件夹中导入所有文件。我知道在 ES6 中,在文件夹中有一个 index.js 文件可以让您从文件夹中隐式执行导入,而无需在导入语句中指定 index.js

所以我可以这样做:

import { a, b } from './stuff'

代替:

import a from './stuff/a.js'
import b from './stuff/b.js'

但这对我不起作用。它显示以下错误:

internal/modules/esm/default_resolve.js:96
  let url = moduleWrapResolve(specifier, parentURL);
            ^

Error: Cannot find module C:\projects\esm-test\src\stuff imported from C:\projects\esm-test\src\app.js
    at Loader.resolve [as _resolve] (internal/modules/esm/default_resolve.js:96:13)
    at Loader.resolve (internal/modules/esm/loader.js:72:33)
    at Loader.getModuleJob (internal/modules/esm/loader.js:156:40)
    at ModuleWrap.<anonymous> (internal/modules/esm/module_job.js:42:40)
    at link (internal/modules/esm/module_job.js:41:36) {
  code: 'ERR_MODULE_NOT_FOUND'
}

使用 CommonJS 模块可以工作。但我想用 ESM 来做。

你能帮我解决这个问题吗?

【问题讨论】:

  • 你看到@Vivek 的回答了吗?如果它解决了您的问题,请接受他的回答。我看到了他的回答。这是一个完美的答案。

标签: javascript node.js es6-modules


【解决方案1】:

在 esm 中自动导入 index.js 是 node.js 当前版本中的一项实验性功能。您可以在启动服务器时使用标志 --experimental-specifier-resolution=node

EX-node --experimental-specifier-resolution=node index

请参考此链接以获取更多信息https://nodejs.org/api/esm.html#esm_resolver_algorithm

【讨论】:

    【解决方案2】:

    为了使这个工作与“类型”:“模块”,你需要导入包括文件名和扩展名,即“index.js”,它默认不会寻找index.js,其他文件也需要包括扩展名,即 a.js

    a.js / b.js

    class a {
      constructor(name) {
        this.name = name;
      }
    
      sayName() {
        console.log('Hi, my name is ', this.name + '.');
      }
    }
    
    export default a;
    

    ./stuff/index.js

    import a from './a.js';
    import b from './b.js';
    
    export {
        a,
        b
    };
    
    //Or "export default" depending on your needs.
    
    export default {
        a,
        b
    };
    

    app.js

    import { a, b } from './stuff/index.js'
    

    如果你有多个命名的导出,你需要像这样导入。

    import * as a from './a.js';
    

    【讨论】:

      猜你喜欢
      • 2016-05-28
      • 2019-04-22
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      • 2015-06-21
      • 2020-01-27
      • 2017-04-26
      • 2020-08-12
      相关资源
      最近更新 更多