如何使用相对路径加载ES6自定义模块?

帕特菛琪
  • 9

目录结构如下:

app/
    es-module-package/
         index.js
         package.json
    app.js
    package.json

代码如下:

//es-module-package/index.js
export function say(){
    console.log('hello es6!');
}

//es-module-package/package.json
{
    "type": "module",
    "main": "index.js"
}

//app.js
import {say} from './es-module-package';
say();

//package.json
{
    "type": "module"
}

描述:es-module-package是我用es6语法写的一个自定义模块,现在想在app.js中加载这个自定义模块,并使用。

问题描述:

PS C:\Users\Lenovo\Desktop\app> node .\app.js
internal/modules/run_main.js:54
    internalBinding('errors').triggerUncaughtException(
                              ^

Error [ERR_MODULE_NOT_FOUND]: Cannot find module 'C:\Users\Lenovo\Desktop\app\es-module-package' imported from C:\Users\Lenovo\Desktop\app\app.js
    at finalizeResolution (internal/modules/esm/resolve.js:272:11)
    at moduleResolve (internal/modules/esm/resolve.js:649:10)
    at Loader.defaultResolve [as _resolve] (internal/modules/esm/resolve.js:692:13)
    at Loader.resolve (internal/modules/esm/loader.js:97:40)
    at Loader.getModuleJob (internal/modules/esm/loader.js:243:28)
    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'
}

发现无法加载这个自定义模块,但是我发现有两种解决方法:
1.直接引用es-module-package/index.js文件

//app.js
import {say} from './es-module-package/index.js';

say();

2.将es-module-package移动到node_modules目录中并直接引用模块名

app/
    node_modules/
          es-module-package/
               index.js
               package.json
    app.js
    package.json
//app.js
import {say} from 'es-module-package';

say();

疑惑

请问各位这是怎么一回事?如果我不想采用这两种方法请问我该怎么做?

回复
阅读 110
1 个回答

目前的es module解析并不支持CommonJS加载器的所有默认行为。其中一个行为差异是文件扩展名的自动解析以及自动导入一个目录下index文件的的能力。

--experimental-specifier-resolution=[mode]标志可以用来定制扩展名解析算法。默认模式是 explicit 的,它要求向加载器提供一个模块的完整路径。要启用自动扩展解析并从自动导入目录下的index文件,请使用 node 模式。

所以你可以这样执行代码

node --experimental-specifier-resolution=node .\app.js

参考资料:
https://nodejs.org/api/esm.ht...

你知道吗?

宣传栏