使用Electron访问Angular 2应用程序中的文件系统

时间:2017-08-15 08:39:05

标签: node.js angular electron fs

我知道Angular 2是在Web浏览器上运行的,它无法访问文件系统。

然而,我正在使用Electron作为我的前端,并通过电子运行应用程序:

"build-electron": "ng build --base-href . && cp src/electron/* dist",
"electron": "npm run build-electron && electron dist"

因此,我使用npm run electron运行它,最后运行electron dist

由于我正在运行electron而不是ng,我认为我应该能够访问文件系统。但是,当我这样做时:

import * as fs from 'fs'

我收到错误:

ng:///AppModule/AppComponent_Host.ngfactory.js:5 ERROR TypeError: __WEBPACK_IMPORTED_MODULE_0_fs__.readFileSync is not a function(…)

同样,当我尝试:var fs = require('fs');

我明白了:

ng:///AppModule/AppComponent_Host.ngfactory.js:5 ERROR TypeError: fs.readFileSync is not a function

这是导致错误的调用:

this.config = ini.parse(fs.readFileSync('../../CONFIG.ini', 'utf-8'))

有没有人知道造成这种情况的原因是什么?

感谢。

5 个答案:

答案 0 :(得分:6)

通过以下方式解决:

1)弹出webpack:ng eject

2)将target: 'electron-renderer'添加到module.exports

中的webpack.config.js数组

3)需要远程,因为我们在renderer,但fs仅在main processRead more)中可用:var remote = require('electron').remote; < / p>

4)需要fs(这次使用需要的遥控器实现):var fs = remote.require('fs');

现在它有效!

答案 1 :(得分:2)

据我了解,您使用Webpack构建应用程序。

您可以通过webpack配置中的 externals 数组公开所有Node模块。

module.exports = {
   "externals": {
      "electron": "require('electron')",
      "child_process": "require('child_process')",
      "fs": "require('fs')",
      "path": "require('path')",
      ...
   }
}

由于它们是通过Webpack外部提供的,因此不需要它们,而是将它们与导入一起使用。

import * as fs from 'fs'

您可以在my article中了解有关此问题的更多信息。

答案 2 :(得分:2)

我迟到了,但我最近偶然发现了这个问题。对于后来者,你可以使用ngx-fs

https://github.com/Inoverse/ngx-fs

用法:

const fs = this._fsService.fs as any;
fs.readdir("\\", function (err, items) {
   if (err) {
      return;
   }
   for (let i = 0; i < items.length; i++) {
     console.log(items[i]);
   }
});

答案 3 :(得分:2)

我正在使用

Angular CLI: 7.0.7
Node: 8.12.0
OS: win32 x64
Angular: 7.0.4

我尝试了ng eject方法,这种方法在我的情况下不起作用,默认情况下处于禁用状态,并将在Angular 8.0中将其完全删除

错误消息:The 'eject' command has been disabled and will be removed completely in 8.0.

它为我工作,方法是在native.js文件夹中创建一个名为src的文件,并插入以下内容:

`window.fs = require('fs');

将此文件添加到angular-cli.json脚本数组中:

"scripts": [
    "native.js"
]

将以下几行添加到polyfills.ts

`declare global {
    interface Window {
        fs: any;
    }
}`

之后,您可以使用以下命令访问文件系统:

`window.fs.writeFileSync('sample.txt', 'my data');`

credits

答案 4 :(得分:0)

我遇到了同样的问题,可以通过更简单的方式解决问题:

  1. 只需下载此项目作为开始,'require'-s已经在webpack.config.js文件中(以及角度,电子等的集成): https://github.com/maximegris/angular-electron

  2. 将'fs'导入home.ts(或任何其他组件),如@Matthias Sommer所述:

  3. std::numeric_limits

    1. 使用'fs':)