Electron中使用TypeScript的UtilityProcess报错:无法在模块外使用import语句
解决方案
问题根源
你当前的UtilityProcess.fork调用方式有误:直接传入.ts文件时,Node.js会尝试原生执行TypeScript代码,既不会自动调用ts-node,也无法识别ES模块语法,导致import语句报错。
正确实现方式
方式一:通过ts-node直接执行脚本
调整UtilityProcess.fork的参数,让子进程用ts-node解析并运行TypeScript脚本:
import { UtilityProcess } from 'electron'; import path from 'path'; import { fileURLToPath } from 'url'; // 处理ES模块下的路径定位(主进程用ES模块时需添加) const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const electronProcess = UtilityProcess.fork( // 指定ts-node的可执行文件路径 require.resolve('ts-node'), // 传递ts-node参数与目标脚本路径 ['--esModuleInterop', '--project', path.join(__dirname, 'tsconfig.json'), path.join(__dirname, 'backgroundScript.ts')], { detached: true, stdio: 'ignore', cwd: __dirname, // 传递环境变量确保ts-node读取正确配置 env: { ...process.env, TS_NODE_PROJECT: path.join(__dirname, 'tsconfig.json') } } ); electronProcess.start();
方式二:预编译TypeScript脚本(生产环境推荐)
将后台脚本加入electron-react-boilerplate的编译流程,先编译为JavaScript再启动:
- 修改项目
tsconfig.json,确保后台脚本被纳入编译范围:
{ "include": [ "src/main/backgroundScript.ts", // 保留原有include路径 ] }
- 编译完成后,fork生成的JavaScript文件:
import { UtilityProcess } from 'electron'; import path from 'path'; const electronProcess = UtilityProcess.fork( path.join(__dirname, 'backgroundScript.js'), // 编译后的脚本路径 [], { detached: true, stdio: 'ignore', cwd: __dirname } ); electronProcess.start();
额外配置检查
- 若后台脚本使用ES模块语法(
import/export),需在脚本所在目录的package.json中添加:{ "type": "module" } - 确保
ts-node和typescript已安装为项目依赖:npm install ts-node typescript --save-dev
内容的提问来源于stack exchange,提问作者Peter Stjernholm Meldgaard
相关产品推荐
相关产品推荐

