Как использовать Babel с Electron?

Я хочу создать приложение 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?

IIRC I переключился на шаблон электронной реакции после фиаско с электронной подделкой. Я наложил на него кучу вещей, но это решило насущные проблемы — возможно, это не то, что вы ищете, но это, безусловно, хорошая отправная точка.

Dave Newton 21.12.2020 19:10

@DaveNewton Спасибо за знания, но если мне нужно использовать модуль с именем electronic-react-boilerplate в проекте без реакции, просто чтобы использовать синтаксис импорта ES6, я мог бы вместо этого просто закодировать приложение на ассемблере. Я бы прошел через такое же количество времени / неприятностей и сохранил бы немного достоинства.

J.Todd 21.12.2020 19:15

@ J.Todd Забавно, но неправда :) Моя точка зрения, как я уже сказал, заключается в том, что это хорошая отправная точка для понимания настройки, поскольку она использует ES6. Может быть, просто вытащите материалы, связанные с React.

Dave Newton 21.12.2020 19:21

Webpack хорошо работает для меня в электронных проектах, использующих javascript или машинописный текст. Может стоит посмотреть.

Rhayene 22.12.2020 14:04
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Раскрытие чувствительных данных
Раскрытие чувствительных данных
Все внешние компоненты, рассмотренные здесь до сих пор, взаимодействуют с клиентской стороной. Однако, если они подвергаются атаке, они не...
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Руководство ChatGPT по продаже мини JS-файлов
Руководство ChatGPT по продаже мини JS-файлов
JS-файл - это файл, содержащий код JavaScript. JavaScript - это язык программирования, который в основном используется для добавления интерактивности...
5
4
3 942
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, проблема в том, что вы используете 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.

bdotsamir 19.10.2022 20:24

Другие вопросы по теме