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

问题

将Electron项目原CommonJS语法改成使用ES 模块(ESM)语法,preload.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')引用的后缀也要修改,下面是我的代码

// 创建浏览器窗口
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可以参数链接

`electron-builder` 是一个强大的工具,用于自动化构建跨平台的 Electron 应用。如果你在打包后发现 preload.js 文件引用的 Node.js 模块没有被打包进去,可能会遇到以下问题: 1. **预加载脚本配置**:preload.js 是一个在渲染进程中预先加载的脚本,主要用于注入全局变量、API 等。确保你在项目配置文件(如 `package.json` 或 `.builderconfig.js`)中正确设置了 `preload` 和 `webPreferences` 参数,将 preload.js 添加进列表中。 ```json { "build": { "preload": ["preload.js"], "webPreferences": { "nodeIntegration": true, // 如果 preload.js 需要用到 Node.js 模块,这里应该开启 nodeIntegration "contextIsolation": false } } } ``` 2. **文件路径问题**:确认 preload.js 的路径是否正确,它应该位于项目的根目录或是 `src` 或者指定的目录内。如果不是,你需要调整路径或更新 `preload` 配置。 3. **打包配置**:检查你的构建配置,确保 Node.js 模块在 `asar` 中被正确处理。默认情况下,Electron Builder 只打包 `node_modules` 下直接依赖于主进程的模块,如果模块不是直接依赖,可能需要添加配置使其被打包。查阅 `electron-builder` 文档关于 `asar.unpack` 或 `files` 的部分。 4. **模块打包策略**:有些第三方库可能需要手动处理才能被打包,比如使用 `file-loader` 或者 `copy-webpack-plugin` 这样的插件来复制文件。 5. **检查打包日志**:查看打包过程中是否有错误提示,它们可以帮助你定位问题所在。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值