Electron: ์‚ฌ์šฉ์ž ์ง€์ • ํ”„๋กœํ† ์ฝœ ๋ฐ ๋กœ์ปฌ ํŒŒ์ผ์— ํ•„์š”

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

์ €๋Š” ์ „์ž๋ฅผ ์ฒ˜์Œ ์ ‘ํ–ˆ๊ณ  require ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋ถ„์‚ฐ ํด๋ผ์ด์–ธํŠธ ์ธก js ํŒŒ์ผ์— ์‚ฌ์šฉ์ž ์ •์˜ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. d. ๊ทธ๋Ÿฌ๋‚˜ require ์ด ๋‚ด ์‚ฌ์šฉ์ž ์ง€์ • ๊ตฌ์„ฑํ‘œ๋ฅผ ๋ฌด์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค.

lib/ - node scripts
  main.js - node entry script
resources/ - client side resources
  css/
  html/
    index.html
  js/ - client side scripts
    main.js
    test.js
package.json

lib/main.js๋Š” ๊ณต๊ฐœ ํ™ˆํŽ˜์ด์ง€์˜ ์˜ˆ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

// lib/main.js
'use strict';

const electron = require('electron');
const app = electron.app;  // Module to control application life.
const BrowserWindow = electron.BrowserWindow;  // Module to create native browser window.
const path = require('path');

var mainWindow = null;

app.on('ready', function() {
  const protocol = electron.protocol;

  /* js, css, fonts, ... */
  protocol.registerFileProtocol('resource', (request, callback) => {
    var url = request.url.substr(11);
    callback({path: path.join(__dirname, '../resources', url)});
  });

  /* html, possible rendered from other files like markdown or jade */
  protocol.registerFileProtocol('view', (request, callback) => {
    var url = request.url.substr(11);
    callback({path: path.join(__dirname, '../resources/html', url)});
  });


  // Create the browser window.
  mainWindow = new BrowserWindow({width: 800, height: 600});

  // and load the index.html of the app.
  mainWindow.loadURL('view://index.html');

  // Open the DevTools.
  mainWindow.webContents.openDevTools();

  // ...
});

view:// ํ”„๋กœํ† ์ฝœ ๋’ค์— ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๋Š” markdown ๋˜๋Š” jade์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํŒŒ์ผ์„ html๋กœ ์ปดํŒŒ์ผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค( view://index.jade ๋Š” jade ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜๊ณ  html ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•จ).

<!-- resources/html/index.html -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Electron Test</title>
  </head>
  <body>
    <h1>Electron Test</h1>

    <script src="resource://js/main.js"></script>
  </body>
</html>

html ํŒŒ์ผ์€ ๋‚ด ์‚ฌ์šฉ์ž ์ •์˜ resource:// ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด css ๋˜๋Š” js ํŒŒ์ผ๊ณผ ๊ฐ™์€ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํŒŒ์ผ์€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‹คํ–‰๋˜์ง€๋งŒ require ๋‹ค๋ฅธ ํŒŒ์ผ์€ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

// resources/js/main.js
const test = require('./test'); // Error: Cannot find module './test'

test.sayHello();
// resources/js/test.js
exports.sayHello = function() {
  console.log('Hello!');
};

electron . , v0.36.7๋กœ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

devtools์—์„œ require ๋’ค์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๊ฒ€์‚ฌํ•  ๋•Œ(์•ฝ module.js:336 , ๋…ธ๋“œ์˜ ํ˜„์žฌ ๋งˆ์Šคํ„ฐ์—์„œ 337 ๋ฒˆ์งธ ์ค„) ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ request ๋Š” "./test" ์ด๊ณ  paths ์—๋Š” ์ „์ž์˜ ํ•ต์‹ฌ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ํ•ญ๋ชฉ์ด ํ•˜๋‚˜๋งŒ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ ๋ชฉ๋ก์„ ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ(#4459, #2539)๋ฅผ ํ™•์ธํ–ˆ์ง€๋งŒ ๋„์›€์ด ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(์˜ˆ: module ์˜ ๊ฒฝ๋กœ ๋˜๋Š” globalPaths๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ์‚ฌ์ „ ๋กœ๋“œ ์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Œ .

์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‹จ์ผ JavaScript ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๊นŒ? (์ €๋Š” ๋ชจ๋“  ์†Œ์Šค ํŒŒ์ผ์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ „์ฒ˜๋ฆฌ๊ธฐ๋กœ TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.)

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

์šฐ๋ คํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์ด ์†”๋ฃจ์…˜์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.
WEB_FOLDER์—๋Š” index.html ๋ฐ ๊ธฐํƒ€ ๋ชจ๋“  ์ƒ๋Œ€ ์ฐธ์กฐ ์ฝ˜ํ…์ธ ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ธ๋ฑ์Šค ํŒŒ์ผ์ด ํ•˜์œ„ ํด๋”(์ด ์˜ˆ์—์„œ๋Š” web) ์•ˆ์— ์žˆ์ง€ ์•Š์œผ๋ฉด ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function createWindow() {
  const WEB_FOLDER = 'web';
  const PROTOCOL = 'file';

  electron.protocol.interceptFileProtocol(PROTOCOL, (request, callback) => {
      // // Strip protocol
      let url = request.url.substr(PROTOCOL.length + 1);

      // Build complete path for node require function
      url = path.join(__dirname, WEB_FOLDER, url);

      // Replace backslashes by forward slashes (windows)
      // url = url.replace(/\\/g, '/');
      url = path.normalize(url);

      console.log(url);
      callback({path: url});
  });

  // Create the browser window.
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: false
    }
  });

  // and load the index.html of the app.
  mainWindow.loadURL(url.format({
    pathname: 'index.html',
    protocol: PROTOCOL + ':',
    slashes: true
  }));

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

module.paths ์—์„œ ๋…ธ๋“œ ๋ชจ๋“ˆ์˜ ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. resources/js ๊ฐ€ ์—†์œผ๋ฉด require ๋Š” test.js ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. .

๋ชจ๋“ˆ ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์กฐ์ž‘ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปค๋ฎค๋‹ˆํ‹ฐ ์—์„œ ์•„์ด๋””์–ด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ

<script> ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด .js ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋ฉด ๋ฌธ์„œ์— ํฌํ•จ๋˜๋ฏ€๋กœ

<body>
  <h1>Electron Test</h1>
  <script src="resource://js/main.js"></script>
</body>

๊ธฐ๋Šฅ์ ์œผ๋กœ ๋™๋“ฑํ•˜๋‹ค

<body>
  <h1>Electron Test</h1>
  <script>
    const test = require('./test'); // Error: Cannot find module './test'
    test.sayHello();
  </script>
</body>

์–ด๋–ค ๊ฒƒ์„ ์˜๋ฏธ ./test ์ƒ๋Œ€์  ํ•ด๊ฒฐ index.html ์— ์ƒ๋Œ€ํ•˜์ง€ js/main.js . ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<body>
  <h1>Electron Test</h1>
  <script>
    require('../js/main.js');
  </script>
</body>

์šฐ๋ คํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์ด ์†”๋ฃจ์…˜์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.
WEB_FOLDER์—๋Š” index.html ๋ฐ ๊ธฐํƒ€ ๋ชจ๋“  ์ƒ๋Œ€ ์ฐธ์กฐ ์ฝ˜ํ…์ธ ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ธ๋ฑ์Šค ํŒŒ์ผ์ด ํ•˜์œ„ ํด๋”(์ด ์˜ˆ์—์„œ๋Š” web) ์•ˆ์— ์žˆ์ง€ ์•Š์œผ๋ฉด ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function createWindow() {
  const WEB_FOLDER = 'web';
  const PROTOCOL = 'file';

  electron.protocol.interceptFileProtocol(PROTOCOL, (request, callback) => {
      // // Strip protocol
      let url = request.url.substr(PROTOCOL.length + 1);

      // Build complete path for node require function
      url = path.join(__dirname, WEB_FOLDER, url);

      // Replace backslashes by forward slashes (windows)
      // url = url.replace(/\\/g, '/');
      url = path.normalize(url);

      console.log(url);
      callback({path: url});
  });

  // Create the browser window.
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: false
    }
  });

  // and load the index.html of the app.
  mainWindow.loadURL(url.format({
    pathname: 'index.html',
    protocol: PROTOCOL + ':',
    slashes: true
  }));
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰