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 工具验证),并且为了可读性,我在错误输出添加了一些换行符。

在用动态导入行之前,我已经验证过:

  1. fs.readdirsync() 返回一个包含两个文件的数组:['index.mjs','main.cjs']
  2. fs.statSync() 返回 index.mjs 的预期对象
  3. index.mjsstat.isFile() 返回 true
  4. fs.readFileSync() 正确返回 index.mjs
  5. 内容

我在 Node.js 源代码中看到,它使用的是 fs.Statfs.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 (将#修改为@)