Electron: webpacking main.js ํ›„ ๋กœ์ปฌ ๋ฆฌ์†Œ์Šค๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์—†์Œ: file://index.html/

์— ๋งŒ๋“  2016๋…„ 04์›” 10์ผ  ยท  31์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: electron/electron

๋ชจ๋“  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 ํ˜ธ์ถœ/ํ‰๊ฐ€ ํ•ญ๋ชฉ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์•„์ด๋””์–ด/์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ ํ•ด์š”!

  • ์ „์ž ๋ฒ„์ „: 0.37.2
  • ์šด์˜ ์ฒด์ œ: Windows 10 ํ™ˆ

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ฐธ๊ณ ๋กœ ์—ฌ๊ธฐ google์„ ํ†ตํ•ด: ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ „์ž ํฌ์žฅ๊ธฐ์—์„œ ๋Œ€์ƒ ํŒŒ์ผ์„ ์•ฑ์— ๋ณต์‚ฌํ•˜๋„๋ก ์ง€์‹œํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์–ด๋ฆฌ์„์€ ์‹ค์ˆ˜์—์„œ ๋ฐฐ์šฐ์‹ญ์‹œ์˜ค :)

๋ชจ๋“  31 ๋Œ“๊ธ€

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์„ ํ†ตํ•ด: ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ „์ž ํฌ์žฅ๊ธฐ์—์„œ ๋Œ€์ƒ ํŒŒ์ผ์„ ์•ฑ์— ๋ณต์‚ฌํ•˜๋„๋ก ์ง€์‹œํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์–ด๋ฆฌ์„์€ ์‹ค์ˆ˜์—์„œ ๋ฐฐ์šฐ์‹ญ์‹œ์˜ค :)

๋‚˜์ค‘์— ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก(์ด ํŽ˜์ด์ง€๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๊ฒ€์ƒ‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—) ํ˜„์žฌ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ Node ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํŒŒ์ผ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. electron-packager ๊ฐ€ ๋Œ€์ƒ ํŒŒ์ผ์„ ์•ฑ์— ๋ณต์‚ฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค!

  2. BrowserWindow() ๋ฅผ ๋งŒ๋“ค ๋•Œ webPreferences webSecurity ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

{
  webPreferences: {
    webSecurity: false
  }
}
  1. Webpack์€ ๊ธฐ๋ณธ์ ์œผ๋กœ node.__dirname ์™€ ๊ฐ™์€ ๋…ธ๋“œ ์ „์—ญ์„ "์กฐ๋กฑ"ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  node: {
    __dirname: false
  }
  1. 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`);
})

๋‚˜๋ฅผ ์œ„ํ•ด ํ•ด๊ฒฐ์ฑ…์€

  1. ์›น ๋ณด์•ˆ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
  2. ํŒŒ์ผ์„ ์—ฐ๊ฒฐํ•˜๋ ค๊ณ  ํ•  ๋•Œ __dirname+"./FileName"์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ 'C:/Folder./FileName'์„ ๋งŒ๋“ค๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ "./"๊ฐ€ ์—†์–ด์•ผ ํ•˜๋ฉฐ "/"๋งŒ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ASAR์„ ์ถ”๊ฐ€ํ•  ๋•Œ๊นŒ์ง€ ๊ฐœ๋ฐœ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  3. ํŒŒ์ผ ์ด๋ฆ„์˜ ์—„๊ฒฉํ•œ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. asar๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„ ๋ฐœ์ƒํ•œ ์ด ๋ฌธ์ œ๋Š” ๊ทธ๋•Œ๊นŒ์ง€ ๊ฐœ๋ฐœ ๋ฐ ํ”„๋กœ๋•์…˜์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‚˜ ๊ฐ™์€ 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 ์ฐธ์กฐ

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰