Electron 和 TypeScript:“fs”无法解析

Posted

技术标签:

【中文标题】Electron 和 TypeScript:“fs”无法解析【英文标题】:Electron and TypeScript: 'fs' can't be resolved 【发布时间】:2018-07-06 15:51:59 【问题描述】:

我正在尝试创建我的第一个 Electron 应用程序。我决定使用以下工具/技术:

打字稿 WebPack(第 3 版) 反应

本地环境是 OS X High Sierra。

问题是我什至无法构建我的应用程序,并且在使用 WebPack 构建时出现错误:“Module not found: Error: Can't resolve 'fs' in '<root>/node_modules/electron'

我的配置如下: 包.json:

  "dependencies": 
    "electron": "^1.7.11"
  ,
  "devDependencies": 
    "ts-loader": "^3.3.1",
    "tslint": "^5.9.1",
    "typescript": "^2.6.2",
    "webpack": "^3.10.0"
  

tsconfig.json:


  "compileOnSave": false,
  "compilerOptions": 
    "allowJs": true,
    "jsx": "react",
    "moduleResolution": "node",
    "noImplicitAny": true,
    "outDir": "./dist/",
    "sourceMap": true,
    "target": "es2015"
  

webpack.config.js:

const path = require('path');

module.exports = 
    entry: './src/index.ts',
    devtool: 'inline-source-map',
    module: 
        rules: [
            
                test: /\.tsx?$/,
                use: 'ts-loader',
                exclude: /node_modules/
            
        ]
    ,
    // node: 
    //     'fs': 'empty'
    // ,
    resolve: 
        extensions: [ '.tsx', '.ts', '.js' ]
    ,
    output: 
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
    
;

最后,我从电子教程中获取的唯一源代码文件 (./src/index.ts) 如下所示:

import  app, BrowserWindow  from 'electron';
import * as path from 'path';
import * as url from 'url';

let win: Electron.BrowserWindow;

function createWindow () 
    // ... common stuff


app.on('ready', createWindow);
app.on('window-all-closed', () =>  if (process.platform !== 'darwin')  app.quit(); );
app.on('activate', () =>  if (win === null)  createWindow(); );

我认为问题在于 TypeScript 的使用方式,因为如果我将 index.ts 中的此类代码放入纯 js 文件中,它可以正常工作(将 'import' 替换为 'require')。

提前感谢您的帮助!

更新

如果在webpack.config.js 中设置 target: 'node', ,则构建步骤没有错误,但如果我尝试打开应用程序,我会得到:

App threw an error during load
Error: Electron failed to install correctly, please delete node_modules/electron and try installing again

重新安装节点模块没有帮助。

【问题讨论】:

【参考方案1】:

好的,我终于找到了适合我的解决方案。 'target' 选项应在webpack.config.js 中定义。而且它不应该是 target: 'node' ,就像我之前尝试过的那样

看起来,Webpack 对电子应用程序有特定的目标设置,因此正确的方法是设置它:


    // for files that should be compiled for electron main process
    target: 'electron-main'


    // for files that should be compiled for electron renderer process
    target: 'electron-renderer'

就是这样。只需要仔细阅读文档:- (

【讨论】:

由于某种原因这对我不起作用;我的 webpack 配置中存在一定程度的间接性,因为我通过 create-react-app 并使用 rescripts 指定 WebPack 目标。但是,我确定目标设置正确但我仍然无法解决 fs 等问题。 你找到解决办法了吗?【参考方案2】:

我在搜索中遇到了这个问题,我会提供一个改进的答案来处理仅在某些构建目标上发生的错误:

const config = 
    //basic module.exports rules here


module.exports = [
    config,
    
        ...config,
        target: 'web', //target that needs special rules, then all your other special config rules in this object
        node: 
            fs: 'empty'
        
    
]

【讨论】:

【参考方案3】:

添加到原始答案。如果您使用的是 Electron + Next.js,则需要在 next.config.js 文件中指定 target。如果您没有,请在应用程序的根级别(package.json 所在的位置)创建它。添加以下内容:

module.exports = 
  webpack: (config,  isServer ) => 
    if (!isServer) 
      config.target = "electron-renderer";
    
    return config;
  ,
;

【讨论】:

【参考方案4】:

试试这个

module.exports = 
  configureWebpack: 
    externals: 
      './cptable': 'var cptable'
    ,
    resolve: 
      fallback: 
        'fs': false,
        'crypto': false
      
    
  ,

【讨论】:

以上是关于Electron 和 TypeScript:“fs”无法解析的主要内容,如果未能解决你的问题,请参考以下文章

FS - 在 Webpack 5 上为 Electron 使用 FS

Electron 和 TypeScript (electron-builder):“不能在模块外使用 import 语句”

如何使用 React 和 TypeScript 设置 Electron?

Browserify / Electron / AngularJS 错误:fs.existsSync 不是函数

Typescript、React、Electron:不能在模块外使用 import 语句

如何在 Electron 中使用 fs 保存 PDF 文件?