ãã¹ãŠã®main.jsã¹ã¯ãªãããšãã®äŸåé¢ä¿ã1ã€ã®ãã¡ã€ã«ã«WebpackããããšããŠããŸãïŒUIã¢ããªçšã«1ã€ã®ãã¡ã€ã«ããµãŒããŒã¢ããªçšã«1ã€ã®ãã¡ã€ã«ãå¿ èŠã§ãïŒã
éåžžã®ãœãŒã¹ã䜿çšããå Žåãindex.htmlã¯åé¡ãªãèªã¿èŸŒãŸããŸãã ãã ããWebãããã³ã°ãè¡ããšãã¿ã€ãã«ã«èšèŒãããŠãããšã©ãŒãçºçããŸãã
ãããç§ã䜿çšãã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');
ããã¯ãããããããŒã«ã«ãã¡ã€ã«ã®æäŸãå¯èœã«ããelectronã³ã³ããã¹ãå€ã®ãã®ãwebpackãåŒã³åºã/è©äŸ¡ããŠããããã ãšæããŸãã
äœãã¢ã€ãã¢/ææ¡ã¯ãããŸããïŒ ããããšãïŒ
BrowserWindow
ã®webPreferences
ã§webSecurity
ããªãã«ããŠã¿ãŠãã ããã ãã®ä»ã®è³ªåã«ã€ããŠã¯ãã³ãã¥ããã£ã«å©ããæ±ããããšããå§ãããŸãã
@MihaiValentinãããããªãã¯ããã«å¯Ÿãã解決çãèŠã€ããŸãããïŒ
@MihaiValentin@ singhshashiç§ãåãåé¡ãæ±ããŠããŸããã webpackã¯ãããã©ã«ãã§ã __dirname
ã®ãããªããŒãã°ããŒãã«ããã¢ãã¯ãããããšããŠããããã§ãã 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;
@eiriarteãããå ±æããŠãããŠããããšãããããããã¯ããŸããããŸããã§ããã ããªããèšã£ãããŒãæ§æã§ããwebpackã䜿çšããŠã¡ã€ã³ããã»ã¹ã®ãã¡ã€ã«ãããã¯ãããšãåããšã©ãŒãçºçããŸãã
ãã®ã¹ã¬ããã«ãã©ãçãä»ã®äººã®ããã«åé¡ãåé¿ããããã«äœ¿çšããŠããåé¿çãå ±æããŠããŸãã
ã¡ã€ã³ã§æ£ããåäœããããã«ãããããã©ã³ã¹ãã€ã«ããããã«babelãå¿ èŠãšããesæ©èœã䜿çšãã代ããã«ã jsãã¡ã€ã«ãç§ã¯ããããç°ãªããã¡ã€ã«ã«åããŸããã ç§ã®main.jsã§ã¯ãbabelãã©ã³ã¹ãã€ã«ãå¿ èŠãšããæ©èœã䜿çšããŠããŸããã ãããã£ãŠãã€ã³ããŒãã®ä»£ããã«requireã䜿çšããŸãã éåæãªã©ã®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
ïŒjavascriptã®ãã¯ãããŒãïŒã§ãä¿®æ£ãã©ããããŠã人çãããéããããšãã§ããŸããïŒ
setTimeout(() => {
win.loadURL(`file:///${__dirname}/index.html`);
}, 2000); // 1 second wasn't enough lol
ç§ã«ãšã£ãŠ..çç±ã¯ãwebpackããã³ãã«ãåºåããŠãããã¹ãå±ããªãã£ãããã§ã...ããã€ãã®ãã£ã¬ã¯ããªã«æ»ã£ãŠãäžèšã®ããã«ããŒãæ§æãé©çšããããšã§è§£æ±ºããŸãã..å®å šã«æ©èœããŸãïŒD
pathname: path.join(__dirname, '../../source/resources/views', 'index.html');
node: {
__dirname: false,
__filename: false
},
åèãŸã§ã«ãã°ãŒã°ã«çµç±ã§ããã«ãã人ãã¡ãžïŒãã¡ã€ã«ãååšããªãå Žåãåããšã©ãŒãçºçããŸãã é»åããã±ãŒãžã£ãŒã«ã¿ãŒã²ãããã¡ã€ã«ãã¢ããªã«ã³ããŒããããã«æ瀺ããã®ãå¿ããŸããã ç§ã®æããªéã¡ããåŠã¶:)
ä»åŸã®åèã®ããã«ïŒãã®ããŒãžãäœåºŠãæ€çŽ¢ããããïŒãçŸåšèããããåé¡ã¯æ¬¡ã®ãšããã§ãã
ãã¡ã€ã«ãååšããªãããããŒãã¢ããªã±ãŒã·ã§ã³ããã¡ã€ã«ã«å°éã§ããŸããã 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ãææããŠããããã«ãåã«Webã»ãã¥ãªãã£ãç¡å¹ã«ããŸããã
electron-main
ãšelectron-renderer
ã®ããããã«2ã€ã®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
ãwebpackã«çµã¿èŸŒãŸãã webpackTargetElectronRenderer
ã絶察çãªãã®ã«ãªã£ããšæããŸã
ããã§ã¯ã 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
},
ã¡ã€ã³ã®èšå®ã§ã¯ãªããã¬ã³ãã©ãŒã®èšå®ã§ã 誰ããç§ã®èšå®ãã¡ã€ã«ãæ°ã«å ¥ã£ãå Žåã«åããŠãäžèšã®ã³ã¡ã³ããä¿æããŸãã
webpackã䜿çšããŠããªãå Žåã¯ã©ããªããŸããïŒ
@hbgdPro https://github.com/electron/electron/issues/5107#issuecomment -299971806ã®ãªãã·ã§ã³ã®ããã€ããè©ŠããŠãã ããã1ã2ã4ã¯ãã¹ãŠwebpackãå¿ èŠãšããŸããã
@popey456963ããããšãã ç§ã¯å°ããåã«ãã§ã«è©ŠããŠããŸããã ç§ã®åé¡ã¯ãå®éã«ã¯ããã«ãããã»ã¹ã«å«ããå¿ èŠã®ãããã©ã«ããŒãæå®ããå¿ èŠãããããšã§ããã ããã¯webpackãšã¯äœã®é¢ä¿ããããŸããã
ç§ã¯ã¡ããã©ããã«åºããããŸããïŒããã«ã¡ã¯ç§ã¯webpackããŒã ããæ¥ãŸããïŒã webpackã«ã¯electron-mainã¿ãŒã²ãããããã __dirname
ãš__filename
ã®ã¢ãã¯ãããã©ã«ãã®ã¯ã€ãã¯ã¹ã¿ãŒãã®äŸãç Žã£ãŠããããšãç¥ããŸããã§ããã
念ã®ãããé»åããŒã ã ããã¯ããããç¡å¹ã«ããããšãå ¬åŒã«æšå¥šããŸããïŒ ãããããªããç§ã¯å ã«é²ãã§ããããã®ãã«ãã€ã³ãã¢ãã¯ãããªãããã«ãç§ãã¡ãæã£ãŠããé»åã¡ã€ã³ã¿ãŒã²ããã®ããã©ã«ããPRããŸãã
ããããšãïŒ
@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 ã2ã€ã®ã¹ããããã«éãã¯ãããŸããã 2çªç®ã®ãã®ã¯æåã®ãã®ãšã¯ç°ãªãã¯ãã§ããïŒ
@jakehockey102çªç®ã®ãã®ã«ã¯äžéåŒçšç¬Šã®ä»£ããã«ããã¯ã¯ã©ãŒãããããŸãã ããã¯ã¯ã©ãŒãã¯ããããåãªãæååãªãã©ã«ã§ã¯ãªãããã³ãã¬ãŒããªãã©ã«ã§ããããšã瀺ããŠããŸãã æåã®äŸã¯éåžžã®æååãªãã©ã«ã§ããããã ${__dirname}
ã®éšåã__dirname
ã®å€ã«çœ®ãæããããããšã¯ãããŸããã ãšãã£ã¿ãŒãããããç°ãªã£ãŠåŒ·èª¿è¡šç€ºããªãå Žåãæã
æ°ä»ãã®ã¯ããªãé£ããã§ãïŒæ®å¿µãªãããGFMæ§æ匷調衚瀺ã¯ããããåºå¥ããŸããïŒã
ããããã£ãã GitHubã®Markdownã§è¡šç€ºãããšãã«ãã®éãã«æ°ã¥ããŸããã§ããããç§ã¯Visual Studio Codeã䜿çšããŠããããã£ãããããã«éãã«ééããªãæ°ã¥ããŠããŸãã 誀èŠå ±ã§ããããªãã;-)
è¿œå ããããšæã£ãã®ã§ãããç§èªèº«ã®å€±æïŒå€åæ§é害ïŒãåå ã§ãã®ãšã©ãŒãçºçããŸãã
ãã¡ã€ã«åããã¹ãŠå°æåã®ãšãã«pathname: path.join(__dirname, 'Views/settingsWindow.html')
ãåŒã³åºããŠããŸããã
ããã¯ãWebããã¯ãããåŸã«ã®ã¿ãšã©ãŒãåŒãèµ·ãããŸããã
ç§ã¯ããã€ãã®è§£æ±ºçãè©ŠããŸãããããããæ©èœãããããšãã§ããŸããã§ããïŒ[email protected]ãš[email protected]ã䜿çšïŒã
SOã«3祚ããæ祚ããŠããªãæçš¿ã§ãæè¯ã®è§£æ±ºçãèŠã€ããŸããããã®ããã±ãŒãžã¯å¿
èŠãªãããšãããããŸããã
https://stackoverflow.com/questions/45041364/angular-electron-webpack-live-reloading
ãŒãæ§æ-é¢åãªãœãªã¥ãŒã·ã§ã³ïŒ
-npmã¢ã³ã€ã³ã¹ããŒã«electron-reload
-1ã€ã®ã¿ãŒããã«ã§ãµãŒããå®è¡ãã
-main.jsã§win.loadURLïŒ http://localhost:4200/index.html
ïŒ;ãå€æŽããŸãã
-次ã«ãå¥ã®ç«¯æ«ã§npmrunelectronãå®è¡ããŸã
ããã¯ããŸããã
ç§ã¯ãããäžæ¥äžä¿®æ£ããããšããŸããããããŠæåŸã«ãã®äººã®è§£æ±ºçã¯ãã§ãã¯ããŸãã
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 +é»åã§ç«ã¡åŸçããŠããŸãðãéçºã¢ãŒãã§å®è¡ããããšã¯åé¡ãããŸããããWindowsexeã«ããã±ãŒãžåãããŠããŸã£ããæ©èœããŸããã
ããã£ãã ð€£react-routerã§CRAã䜿çšããå Žåã¯ãBrowerRouterã§ã¯ãªãHashRouterã䜿çšããå¿ èŠããããŸãã çµããïŒïŒïŒ ðhttpsïŒ //github.com/electron-userland/electron-builder/issues/2167ãåç §ããŠãã ãã
æãåèã«ãªãã³ã¡ã³ã
åèãŸã§ã«ãã°ãŒã°ã«çµç±ã§ããã«ãã人ãã¡ãžïŒãã¡ã€ã«ãååšããªãå Žåãåããšã©ãŒãçºçããŸãã é»åããã±ãŒãžã£ãŒã«ã¿ãŒã²ãããã¡ã€ã«ãã¢ããªã«ã³ããŒããããã«æ瀺ããã®ãå¿ããŸããã ç§ã®æããªéã¡ããåŠã¶:)