Aplikacja Angular w Electronie nie ładuje się po odświeżeniu strony

0

Cześć!

Mam mały problem z aplikacją angularową opakowaną Electronem. O ile udało mi się bez większych trudności uruchomić podstawowy projekt o tyle mam problem podczas odświeżania. Wyświetla mi się błąd:
(node:22340) electron: Failed to load URL: file:///C:/repos/angular-electron/dist/angular-electron/ with error: ERR_FILE_NOT_FOUND
I tak - widzę oczywiście, że ma jakiś problem ze ścieżkami i taki był też na samym początku ale poprawiłem podczas budowania baseUrl i aplikacja normalnie się uruchamia. Problem pojawia się dopiero jak odświeżę przez ctrl+R.
Tutaj kawałek mojej konfiguracji:

  "name": "angular-electron",
  "author": "Author",
  "description": "sample project",
  "version": "0.0.0",
  "main": "main.js", 
  "scripts": {
    "ng": "ng",
    "start-web": "ng serve",
    "start": "electron-forge start",
    "build": "ng build",
    "watch": "ng build --watch --configuration development",
    "test": "ng test",
    "electron": "electron",
    "electron-build": "ng build --base-href ./ && npm run electron --trace-warnings .",
    "package": "electron-forge package",
    "make": "electron-forge make"
  },
  "private": true,

main.js:

const {app, BrowserWindow} = require('electron')
const url = require("url");
const path = require("path");

let mainWindow

function createWindow () {
mainWindow = new BrowserWindow({
  width: 800,
  height: 600,
  webPreferences: {
    nodeIntegration: true
  }
})

mainWindow.loadURL(
  url.format({
    pathname: path.join(__dirname, `/dist/angular-electron/index.html`),
    protocol: "file:",
    slashes: true
  })
);
// Open the DevTools.
mainWindow.webContents.openDevTools()

mainWindow.on('closed', function () {
  mainWindow = null
})
}

app.on('ready', createWindow)

app.on('window-all-closed', function () {
if (process.platform !== 'darwin') app.quit()
})

app.on('activate', function () {
if (mainWindow === null) createWindow()
})

Drzewo z wynikiem budowania:
screenshot-20230803142028.png
Index.html (widać poprawiony base href):

<!doctype html>
<html lang="en" data-critters-container>
<head>
<meta charset="utf-8">
<title>AngularElectron</title>
<base href="./">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
<link rel="stylesheet" href="styles.ef46db3751d8e999.css"></head>
<body>
<app-root></app-root>
<script src="runtime.4da1346d407a9b33.js" type="module"></script><script src="polyfills.561062d69280f423.js" type="module"></script><script src="main.98e824e32420cf23.js" type="module"></script></body>
</html>

Electron Forge buduje mi .exe który zachowuje się identycznie - uruchamia się prawidłowo ale po odświeżeniu nic się nie pojawia. Poniżej screeny z odpalonej apki -> w terminalu vscode nie ma żadnych błędów dopóki nie odświeżę.

screenshot-20230803142253.pngscreenshot-20230803142305.png

Będę wdzięczny za jakiekolwiek wskazówki bo to wygląda na ewidentny problem ze ścieżkami ale objawia się on bardzo dziwnie skoro za pierwszym uruchomieniem aplikacji wszystko jest w porządku.

Pozdrawiam,
Dawid.

0
 path.join(__dirname, `/dist/angular-electron/index.html`)

co ci zwraca ten kod? path.join uwzględnia platformę (tutaj Windows jak rozumiem, skoro ścieżka ci się zaczyna od C:) https://nodejs.org/api/path.html#pathjoinpaths
czyli jak rozumiem na windowsach połączy ci za pomocą \, skoro piszą, że separator specyficzny dla platformy?

Pytanie więc, czy całość:

mainWindow.loadURL(
  url.format({
    pathname: path.join(__dirname, `/dist/angular-electron/index.html`),
    protocol: "file:",
    slashes: true
  })
);

będzie miało sens i będzie poprawnie odczytane w kontekście adresu URL?

0

Jeśli wywołamy metodę path.join w taki sposób

path.join(__dirname, 'dist', 'angular-electron', 'index.html');

to sama powinna uzupełnić /, \ w zależności od platformy


Można spróbować zapisać to w taki sposób (https://github.com/maximegris/angular-electron/blob/main/app/main.ts#L41)

const url = new URL(path.join('file:', __dirname, 'dist', 'angular-electron', 'index.html'));
win.loadURL(url.href);

chociaż nie wiem, czy pomoże.

1
Xarviel napisał(a):

Jeśli wywołamy metodę path.join w taki sposób

path.join(__dirname, 'dist', 'angular-electron', 'index.html');

to sama powinna uzupełnić /, \ w zależności od platformy


Można spróbować zapisać to w taki sposób (https://github.com/maximegris/angular-electron/blob/main/app/main.ts#L41)

const url = new URL(path.join('file:', __dirname, 'dist', 'angular-electron', 'index.html'));
win.loadURL(url.href);

chociaż nie wiem, czy pomoże.

URL z backslashami jest niepoprawny. Czasami jest akceptowany przez niektórych klientów, ale ogólnie to tylko / jest poprawny w URL. Nawet jak otwierasz file:/// na Windowsie, to i tak mają być /.

0
LukeJL napisał(a):
 path.join(__dirname, `/dist/angular-electron/index.html`)

co ci zwraca ten kod? path.join uwzględnia platformę (tutaj Windows jak rozumiem, skoro ścieżka ci się zaczyna od C:) https://nodejs.org/api/path.html#pathjoinpaths
czyli jak rozumiem na windowsach połączy ci za pomocą \, skoro piszą, że separator specyficzny dla platformy?

Pytanie więc, czy całość:

mainWindow.loadURL(
  url.format({
    pathname: path.join(__dirname, `/dist/angular-electron/index.html`),
    protocol: "file:",
    slashes: true
  })
);

będzie miało sens i będzie poprawnie odczytane w kontekście adresu URL?

LukeJL - console.log(path.join(__dirname, `/dist/angular-electron/index.html`)) zwraca
C:\repos\angular-electron\dist\angular-electron\index.html więc faktycznie uwzględnia platformę w prawidłowy sposób. Ale czy nas nie powinien urządzać bardziej względny URL?

Xarviel napisał(a):

Jeśli wywołamy metodę path.join w taki sposób

path.join(__dirname, 'dist', 'angular-electron', 'index.html');

to sama powinna uzupełnić /, \ w zależności od platformy


Można spróbować zapisać to w taki sposób (https://github.com/maximegris/angular-electron/blob/main/app/main.ts#L41)

const url = new URL(path.join('file:', __dirname, 'dist', 'angular-electron', 'index.html'));
win.loadURL(url.href);

chociaż nie wiem, czy pomoże.

Xarviel - path.join(__dirname, 'dist', 'angular-electron', 'index.html'); zwraca poprawnie jw.
Z kolei to:

const url = new URL(path.join('file:', __dirname, 'dist', 'angular-electron', 'index.html'));
mainWindow.loadURL(url);

Powoduje poniższy błąd:
screenshot-20230804082902.png

0

poprawnie dla Windowsów to przypuszczam, że może być niepoprawnie, jeśli chodzi o url.

1
dawid75_75 napisał(a):
const url = new URL(path.join('file:', __dirname, 'dist', 'angular-electron', 'index.html'));
mainWindow.loadURL(url);

Nie powinieneś tak robić, mówiłem Ci że path.join() doda backslashe do ścieżki na windowsie, a w URL poprawne są tylko slashe.

Użyj

const path = require('path');
const url = require('url');

const indexPath = path.join('dist', 'angular-electron', 'index.html');
console.log(url.pathToFileURL(indexPath));

url.pathToFileURL() zwróci Ci obiekt url, użyj jego atrybutu .href, i to możesz wsadzić do swojego main.loadURL().

0
Riddle napisał(a):
dawid75_75 napisał(a):
const url = new URL(path.join('file:', __dirname, 'dist', 'angular-electron', 'index.html'));
mainWindow.loadURL(url);

Nie powinieneś tak robić, mówiłem Ci że path.join() doda backslashe do ścieżki na windowsie, a w URL poprawne są tylko slashe.

Użyj

const path = require('path');
const url = require('url');

const indexPath = path.join('dist', 'angular-electron', 'index.html');
console.log(url.pathToFileURL(indexPath));

url.pathToFileURL() zwróci Ci obiekt url, użyj jego atrybutu .href, i to możesz wsadzić do swojego main.loadURL().

Niestety ten sam rezultat:

  const indexPath = path.join('dist', 'angular-electron', 'index.html');
  console.log(indexPath);

  const pathToFileURL = url.pathToFileURL(indexPath)
  console.log({pathToFileURL});
  console.log(pathToFileURL.href);
  
  mainWindow.loadURL(pathToFileURL.href);

Wydruk konsoli:

> electron .


dist\angular-electron\index.html
{
  pathToFileURL: URL {
    href: 'file:///C:/repos/angular-electron/dist/angular-electron/index.html',
    origin: 'null',
    protocol: 'file:',
    username: '',
    password: '',
    host: '',
    hostname: '',
    port: '',
    pathname: '/C:/repos/angular-electron/dist/angular-electron/index.html',
    search: '',
    searchParams: URLSearchParams {},
    hash: ''
  }
}
file:///C:/repos/angular-electron/dist/angular-electron/index.html
(node:21748) electron: Failed to load URL: file:///C:/repos/angular-electron/dist/angular-electron/ with error: ERR_FILE_NOT_FOUND
(Use `electron --trace-warnings ...` to show where the warning was created)

Tak jeszcze patrzę czy czegoś nie pomieszałem przy przepisywaniu ale chyba przekleiłem 1:1 to co proponowałeś.

0

Próbowałeś używać tego?

https://github.com/maximegris/angular-electron

0
Riddle napisał(a):

Próbowałeś używać tego?

https://github.com/maximegris/angular-electron

Tak - zanim jeszcze napisałem post :D i jest dokładnie to samo.

0

a tam w pierwszym poście masz Electron Security Warning. Jak rozumiem sprawdziłeś, co to znaczy i z czego to wynika?

0
LukeJL napisał(a):

a tam w pierwszym poście masz Electron Security Warning. Jak rozumiem sprawdziłeś, co to znaczy i z czego to wynika?

Ano sprawdziłem :P I znowu dzieją się ciekawe rzeczy. Dodałem meta tag: https://www.electronjs.org/docs/latest/tutorial/security#7-define-a-content-security-policy i zniknęło podczas uruchamiania z poziomu Visual Studio Code:
screenshot-20230807092230.png

Po odświeżeniu stary problem:
screenshot-20230807092754.png
W ogóle nie zgadza się URL w zakładce sieci. Podczas startu pobiera z dysku CSS, a po odświeżeniu URL prowadzi do folderu (???). To ewidentnie jakiś trop ale jestem nowy w tym electronie i nie wiem czy istnieje jakaś dodatkowa konfiguracja w tym obszarze.

0

Poszukałem jeszcze trochę i znalazłem coś takiego: https://stackoverflow.com/questions/46917738/angular-electron-white-screen-after-reload-page/68129037#68129037 => https://github.com/maximegris/angular-electron/issues/15
Po odświeżeniu nawet pokazuje się komplet plików w sieciach. Prawdę powiedziawszy jestem wstrząśnięty & niezmieszany czy to jest bug i jego obejście czy jakiś krzywy workaround.

screenshot-20230807101411.png

1 użytkowników online, w tym zalogowanych: 0, gości: 1