如何在Electron中使用node_modules?

13

我正在尝试结合Angular2、Typescript和Electron来使用一个通过npm安装的node模块包。目前的问题是,我必须指定模块的位置,比如var module = require('./node_modules/xyz/lib/xyz.js')。但是,这样electron就找不到xyz的依赖项了,它们位于./node_modules/xyz/node_modules/yyy中,并且会报错说找不到./yyy.js

Electron应用程序结构

dist  
├── angular2.dev.js   
├── config.js  
├── index.html  
├── main.js  
├── node_modules  
├── package.json  
└── app.js  

事实证明,我使用npm安装模块,但是我使用Angular2的JSPM来加载模块。当使用jspm install npm:xyz安装模块时,我可以在Electron中像require('xyz')一样要求模块。 - chrisber
我想我知道问题出在哪了,类似的问题已经有人问过了,我认为这个答案可能会对你有帮助!链接 - Yan Foto
4个回答

7

更新:

一位用户曾提出类似的问题,我的回答很可能对你有所帮助:

如果你没有将你的应用程序根目录下的node_modules目录的路径添加到NODE_PATH变量中,它是无法正常工作的。所以你需要像这样做:

export NODE_PATH=/PATH/TO/APP/node_modules
electron /PATH/TO/APP

当导出 NODE_PATH 时,请确保提供绝对路径。


如果 electron 在您正常地 require 模块时找不到这些模块,这表明您的 package.json 文件中没有将该模块列为依赖项,即使该模块已经在您的 dist 目录下可用。

因此,请确保您位于 dist 目录内并使用:

npm install --save xyz

注意使用--save标志!


1
根据 Electron 的文档,将 nodeIntegration 属性设置为 true。方法是添加以下代码:
webPreferences: {
  nodeIntegration: true
}

createWindow() 函数添加到您的代码中。

1
这不是你想的那样。Node集成意味着在前端中公开了Node.js,从安全角度来看,使您的应用程序特别容易受到攻击。 - user5311618

1
目前的问题是,我必须指定模块的位置,例如var module = require('./node_modules/xyz/lib/xyz.js')
如果你把它放在相对路径./node_modules/...里,你应该能够这样写 var module = require('xyz');

1
如果您的package.json中没有包含这些模块,我发现最简单的方法是将它们全部复制到发布版的node_modules目录中。路径大致为releases > ARCHITECTURE > resources > node_modules

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接