如何解决nodejs 动态导入失败但文件存在不是无扩展的问题
我有一个 commonjs 模块,它使用动态导入来加载 ES 模块,但导入失败并显示 Error [ERR_MODULE_NOT_FOUND]: Cannot find module
。奇怪的是,错误消息声称它找不到该文件,然后建议使用完全相同的文件:
'/…/My.app/Contents/Resources/app.asar/build/backend/index.mjs'
imported from
/…/My.app/Contents/Resources/app.asar/build/backend/main.cjs
Did you mean to import
/…/My.app/Contents/Resources/app.asar/build/backend/index.mjs?
为了简洁起见,我截断了路径,但它们是相同的(使用 diff 工具验证),并且为了可读性,我在错误输出中添加了一些换行符。
在用动态导入行之前,我已经验证过:
-
fs.readdirsync()
返回一个包含两个文件的数组:['index.mjs','main.cjs']
-
fs.statSync()
返回index.mjs
的预期对象 -
index.mjs
的stat.isFile()
返回true
-
fs.readFileSync()
正确返回index.mjs
的内容
我在 Node.js 源代码中看到,它使用的是 fs.Stat
和 fs.Stat#isFile()
的内部版本。
那么为什么这不适用于 import()
? ?
代码是这样的:
主文件const path = require('path');
(async () => {
global.Electron = require('electron');
const fileUrl = path.resolve(__dirname,'./index.mjs');
await import(fileUrl);
})();
索引.mjs
import path from 'path';
import {
pathToFileURL,} from 'url';
import log from 'electron-log';
const { app,browserWindow } = Electron;
function createWindow() {
const mainWindow = new browserWindow({});
const base = process.env.NODE_ENV === 'development'
? 'http://localhost:8080'
: pathToFileURL(path.resolve('build'));
const docUrl = (base + '/index.html').toString();
if (DEBUG) console.log({ docUrl });
mainWindow
.loadURL(docUrl)
.then(() => log.info('launched',docUrl))
.catch((err) => log.error('Failed to launch',docUrl,err.toString()));
}
app.whenReady().then(() => {
createWindow();
});
app.on('window-all-closed',() => {
app.quit();
});
注意:如果没有由 electron-builder 和 asar 捆绑,则不会发生此问题(但在这两种情况下,文件路径实际上是相同的,只是中间没有 My.app/Contents/Resources/app.asar/
)。 Ex npx electron ./build/backend/main.cjs
(工作正常)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。