๋ชจ๋ main.js ์คํฌ๋ฆฝํธ์ ํด๋น ์ข ์์ฑ์ ๋จ์ผ ํ์ผ๋ก ์นํฉํ๋ ค๊ณ ํฉ๋๋ค(UI ์ฑ์ฉ ํ์ผ ํ๋์ ์๋ฒ ์ฑ์ฉ ํ์ผ ํ๋๋ฅผ ๊ฐ๊ณ ์ถ์ต๋๋ค).
์ผ๋ฐ ์์ค๋ฅผ ์ฌ์ฉํ๋ฉด index.html์ด ์ ๋๋ก ๋ก๋๋ฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์นํจํน์ ํ๋ฉด ์ ๋ชฉ์์ ์ธ๊ธํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ด๊ฐ ์ฌ์ฉํ webpack ๊ตฌ์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
webpack({
entry: [
'./main'
],
output: {
path: path.join(__dirname, 'asar'),
filename: 'main.js',
libraryTarget: 'commonjs2'
},
externals: ['electron'],
target: 'node'
});
๋ค์๊ณผ ๊ฐ์ด ํ์ผ์ ๋ก๋ํฉ๋๋ค.
mainWindow.loadURL('file://' + __dirname + '/index.html');
๋ก์ปฌ ํ์ผ์ ์ ๊ณตํ ์ ์๋ ์ ์ ์ปจํ ์คํธ ์ธ๋ถ์ webpack ํธ์ถ/ํ๊ฐ ํญ๋ชฉ ๋๋ฌธ์ผ ์ ์์ต๋๋ค.
์ด๋ค ์์ด๋์ด/์ ์์ด ์์ต๋๊น? ๊ฐ์ฌ ํด์!
webPreferences
of BrowserWindow
webSecurity
๋๊ธฐ๋ฅผ ์๋ํ ์ ์์ต๋๋ค. ๋ ๋ง์ ์ง๋ฌธ์ ๋ํด์๋ ์ปค๋ฎค๋ํฐ ์์ ๋์์ ๊ตฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@MihaiValentin ์ด๋ด, ์ด๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ฐพ์์ต๋๊น?
@MihaiValentin @singhshashi ์ ๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก webpack์ __dirname
์ ๊ฐ์ Node ์ ์ญ์ "์กฐ๋กฑ"ํ๋ ค๊ณ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. node.__dirname
์ต์
์ ์ฌ์ฉํ์ฌ ์ด ๋์์ ๋นํ์ฑํํ๊ณ โฆ ์๋ํ์ต๋๋ค!
๋ง์ผ์ ๋๋นํ์ฌ target
์ต์
์ webpack-target-electron-renderer ๋ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์ด๊ฒ์ ์ง๊ธ๊น์ง ๋ด ๊ตฌ์ฑ์ ๋๋ค. ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
var webpack = require('webpack');
var path = require('path');
var webpackTargetElectronRenderer = require('webpack-target-electron-renderer');
var BUILD_DIR = path.resolve(__dirname, 'build');
var APP_DIR = path.resolve(__dirname, 'src');
var config = {
entry: APP_DIR + '/index.js',
output: {
path: BUILD_DIR,
filename: 'index.js'
},
node: {
__dirname: false,
__filename: false
},
module : {
loaders : [
{
test : /\.jsx?/,
include : APP_DIR,
exclude: /node_modules/,
loader : 'babel'
}
]
}
};
config.target = webpackTargetElectronRenderer(config);
module.exports = config;
@eiriart ๊ณต์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊ทธ๋ฌ๋ ์๋ํ์ง ์์์ต๋๋ค. webpack์ ์ฌ์ฉํ์ฌ ๋ฉ์ธ ํ๋ก์ธ์ค์ ๋ํ ํ์ผ์ ์์ถํ๋ฉด ๋ง์ํ์ ๋ ธ๋ ๊ตฌ์ฑ์๋ ๋ถ๊ตฌํ๊ณ ์ฌ์ ํ ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด ์ค๋ ๋์ ๋์ฐฉํ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ฌ์ฉํ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ณต์ ํ๊ณ ์์ต๋๋ค.
๊ธฐ๋ณธ์์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋ ค๋ฉด babel์ ๋ณํํด์ผ ํ๋ es ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๋์ . js ํ์ผ์์ ์ด๊ฒ์ ๋ค๋ฅธ ํ์ผ๋ก ๋ถ๋ฆฌํ์ต๋๋ค. ๋ด main.js์์๋ babel ๋ณํ์ด ํ์ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๊ทธ๋์ import ๋์ require๋ฅผ ์ฌ์ฉํฉ๋๋ค. async์ ๊ฐ์ es7 ์ ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ์ฝ๋์ ๊ฒฝ์ฐ ํด๋น ์ฝ๋๋ฅผ desktopServices๋ผ๋ ํด๋ ๋ด์ ๋ค๋ฅธ ํ์ผ๋ก ์ฎ๊ฒผ์ต๋๋ค(๋ ๋์ ์ด๋ฆ์ ์ฐพ์ ์ ์์). ์ด์ webpack์ ์คํํ์ฌ desktopServices์ฉ ๋ฒ๋ค์ ์์ฑํ๊ณ ์ด ๋ฒ๋ค์ main.js์์ ์ฐธ์กฐํฉ๋๋ค.
const myshell = require('./dist/desktopServices').myShell
;
๋ด webpack.config.main.js ํ์ผ์๋ ๋ค์ ๊ตฌ์ฑ์ด ํฌํจ๋์ด ์์ต๋๋ค.
let config = {
target:'electron',
entry:'./desktopServices/desktopServices.js',
output:{
path:path.resolve(__dirname, 'dist'),
filename: 'desktopServices.js',
publicPath:'/dist/',
libraryTarget:'commonjs2'
},
resolve: {
extensions:["",".js",".json"]
},
module: {
noParse: /node_modules\/json-schema\/lib\/validate\.js/,
loaders:[{
test: /\.js?$/,
exclude: /node_modules/,
loader: 'babel-loader'
},
{
test: /\.json/,
loader: 'json-loader',
},
],
},
}
module.exports = config;
๊ฐ์ฅ ๊นจ๋ํ ๋ฐฉ๋ฒ์ ์๋์ง๋ง ์ฌ์ฉํ๋ ค๋ es ๊ธฐ๋ฅ ์ค ์ผ๋ถ๊ฐ ๋ ธ๋์ ํตํฉ๋๊ณ babel ๋ณํ์ด ํ์ํ์ง ์์ ๋๊น์ง ๋น๋ถ๊ฐ ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ฅผ ์ํด, ๊ทธ๊ฒ์ ์คํด์ ์์ง๊ฐ ์๋ ์ค๋ฅ๋ก ํ๋ช
๋์์ต๋๋ค. not allowed to load local resource
์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ์ด์ ๋ webpack์ด ํ์ผ์ ๋ก๋ํ๋ ค๊ณ ํ๊ธฐ ์ ์ ํ์ผ ์ฐ๊ธฐ๋ฅผ ์๋ฃํ์ง ์์๊ธฐ ๋๋ฌธ์
๋๋ค. ์๋ชป๋ ๊ถํ์ด ์๊ธฐ ๋๋ฌธ์ด ์๋๋๋ค.
setTimeout
(์๋ฐ์คํฌ๋ฆฝํธ์ ๋ํธ ํ
์ดํ)๋ก ~๊ณ ์ ~ํฌ์ฅํ์ฌ ๊ณ์ ์ํํ ์ ์๋๋ก ํ์ต๋๋ค.
setTimeout(() => {
win.loadURL(`file:///${__dirname}/index.html`);
}, 2000); // 1 second wasn't enough lol
๋๋ฅผ ์ํด .. ๊ทธ ์ด์ ๋ ์นํฉ์ด ๋ฒ๋ค์ ์ถ๋ ฅํ๋ ๊ฒฝ๋ก๊ฐ .. ์์ด ๋ฟ์ง ์์๊ธฐ ๋๋ฌธ์ ๋๋ค ... ๋ช ๊ฐ์ ๋๋ ํ ๋ฆฌ๋ก ๋์์์ ์์์ ์ ์ํ๋๋ก ๋ ธ๋ ๊ตฌ์ฑ์ ์ ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค :D
pathname: path.join(__dirname, '../../source/resources/views', 'index.html');
node: {
__dirname: false,
__filename: false
},
์ฐธ๊ณ ๋ก ์ฌ๊ธฐ google์ ํตํด: ํ์ผ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ ์ ํฌ์ฅ๊ธฐ์์ ๋์ ํ์ผ์ ์ฑ์ ๋ณต์ฌํ๋๋ก ์ง์ํ๋ ๊ฒ์ ์์์ต๋๋ค. ๋ด ์ด๋ฆฌ์์ ์ค์์์ ๋ฐฐ์ฐ์ญ์์ค :)
๋์ค์ ์ฐธ์กฐํ ์ ์๋๋ก(์ด ํ์ด์ง๋ฅผ ๋๋ฌด ๋ง์ด ๊ฒ์ํ๊ธฐ ๋๋ฌธ์) ํ์ฌ ๊ฐ๋ฅํ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ์ผ์ด ์กด์ฌํ์ง ์๊ฑฐ๋ Node ์ ํ๋ฆฌ์ผ์ด์
์ด ํ์ผ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. electron-packager
๊ฐ ๋์ ํ์ผ์ ์ฑ์ ๋ณต์ฌํ๋์ง ํ์ธํ์ญ์์ค!
BrowserWindow()
๋ฅผ ๋ง๋ค ๋ webPreferences
webSecurity
๋ฅผ ๋นํ์ฑํํด์ผ ํ ์๋ ์์ต๋๋ค.
{
webPreferences: {
webSecurity: false
}
}
node.__dirname
์ ๊ฐ์ ๋
ธ๋ ์ ์ญ์ "์กฐ๋กฑ"ํ๋ ค๊ณ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ตฌ์ฑ์ ๋ค์์ ์ถ๊ฐํ์ฌ ์ด๋ฅผ ๋นํ์ฑํํ ์ ์์ต๋๋ค. node: {
__dirname: false
}
setTimeout()
๋ฅผ ์ฌ์ฉํ์ฌ URL ๋ก๋ ์คํ์ ์ง์ฐํ๊ฑฐ๋(๊ถ์ฅํ์ง ์์) ์ฑ์์ ready
์ด๋ฒคํธ๊ฐ ์ ์ก๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆด ์ ์์ต๋๋ค(๋ ์ข์).setTimeout(() => {
win.loadURL(`file:///${__dirname}/index.html`);
}, 2000); // 1 second wasn't enough lol
app.on('ready', () => {
win.loadURL(`file:///${__dirname}/index.html`);
})
๋๋ฅผ ์ํด ํด๊ฒฐ์ฑ ์
์ด๊ฒ์ด ๋ ๊ฐ์ nube์๊ฒ ๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
webpack dev ์๋ฒ์ฉ ๋ฉ์ธ ๋ธ๋ผ์ฐ์ ์ฐฝ์ http://localhost:8080/
๋ฅผ ๋ก๋ํ๊ณ ์์ต๋๋ค. ๋ฌธ์ ๋ <iframe>
์์ file://
ํ๋กํ ์ฝ๋ก ๋ก๋ํ ๋ ์๋ํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค.
@popey456963 ์ด ์ง์ ํ ๋๋ก ๋จ์ํ ์น ๋ณด์์ ๋นํ์ฑํํ์ต๋๋ค.
electron-main
๋ฐ electron-renderer
์ ๋ํด ๊ฐ๊ฐ ๋ ๊ฐ์ง webpack ๊ตฌ์ฑ์ด ์์ต๋๋ค.
const path = require('path');
const config_main = {
target: 'electron-main',
entry: path.resolve(__dirname, 'src/main/index.js'),
output: {
path : path.resolve(__dirname, 'static'),
filename: 'main.js'
},
externals: [{ 'electron-store': 'require("electron-store")' }],
resolve: {
alias: {
main : path.resolve(__dirname, 'src/main/'),
common : path.resolve(__dirname, 'src/common/')
}
}
};
const config_renderer = {
target: 'electron-renderer',
entry: path.resolve(__dirname, 'src/renderer/index.js'),
output: {
path : path.resolve(__dirname, 'static'),
filename: 'renderer.js'
},
externals: [{ 'electron-store': 'require("electron-store")' }],
resolve: {
alias: {
components : path.resolve(__dirname, 'src/renderer/components/'),
core : path.resolve(__dirname, 'src/renderer/core/'),
states : path.resolve(__dirname, 'src/renderer/states/'),
ui : path.resolve(__dirname, 'src/renderer/ui/'),
common : path.resolve(__dirname, 'src/common/'),
}
}
};
module.exports = [
config_main,
config_renderer
];
์ ์ฒญํด๋ณด์์ต๋๋ค
node: {
__dirname: false
},
๋๋ renderer.js
__dirname
์ ์ฝ์์ ์ถ๋ ฅํ๊ณ ๋ ๊ฒฝ์ฐ ๋ชจ๋ __dirname์ false ๋๋ true๋ก ์ค์ ํ๋ฉด ๋ ๋ค /
๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
๋ฌผ๋ก ์ ๋ URL์ ์๋์ผ๋ก ์
๋ ฅํ๋ฉด ์๋ํ์ง๋ง __dirname
๊ฐ ์ฌ๋ฐ๋ฅธ ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๊ฑฐ๋ถํ๋ ์ด์ ๋ ํ์คํ์ง ์์ต๋๋ค.
webpackTargetElectronRenderer
๋ ๋์๊ณผ ๋์ผํฉ๋๋ค: electron-main
์ด๋ค ์์ ์์ electron-main
๊ฐ webpackTargetElectronRenderer
๋ฅผ ์ ๋์ ์ผ๋ก ๋ง๋๋ webpack์ผ๋ก ๋กค๋ง๋์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฌ๊ธฐ์ electron-main
์ ๊ธฐ๋ฅ์ ๋ณผ ์ ์์ต๋๋ค.
https://github.com/webpack/webpack/blob/master/lib/WebpackOptionsApply.js#L70 -L185
์ฌ๊ธฐ์์ ์ ํํ ๋์ผํ ์ฝ๋๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
https://github.com/chentsulin/webpack-target-electron-renderer/blob/master/index.js
๋ด๊ฐ ๊ฐ์ง๊ณ ์์๋ ๊ฒ์ผ๋ก ๋ฐํ์ก๋ค
node: {
__dirname: false
},
๋ด ๊ธฐ๋ณธ ๊ตฌ์ฑ ๋์ ๋ด ๋ ๋๋ฌ ๊ตฌ์ฑ์์. ๋๊ตฐ๊ฐ ๋ด ๊ตฌ์ฑ ํ์ผ์ ์ข์ํ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ์์ ์ค๋ช ์ ์ ์งํฉ๋๋ค.
์นํฉ์ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด?
@hbgdPro https://github.com/electron/electron/issues/5107#issuecomment -299971806, 1, 2 ๋ฐ 4 ๋ชจ๋ ์นํฉ์ด ํ์ํ์ง ์์ ์ต์ ์ค ์ผ๋ถ๋ฅผ ์๋ํด ๋ณด์ธ์.
@popey456963 ๊ฐ์ฌํฉ๋๋ค. ๋๋ ๋ด๊ฐ ๋ฌป๊ธฐ ์ ์ ์ด๋ฏธ ์๋ํ์๋ค. ๋ด ๋ฌธ์ ๋ ์ค์ ๋ก ๋น๋ ํ๋ก์ธ์ค์ ํฌํจํด์ผ ํ๋ ํด๋๋ฅผ ์ง์ ํด์ผ ํ๋ค๋ ๊ฒ์ด์์ต๋๋ค. ์นํฉ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ ์ง์ ๋ฐ๊ฒฌํ์ต๋๋ค. (์๋
ํ์ธ์. ์ ๋ webpack ํ์์ ์์ต๋๋ค). webpack์ ์ ์ ์ฃผ์ ํ๊ฒ์ด ์๊ณ __dirname
๋ฐ __filename
๋ชจ์๊ฐ ๊ธฐ๋ณธ ๋น ๋ฅธ ์์ ์์ ๋ฅผ ์๋ฐํ๋ค๋ ๊ฒ์ ๋ชฐ๋์ต๋๋ค.
ํ์คํ ํ์๋ฉด, ์ ์ํ. ์ด ๊ธฐ๋ฅ์ ๋นํ์ฑํํ๋ผ๋ ๊ณต์์ ์ธ ๊ถ์ฅ ์ฌํญ์ ๋๊น? ๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ์ ์ ์ฃผ ๋์์ ๋ํ ๊ธฐ๋ณธ๊ฐ์ ํ๋ณดํ์ฌ โโ์ด๋ฌํ ๋ด์ฅ ๊ธฐ๋ฅ์ด ์กฐ๋กฑ๋์ง ์๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ฐ์ฌ ํด์!
@TheLarkInn __dirname
๋ฐ __filename
๋ ๋ ๋๋ฌ ํ๋ก์ธ์ค์ ํ์ํ HTML ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฐ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ์ ์ ์ ์ฑ์์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๊ทธ๋ค์ ์กฐ๋กฑํ๋ ๊ฒ์ ๋๋ถ๋ถ์/ํญ์ ๋ชจ๋ ๊ฒ์ ๋ง๊ฐ๋จ๋ฆฝ๋๋ค. ์กฐ๋กฑํ์ง ์์ผ๋ฉด ๋ง์ ์ฌ๋๋ค์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค ๐
Webpack์ ์ฌ์ฉํ์ง ์๋ ์ฌ๋๋ค์ ์ํด ๋๋ ๋ ๋ง์ ๊ฒฝํ์ ๊ฐ์ง ๋๊ตฐ๊ฐ๊ฐ ์์ธํ ์ค๋ช ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ์ด์ํ ์๋ฃจ์ ์ ์ฐ์ฐํ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋๋ ๋ค์์ ์ฌ์ฉํ๊ณ ์์๊ณ ์ด ์ค๋ ๋ ์ ์ฒด์์ ์ธ๊ธ๋ ์ค๋ฅ๋ฅผ ์์ ํ์ต๋๋ค.
win.loadURL('file://${__dirname}/renderer/main.html')
์์ ์ฝ๋๋ฅผ ๋ค์์ผ๋ก ์ ํํ ํ ์ค๋ฅ๊ฐ ์ฌ๋ผ์ง๊ณ html์ด ๋ ๋๋ง๋ฉ๋๋ค.
win.loadURL('file://' + __dirname + '/renderer/main.html')
์๋ณธ์ด ์ด๋ค ์ด์ ๋ก html ํ์ผ์ ๋ถ์ ์ ํ ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ ๊ฒ ๊ฐ์ต๋๋ค. ์ด์ ๋ฅผ ์๋ ์ฌ๋์ด ์์ต๋๊น?
@s-lawrence ๋ถ์ ์ ํ ๊ฒฝ๋ก๋ ๋ค์์ผ๋ก ์ธํ ๊ฒ์ ๋๋ค.
win.loadURL('file://${__dirname}/renderer/main.html')
ํด์ผํ๋ค
win.loadURL(`file://${__dirname}/renderer/main.html`)
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals
์๊ฒ ์ต๋๋ค. ์ด์ ๋ํด ์์ธํ ์ค๋ช ํ๊ณ ์ฐธ์กฐ๋ฅผ ์ ๊ณตํ @milewski ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋๋ ์ผ๋ฐ์ ์ผ๋ก ์ฐ๊ฒฐ์ ๊ณ ์ํ์ง๋ง ์ด์ ์ ์ ํ ๊ตฌ๋ฌธ์ ์์์ผ๋ฏ๋ก ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ๋ ๋ง์ด ์ฌ์ฉํ๊ธฐ ์์ํ ๊ฒ์ ๋๋ค. ํจ์ฌ ๊น๋ํ ๋ชจ์์ ๋๋ค.
@milewski , ๋ ์ค ๋ํซ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ๋ ๋ฒ์งธ๋ ์ฒซ ๋ฒ์งธ์ ๋ค๋ฅด๋ค๊ณ ํด์ผ ํ ๊น์?
@jakehockey10 ๋ ๋ฒ์งธ๋ ์์ ๋ฐ์ดํ ๋์ ๋ฐฑํฑ์ด ์์ต๋๋ค. ๋ฐฑํฑ์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ด ์๋๋ผ ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด ์์ ๋ํ๋
๋๋ค. ์ฒซ ๋ฒ์งธ ์๋ ์ผ๋ฐ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ด๋ฏ๋ก ${__dirname}
๋ถ๋ถ์ __dirname
๊ฐ์ผ๋ก ๋์ฒด๋์ง ์์ต๋๋ค. ์๋ํฐ๊ฐ ๋ค๋ฅด๊ฒ ๊ฐ์กฐ ํ์ํ์ง ์๋ ๊ฒฝ์ฐ(๋ถํํ๋ GFM ๊ตฌ๋ฌธ ํ๊ดํ์ ์ด๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค) ๋๋๋ก ์์์ฐจ๋ฆฌ๊ธฐ๊ฐ ๊ฝค ์ด๋ ต์ต๋๋ค.
์ ์์์ด. GitHub์ Markdown์์ ๋ณผ ๋ ๊ทธ ์ฐจ์ด๋ฅผ ๋๋ผ์ง ๋ชปํ์ง๋ง Visual Studio Code๋ฅผ ์ฌ์ฉํ๊ณ ์ธ๊ธํ ๋๋ก ์ฐจ์ด์ ์ ํ์คํ ์ ์ ์์ต๋๋ค. ์๋ชป๋ ์๋ ์ฃ์กํฉ๋๋ค ;-)
๋ด๊ฐ ์ถ๊ฐ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ๋ด ์ค์๋ก ์ธํด์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค (์บก ๊ฐ๋)
ํ์ผ ์ด๋ฆ์ด ๋ชจ๋ ์๋ฌธ์์ผ ๋ pathname: path.join(__dirname, 'Views/settingsWindow.html')
๋ฅผ ํธ์ถํ์ต๋๋ค.
์ด๊ฒ์ ์นํฉ์ด ๋ ํ์๋ง ์ค๋ฅ๋ฅผ ์ผ์ผ์ผฐ์ต๋๋ค.
๋ช ๊ฐ์ง ์๋ฃจ์
์ ์๋ํ์ง๋ง ์๋ํ์ง ๋ชปํ์ต๋๋ค([email protected]๊ณผ ํจ๊ป [email protected] ์ฌ์ฉ).
๊ฒ์๋ฌผ์์ ๋จ 3ํ๋ง ์ป์ ์ต๊ณ ์ ์๋ฃจ์
์ ์ฐพ์์ต๋๋ค. SO: ์ด ํจํค์ง๊ฐ ํ์ํ์ง ์์ต๋๋ค!
https://stackoverflow.com/questions/45041364/angular-electron-webpack-live-reloading
๊ตฌ์ฑ ๋ฒ๊ฑฐ๋ก์ ์๋ ์๋ฃจ์
:
-npm ์ ์ ์ฌ์ฅ์ ์ ๊ฑฐ
- ํ๋์ ํฐ๋ฏธ๋์์ ng serve ์คํ
-main.js์์ win.loadURL ๋ณ๊ฒฝ( http://localhost:4200/index.html
);
-๊ทธ๋ฐ ๋ค์ ๋ค๋ฅธ ํฐ๋ฏธ๋์์ npm run electron์ ์คํํ์ญ์์ค.
๊ทธ๋ฅ ์๋
๋๋ ํ๋ฃจ ์ข
์ผ ์ด๊ฒ์ ๊ณ ์น๋ ค๊ณ ๋
ธ๋ ฅํ๊ณ ๋ง์นจ๋ด์ด ์ฌ๋๋ค์ ์๋ฃจ์
์ด ์๋ํ์ต๋๋ค.
https://github.com/electron-userland/electron-builder/issues/2955#issuecomment -393524832
package.json์์ "build" ์์ฑ์ ์ ์ํ ๋ ๋ค์๊ณผ ๊ฐ์ด ํ์ํ ํ์ผ์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
"files": [
"./build/**/*",
"./index.html",
"./src/*.js"
],
๊ทธ๋ฌ๋ฉด ์ ์ ๊ฑด์ถ์ ์๊ฐ ๊ทธ๊ฒ์ ์ฌ๋ฐ๋ฅด๊ฒ ํฌ์ฅํ ๊ฒ์ ๋๋ค.
loadUrl ๋ฉ์๋์ ํ์ํ ๊ฒ์ 'file://' ์ ๋์ฌ๋ฟ์ด์์ต๋๋ค.
๊ฐ์ก๋ค:
win.loadUrl(path.join(__dirname, "./index.html"))
๋ค์์ผ๋ก ๋์ฒด๋จ:
win.loadUrl(path.join("file://",__dirname, "./index.html"))
Webpack์ html ํญ๋ชฉ์ ๋ํ URL์ ์ฌ๋์์ ์ญ๋ฐฉํฅ ์ฌ๋์๋ฅผ ํผํฉํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐฉํดํ๋ฏ๋ก ๋
ธ๋์ url
๋ฐ path
๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํ๋๋ก ํฉ๋๋ค.
const winURL = process.env.NODE_ENV === 'development'
? 'http://localhost:9080'
: url.format({
protocol: 'file',
pathname: path.join(__dirname, 'index.html'),
});
๊ทธ๊ฒ์ ์ฌ์์ ๋๋ค. ๋๋ CRA + ์ ์์ ๊ฐํ ์์ต๋๋ค ๐, dev ๋ชจ๋์์ ์คํํ๋ ๊ฒ์ ๊ด์ฐฎ์ง ๋ง Windows exe์ ํจํค์ง ๋ exe๋ ์ ํ ์๋ํ์ง ์์ต๋๋ค.
์ ๊ฒ ์ด์. ๐คฃ react-router์ ํจ๊ป CRA๋ฅผ ์ฌ์ฉํ๋ค๋ฉด BrowerRouter๊ฐ ์๋ HashRouter๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์๋ฃ!!! ๐ https://github.com/electron-userland/electron-builder/issues/2167 ์ฐธ์กฐ
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฐธ๊ณ ๋ก ์ฌ๊ธฐ google์ ํตํด: ํ์ผ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ ์ ํฌ์ฅ๊ธฐ์์ ๋์ ํ์ผ์ ์ฑ์ ๋ณต์ฌํ๋๋ก ์ง์ํ๋ ๊ฒ์ ์์์ต๋๋ค. ๋ด ์ด๋ฆฌ์์ ์ค์์์ ๋ฐฐ์ฐ์ญ์์ค :)