Electron项目中将CommonJS改成使用ES 模块(ESM)语法preload.js加载报错

问题

将Electron项目原CommonJS语法改成使用ES 模块(ESM)语法,preload.js一直加载不到,报错如下:

js 复制代码
VM111 renderer_init:2 Unable to load preload script: D:\Vue\wnpm\electron\preload.js
VM111 renderer_init:2 Error: require() of ES Module D:\Vue\wnpm\electron\preload.js not supported.
Instead change the require of preload.js in null to a dynamic import() which is available in all CommonJS modules.
    at Module._extensions..js (VM53 loader:1424:19)
    at Module.load (VM53 loader:1214:32)
    at Module._load (VM53 loader:1030:12)
    at c._load (VM68 node_init:2:13672)
    at s._load (VM111 renderer_init:2:31018)
    at VM111 renderer_init:2:33087
    at VM111 renderer_init:2:33539
    at ___electron_webpack_init__ (VM111 renderer_init:2:33543)
    at VM111 renderer_init:2:33666
    at BuiltinModule.compileForInternalLoader (VM7 realm:401:7)

解决办法

官方文档找到解决方法
https://www.electronjs.org/zh/docs/latest/tutorial/esm#esm-preload-scripts-must-have-the-mjs-extension

preload.js文件名改成preload.mjs,并且将preload: path.join(__dirname, 'preload.mjs')引用的后缀也要修改,下面是我的代码

js 复制代码
// 创建浏览器窗口
mainWindow = new BrowserWindow({
    width: 1920,
    height: 1080,
    minWidth: 1024,
    minHeight: 768,
    titleBarStyle: 'customButtonsOnHover',
    icon: path.join(__dirname, 'assets', 'logo.ico'), // 设置窗口图标
    frame: false,//设置为 false 时可以创建一个无边框窗口 默认值为 true。        
    center: true,//窗口是否在屏幕居中. 默认值为 false
    show: true, //窗口是否在创建时显示。 默认值为 true。
    webPreferences: {
        nodeIntegration: true, //开启true这一步很重要,目的是为了vue文件中可以引入node和electron相关的API           
        enableRemoteModule: true, // 可以使用remote方法            
        contextIsolation: true, // 可以使用require方法
        preload: path.join(__dirname, 'preload.mjs')
    }
});

引用其它链接

  • 升级至electron@^28.0.0
  • 简单地在package.json中添加"type": "module",
  • 把所有.js 文件中的require, module.exports 改成 import from , export 语法。(除了preload.js)
  • 注意,esmimport语法中,文件后缀名.js不再能省略,必须显式提供。
  • 注意,esm中普通成员要用export { myFunc } 的方式提供。

如果你也要转ESM可以参数链接

相关推荐
随风一样自由8 小时前
【前端独角兽】刚进入前端领域的前端开发用jQuery还是Vue3?
前端·javascript·vue3·jquery
月走乂山8 小时前
Anything Analyzer MCP 401 Unauthorized 故障排查
electron·故障排查·mcp·claude code·anything analyzer
IMPYLH8 小时前
HTML 的 <data> 元素
前端·html
YHHLAI9 小时前
[特殊字符] 面试中的 Promise —— 从入门到精通
前端·javascript·面试
weixin_BYSJ19879 小时前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php
沪飘大军10 小时前
ll-llm:一个零依赖、可插拔的 OpenAI 兼容 LLM 代理
javascript
kyriewen11 小时前
我扒了 GPT-5.6 的全部编程跑分——有一项 OpenAI 没敢放出来
前端·gpt·ai编程
前端H11 小时前
微前端 v3 架构升级:从加载隔离到状态协同
前端·架构·状态模式
山河木马12 小时前
GPU自动处理专题3-NDC怎么映射成屏幕像素坐标(视口变换)
javascript·webgl·图形学
陆枫Larry13 小时前
小程序包体积优化:用 SVG 图片替换 iconfont,并保留 CSS 控色能力
前端