web-dev-qa-db-ja.com

FS Electron.Atom \ WebPackアプリケーション内のモジュール)の使用方法

FS module(fs.writeFile)を使用して、ファイルにデータを書き込む必要があります。私のスタックは、webpack +反応+ redux +電子です。

最初の問題は次のとおりでした:モジュール 'fs'を解決できません。使ってみた

target: "node",
---
node: {
    global: true,
    fs: "empty",
}
---
resolve: {
    root: path.join(__dirname),
    fallback: path.join(__dirname, 'node_modules'),
    modulesDirectories: ['node_modules'],
    extensions: ['', '.json', '.js', '.jsx', '.scss', '.png', '.jpg', '.jpeg', '.gif']
},

数回試行した後、問題は解決されました(node:{fs: "empty"})。しかし、それから2番目の問題がありました: スクリーンショット

//In method componentDidMount (React)
console.log('fs', fs);
console.log('typeOf', typeof fs.writeFile);

//By clicking on the button
console.log(fs);
console.log(typeof fs.writeFile);

fsが空のオブジェクトであり、メソッドwriteFileが存在しないことがわかります。 Webpackの設定を変更しようとしました。

const path = require('path');
const fs = require('fs');
const webpack = require("webpack");
console.log(fs);

この場合、fsは空ではありません。

この問題を解決するには?何か案は?

7
Max

問題は解決しました。

Electronアプリで使用する必要があります(バンドルを追加する場所):

var remote = require('electron').remote;
var electronFs = remote.require('fs');
var electronDialog = remote.dialog;
17
Max

受け入れられた回答の完成。

Webpackを使用している場合。 Angularを使用している場合と同様に、Reactまたは他のフレームワークです。requirewebpackによって解決されます。これにより、実行時に使用がねじ込まれます。

使用する window.require代わりに。

例:

var remote = window.require('electron').remote;
var electronFs = remote.require('fs');
var electronDialog = remote.dialog;

注:レンダラープロセスからノードAPIにアクセスするためにリモートを使用する必要はありません。完全に露出しているので。

const fs = window.require('fs');
const path = window.require('path');

しましょう。

更新

Electronのv5から!ノードAPIは、レンダラープロセスでデフォルトで公開されなくなりました!!!

nodeIntegrationフラグのデフォルトがtrueからfalseに変更されました。

ブラウザウィンドウの作成時に有効にできます。

app.on('ready', () => {
    mainWindow = new BrowserWindow({
        webPreferences: {
            nodeIntegration: true, // <--- flag
            nodeIntegrationInWorker: true // <---  for web workers
        }
    });
});

nodeIntegrationをアクティブ化することのセキュリティリスク

nodeIntegration: trueは、アプリケーションで信頼できないリモートコードを実行している場合にのみセキュリティリスクになります。たとえば、アプリケーションがサードパーティのWebページを開くとします。サードパーティのWebページはノードランタイムにアクセスでき、ユーザーのファイルシステムで悪意のあるコードを実行できるため、これはセキュリティリスクになります。その場合、nodeIntegration: false。アプリがリモートコンテンツを表示していない場合、または信頼できるコンテンツのみを表示している場合は、nodeIntegration: true 大丈夫。

そして最後に!!!!ドキュメントからの推奨される安全な方法

https://electronjs.org/docs/tutorial/security#2-do-not-enable-nodejs-integration-for-remote-content

4
Mohamed Allal