Electron에서 Nightmare를 사용할 때주의하십시오.

13437 단어 ElectronNightmare
Nightmare 는 Electron 를 내장하고 있는 것입니다만, 모체의 Electron 로부터 NightMare 를 기동하고 싶을 때의 주의점.

Nightmare가 아니라 Eramthgin 사용



Make nightmare isomorphic 하지만, 언급되고 있듯이, Electron 내부로부터 Nightmare 를 기동하는 기능은 실장중인 것 같다.
대신에 [email protected] 를 사용하면 좋다고 써 있다.

렌더러 프로세스가 아닌 메인 프로세스에 쓰기



또한 위에서 보완하는 느낌으로, 모체의 Electron의 node를 사용하는 관계상 또는 메인 프로세스에 쓰는 것으로 기재되어 있다.

LandingPage.vue
<template>
  <div id="wrapper">
    <button @click="add">お試し</button>
  </div>
</template>

<script>
import { ipcRenderer } from 'electron'

export default {
  name: "landing-page",
  methods: {
    add() {
      const result = ipcRenderer.sendSync('sync', '引数')
      console.log(result)
    }
  }
};
</script>

렌더러 프로세스에서 메인 프로세스와 통신합니다.ipcRenderer 를 사용한다.

index.js
import { app, Menu, BrowserWindow, ipcMain } from 'electron'

// 中略

const Nightmare = require("eramthgin");
const nightmare = Nightmare({
  show: true,
  backgroundColor: '#fff'
});

ipcMain.on('sync', (event, arg) => {  
  nightmare
    .goto("https://google.com/") // 指定URLに遷移
    .wait(1000)
    .screenshot(require('path').join(__dirname, 'screenshot1.png'))
    .end()
    .then(function () { console.log("Screenshot Saved") })
    .catch(function (error) {
      console.error('test failed:', error);
    });
  console.log(arg)
  event.returnValue = 'pong';

})

스크린샷은 소스를 수정해야 합니다.



모체의 Electron 의 버젼이 3x 이므로, 그대로라면 .screenshot() (을)를 사용하면 동작이 멈춘다.
eramthgin은 2 년 전이기 때문에 오래되었습니다.

그래서 /node_modules/eramthgin/lib/runner.js/node_modules/eramthgin/lib/actions.js 의 2개를 수정한다.

runner.js
parent.respondTo('screenshot', function (path, clip, done) {
  // https://gist.github.com/twolfson/0d374d9d7f26eefe7d38
  var args = [function handleCapture(img) {
    // done(null, img.toPng());
    done(null, img.toPNG());
  }];
  if (clip) args.unshift(clip);
  frameManager.requestFrame(function() {
    win.capturePage.apply(win, args);
  });
});
img.toPng() 에서 img.toPNG() 로 수정한다.

actions.js
exports.screenshot = function (path, clip, done) {
  debug('.screenshot()');
  if (typeof path === 'function') {
    done = path;
    clip = undefined;
    path = undefined;
  } else if (typeof clip === 'function') {
    done = clip;
    clip = (typeof path === 'string') ? undefined : path;
    path = (typeof path === 'string') ? path : undefined;
  }
  this.child.call('screenshot', path, clip, function (error, img) {
    // var buf = new Buffer(img.data);
    var buf = new Buffer(img);

    debug('.screenshot() captured with length %s', buf.length);
    path ? fs.writeFile(path, buf, done) : done(null, buf);
  });
};
img.dataimg 에.toPNG() 로 한 것에 의해, img 에는 바이너리가 들어가는 모양.

그럼 좋은 Electron Life를

좋은 웹페이지 즐겨찾기