alert(__dirname) 在电子应用程序中没有产生任何输出

Posted

技术标签:

【中文标题】alert(__dirname) 在电子应用程序中没有产生任何输出【英文标题】:alert(__dirname) not producing any output in an electron app 【发布时间】:2020-09-14 19:35:15 【问题描述】:

运行以下电子应用程序时,我没有得到所需的输出,即包含 pwd 作为输出的警报框。但是, index.html 中的注释行似乎工作正常。 chromium 窗口的开发者控制台显示“未捕获的 ReferenceError: __dirname is not defined at HTMLButtonElement.”。此 sn-p 逐字逐句(注释行除外)摘自 Steve Kinney 2019 年版的《Electron in action》一书。

有什么建议吗?

package.json如下


  "name": "bookmarker",
  "version": "1.0.0",
  "description": "electron app",
  "main": "./app/main.js",
  "scripts": 
    "start": "electron .",
    "test": "echo \"Error: no test specified\" && exit 1"
  ,
  "author": "Wasim Aftab",
  "license": "ISC",
  "dependencies": 
    "electron": "^9.0.0"
  

main.js如下

const app, BrowserWindow = require('electron');
let mainWindow = null;
app.on ('ready', () => 
    console.log('Hello, from electron');
    mainWindow = new BrowserWindow();
    mainWindow.webContents.loadFile(__dirname + '/index.html');
);

index.html如下

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta http-equiv="Content-Security-Policy" content="
default-src 'self';
script-src 'self' 'unsafe-inline';
connect-src *">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>Bookmarker</title>
</head>

<body>
    <h1>Hello from Electron</h1>
    <p>
        <button class="alert">Current Directory</button>
    </p>
</body>
<script>
    const button = document.querySelector('.alert');
    button.addEventListener('click', () => 
        alert(__dirname);
        // alert(window.location.pathname.replace(/[^\\\/]*$/, ''));
    );
</script>

</html>

【问题讨论】:

你想用alert(__dirname); 达到什么目的?打包后 __dirname 也不会是您所期望的,而是使用 app.getAppPathapp.getPath github.com/electron/electron/blob/master/docs/api/… 【参考方案1】:

__dirname是nodejs的概念,浏览器中不存在。

解决此问题的一种方法是将nodeIntegration 设置为true

mainWindow = new BrowserWindow(
    webPreferences: 
        nodeIntegration: true
    
);

另一种方法是使用预加载脚本(始终为预加载脚本启用 nodeIntegration):

mainWindow = new BrowserWindow(
    webPreferences: 
        preload: (__dirname + "/preload.js")
    
);

然后在preload.js文件中:

window.__dirname = __dirname

【讨论】:

感谢工作!我是这个领域的新手,我正在使用的书似乎有这种错误,你能给我推荐一本更好的书/资源来学习电子应用程序开发吗? 我不是读书人,但official electron guide 看起来很有帮助。 @WasimAftab 如果您对答案感到满意,请点赞并接受。谢谢【参考方案2】:

对于 electron v16.0.4,还需要添加 contextIsolation: false

$ npx electron --version
v16.0.4

    webPreferences: 
      nodeIntegration: true,
      contextIsolation: false,
      // enableRemoteModule: true,
    ,
  );

【讨论】:

以上是关于alert(__dirname) 在电子应用程序中没有产生任何输出的主要内容,如果未能解决你的问题,请参考以下文章

在节点模块中处理__dirname

使用反应在电子应用程序中构建的正确 loadURL?

使用 ES6 模块时 Node.js 中 __dirname 的替代方案

PHP路径相关 dirname,realpath,__FILE__

为啥 __dirname 没有在节点 REPL 中定义?

使用电子生成器后 EJS 不渲染