Я хочу создать приложение Electron с синтаксисом импорта ES6, чтобы я мог повторно использовать модули между моим Node.js и JS на стороне браузера без дублирования кода, и обнаружил, что Electron разочаровывает в поддержке синтаксиса ES6.
Я узнал об этом волшебном решении только для того, чтобы обнаружить, что оно больше не поддерживается.
Так что Бабель спешит на помощь, по крайней мере, я так думал. Google не очень плодотворен в отношении учебных пособий по Babel + Electron. Я также хотел закинуть Nodemon.
Вот моя установка:
Пакет.json
{
"name": "infinitum",
"version": "1.0.0",
"description": "",
"main": "compiled.js",
"directories": {
"test": "tests"
},
"scripts": {
"start": " electron .",
"compile": "nodemon --exec babel-node app.js --out-file compiled.js"
},
"author": "",
"license": "ISC",
"devDependencies": {
"@babel/core": "^7.12.10",
"@babel/node": "^7.12.10",
"@babel/preset-env": "^7.12.11",
"electron": "^11.1.0",
"nodemon": "^2.0.6"
}
}
Как вы увидите в следующих журналах вывода и отладки, проблема здесь в том, что мы пытаемся скомпилировать модуль node для использования синтаксиса ES6, но любое приложение Electron зависит от модуля Electron, который, похоже, не экспортируется в традиционный способ, разрешающий исполняемый путь электрона (строку) вместо модуля Node.js. Это круговая проблема.
App.js
import {app, BrowserWindow} from 'electron'
import 'url'
import 'path'
let win
function createWindow() {
win = new BrowserWindow({width: 800, height: 600})
win.loadURL(url.format ({
pathname: path.join(__dirname, 'index.html'),
protocol: 'file:',
slashes: true
}))
}
app.on('ready', createWindow)
.babelrc
{
"presets": [
"@babel/preset-env"
]
}
Я бегу:
npm run compile
Что дает ошибку:
C:\Users\jonat\documents\github\infinitum\app.js:23
_electron.app.on('ready', createWindow);
^
TypeError: Cannot read property 'on' of undefined
at Object.<anonymous> (C:\Users\jonat\documents\github\infinitum/app.js:16:5)
at Module._compile (internal/modules/cjs/loader.js:1076:30)
at Module._compile (C:\Users\jonat\Documents\GitHub\infinitum\node_modules\pirates\lib\index.js:99:24)
at Module._extensions..js (internal/modules/cjs/loader.js:1097:10)
at Object.newLoader [as .js] (C:\Users\jonat\Documents\GitHub\infinitum\node_modules\pirates\lib\index.js:104:7)
at Module.load (internal/modules/cjs/loader.js:941:32)
at Function.Module._load (internal/modules/cjs/loader.js:782:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
at Object.<anonymous> (C:\Users\jonat\Documents\GitHub\infinitum\node_modules\@babel\node\lib\_babel-node.js:172:21)
at Module._compile (internal/modules/cjs/loader.js:1076:30)
Итак, для отладки я попробовал это app.js:
import electron from 'electron'
console.info("typeof electron:", typeof electron, "\nelectron:", electron)
Выход:
typeof electron: string
electron: C:\Users\jonat\documents\github\infinitum\node_modules\electron\dist\electron.exe
И в качестве дополнительного пояснения, app.js выглядит следующим образом:
import * as name from 'electron'
console.info({ name })
Журналы:
{
name: {
default: 'C:\\Users\\jonat\\documents\\github\\infinitum\\node_modules\\electron\\dist\\electron.exe'
}
}
Я понимаю, что это, вероятно, потому, что "электрон". делает что-то особенное в конвейере синтаксического анализа. Но я определенно слышал, что Babel является решением для использования синтаксиса импорта ES6 в Electron, я просто не могу найти фактическое руководство по этому. Итак, как я могу использовать Babel с Electron?
@DaveNewton Спасибо за знания, но если мне нужно использовать модуль с именем electronic-react-boilerplate в проекте без реакции, просто чтобы использовать синтаксис импорта ES6, я мог бы вместо этого просто закодировать приложение на ассемблере. Я бы прошел через такое же количество времени / неприятностей и сохранил бы немного достоинства.
@ J.Todd Забавно, но неправда :) Моя точка зрения, как я уже сказал, заключается в том, что это хорошая отправная точка для понимания настройки, поскольку она использует ES6. Может быть, просто вытащите материалы, связанные с React.
Webpack хорошо работает для меня в электронных проектах, использующих javascript или машинописный текст. Может стоит посмотреть.
Я думаю, проблема в том, что вы используете babel-node. babel-node — это клон node cli, который выполняет преобразования Babel перед выполнением кода JS. Это не компилятор. Для этого кли не определен флаг --out-file. Жаль, что не предупреждает за использование нераспознанного флага.
Чтобы скомпилировать файлы ES6, вам нужно использовать babel cli. Замена babel-node на babel в вашей compile задаче должна помочь.
Также вам нужно заменить синтаксис импорта на import * as ... from ...:
import * as url from 'url'
import * as path from 'path'
Вы также можете проверить превью Electron 12. Они поддерживают Node 14, который поддерживает модули ES. Так что, когда выйдет Electron 12, теоретически можно будет использовать модули ES без Babel.
Похоже, Electron до сих пор не добавил поддержку ES. Сейчас у нас версия 21, я использую версию 17.
IIRC I переключился на шаблон электронной реакции после фиаско с электронной подделкой. Я наложил на него кучу вещей, но это решило насущные проблемы — возможно, это не то, что вы ищете, но это, безусловно, хорошая отправная точка.