node.js - Hur man använder remote.require() i Electron, med TypeScript


För närvarande försöker jag använda opencv4nodejs-modulen inom en Electron/Angular-applikation som också använder TypeScript. Jag har försökt på flera sätt att göra detta. Följande kodblock visar vad jag har försökt och vilket felmeddelande jag får.

// This says cv is undefined:
const cv = window.require('electron').opencv4nodejs;
const img = cv.imread('../assets/poop.jpg');

// Same here:
const cv = window.require('electron').remote.opencv4nodejs;
const img = cv.imread('../assets/poop.jpg');

// Uncaught Error: The specified module could not be found. (Though the module does exist at that location)
const cv = window.require('electron').remote.require('opencv4nodejs');
const img = cv.imread('../assets/poop.jpg');

// Without window I get "Uncaught TypeError: fs.existsSync is not a function"
const remote = require('electron').remote;
const cv = remote.opencv4nodejs;
const img = cv.imread('../assets/poop.jpg');

Jag hade fs.existSync-felet tidigare när jag försökte kräva något annat. Jag löste det genom att använda följande tsconfig.app.json:

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "baseUrl": "./",
    "module": "es2015",
    "types": ["node"] // Included this line
  },
  "exclude": [
    "test.ts",
    "**/*.spec.ts"
  ]
}

Såvitt jag förstår behövs remote require för att ladda moduler som normalt bara körs på node.js-servern. Ändå verkar jag inte kunna lista ut hur jag ska kräva modulen i min applikation. Författaren till modulen var mycket hjälpsam med byggproblem och andra problem, men han använde aldrig sin modul tillsammans med TypeScript.

Hur gör jag för att fjärrkräva en modul i en TypeScript/Angular/Electron-baserad applikation?

[redigera]

Jag försökte också följande:

import { Injectable } from '@angular/core';

// If you import a module but never use any of the imported values other than as TypeScript types,
// the resulting javascript file will look as if you never imported the module at all.
import { ipcRenderer } from 'electron';
import * as childProcess from 'child_process';

@Injectable()
export class ElectronService {

  ipcRenderer: typeof ipcRenderer;
  childProcess: typeof childProcess;

  constructor() {
    // Conditional imports
    if (this.isElectron()) {
      this.ipcRenderer = window.require('electron').ipcRenderer;
      this.childProcess = window.require('child_process');
    }
  }

  isElectron = () => {
    return window && window.process && window.process.type;
  }

  require = (module: string) => {
    return window.require('electron').remote.require(module);
  }
}

Att injicera denna tjänst i min komponent och kalla electronService.require('opencv4nodejs') fungerade inte heller.

Svar #1

Sedan Electron v1.6.10 levereras Electron med TypeScript-definitioner inkluderade.

För att använda remote via TypeScript kan du använda följande import-sats:

import {remote} from 'electron'; 

Relaterade artiklar