electron 如何在React Typescript应用程序中使用电子浏览器窗口

2nbm6dog  于 2022-12-08  发布在  Electron
关注(0)|答案(2)|浏览(217)

我目前正试图找到一种方法来整合第三方网址,如迪士尼+或spotify,到我的应用程序。我很快发现这是不可能的iframe,因为许多网站都阻止它。我的下一个想法是使用Electron'swebview标签。然而,这已经贬值。
现在我有了将Electron的BrowserWindow集成到React Dom中的想法。
https://medium.com/folkdevelopers/the-ultimate-guide-to-electron-with-react-8df8d73f4c97
如果我按照此指南导入所有内容,则会出现此错误。

App.tsx:2 Uncaught TypeError: window.require is not a function

我知道这是typescript .. require ...不是一个解决方案。但是import不能很好地工作。我也试着构建一个普通的javascript应用程序只是为了测试它,但是效果不是很好。
我也确信,即使我得到了正确的导入,我应该得到一个constructor error。有人有这个问题的经验,可以请帮助我。
电子电源

import { app, BrowserWindow } from 'electron'
import * as path from 'path'
import installExtension, {
  REACT_DEVELOPER_TOOLS,
} from 'electron-devtools-installer'

function createWindow() {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      // contextIsolation: false,
      preload: path.join(__dirname, 'preload.js'),
    },
  })

  if (app.isPackaged) {
    // 'build/index.html'
    win.loadURL(`file://${__dirname}/../index.html`)
  } else {
    win.loadURL('http://localhost:3000/index.html')

    win.webContents.openDevTools()

    // Hot Reloading on 'node_modules/.bin/electronPath'
    require('electron-reload')(__dirname, {
      electron: path.join(
        __dirname,
        '..',
        '..',
        'node_modules',
        '.bin',
        'electron' + (process.platform === 'win32' ? '.cmd' : '')
      ),
      forceHardReset: true,
      hardResetMethod: 'exit',
    })
  }
}

app.whenReady().then(() => {
  // DevTools
  installExtension(REACT_DEVELOPER_TOOLS)
    .then((name) => console.log(`Added Extension:  ${name}`))
    .catch((err) => console.log('An error occurred: ', err))

  createWindow()

  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow()
    }
  })

  app.on('window-all-closed', () => {
    if (process.platform !== 'darwin') {
      app.quit()
    }
  })
})

App.tsx

import './App.css'
const electron = window.require('electron')
const remote = electron.remote
const { BrowserWindow } = remote

function App() {
  return (
    <div className='App'>
      <h1>halllo</h1>
      <button
        onClick={() => {
          let win = new BrowserWindow()
          win.loadURL('https://www.electronjs.org/docs/api/remote')
        }}
      >
        Open BrowserWindowss
      </button>
    </div>
  )
}

export default App

Reacttsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "outDir": "../build", // Output transpiled files to build/electron/
    "forceConsistentCasingInFileNames": true,
    "noFallthroughCasesInSwitch": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "react-jsx"
  },
  "include": [
    "src"
  ]
}
8cdiaqws

8cdiaqws1#

在main.ts中:

webPreferences: {
   nodeIntegration: true,
   contextIsolation: false,
   enableRemoteModule: true,
   preload: path.join(__dirname, 'preload.js'),
},
vi4fp9gy

vi4fp9gy2#

我正在使用这个,它工作正常:

它在main.ts中使用require,但在React代码中使用import
它使用import意味着所需的模块在构建时由Webpack包含在渲染器包中,而不是在运行时从Node.js环境中加载。
它根本不使用window.require(所以,据我所知没有问题)。
或者是这样的(我没有使用):

它讲述了如何使用window.require
我们需要使用window.require导入ipcRenderer模块,因为我们希望在运行时从节点环境中获取electron,而不是webpack在编译时使用的electron。
我不知道它为什么要在运行时而不是编译时要求。
它链接到此问题,该问题已关闭,有93条评论:

相关问题