如何使用相对路径加载ES6自定义模块?
目录结构如下:
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();
疑惑
请问各位这是怎么一回事?如果我不想采用这两种方法请问我该怎么做?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
目前的es module解析并不支持CommonJS加载器的所有默认行为。其中一个行为差异是文件扩展名的自动解析以及自动导入一个目录下index文件的的能力。
--experimental-specifier-resolution=[mode]标志可以用来定制扩展名解析算法。默认模式是
explicit
的,它要求向加载器提供一个模块的完整路径。要启用自动扩展解析并从自动导入目录下的index文件,请使用node
模式。所以你可以这样执行代码
参考资料:
https://nodejs.org/api/esm.ht...