如何在Electron中钩住来自javascript的文件请求以生成正确的路径?

如何在Electron中钩住来自javascript的文件请求以生成正确的路径?,javascript,node.js,electron,Javascript,Node.js,Electron,我正在创建一个电子应用程序,在此过程中,我试图使用一些现有的javascript和其他文件(css和其他资源)。我的代码分布在多个包中,每个包都包含这些文件。在Electron之外,这些文件将由一个服务器提供,该服务器提供从文件平面列表到每个文件路径的映射,如果存在这种情况,我将尝试在Electron的“后端”中实现类似的“服务器端”功能 由于Electron是从文件://协议获取这些文件的,因此找不到大多数文件,因为所有内容都是相对于当前javascript文件的路径解析的,这些文件彼此不了解

我正在创建一个电子应用程序,在此过程中,我试图使用一些现有的javascript和其他文件(css和其他资源)。我的代码分布在多个包中,每个包都包含这些文件。在Electron之外,这些文件将由一个服务器提供,该服务器提供从文件平面列表到每个文件路径的映射,如果存在这种情况,我将尝试在Electron的“后端”中实现类似的“服务器端”功能

由于Electron是从
文件://
协议获取这些文件的,因此找不到大多数文件,因为所有内容都是相对于当前javascript文件的路径解析的,这些文件彼此不了解,因此无法指定硬编码路径

Electron中是否有某种机制来钩住文件请求,以便我可以提供路径供其查看?在我的服务器端代码中,我使用一个对象将文件名映射到它们所在的路径,我觉得解决方案类似于拦截请求并告诉Electron在哪里查找每个文件


我发现,但那里提供的解决方案对我不起作用,因为我的web应用程序有点过于动态,请求来自代码的深处,而不是我可以捕获的某些用户界面元素。

您可以通过拦截文件协议处理程序来实现这一点。如果您已将文件映射设置为如下所示的对象:

files = {
    "file1.js": "/path/to/file1.js",
    "file2.js": "/path/to/file2.js",
    // etc.
}
然后在createWindow函数中,您将在实例化新BrowserWindow后立即插入以下代码:

protocol.interceptFileProtocol("file", (req, cb) => {
    var file = req.url.split("/")
    file = file[file.length-1]
    if (files[file]) {
        console.log(`intercepting ${file} => ${files[file]}`)
        cb({path:files[file]})
    }
})
此代码假定文件名是唯一的,并且是路径中唯一重要的部分。例如,不管代码认为“file1.js”在哪个路径中,在上面的示例中,它都会被重定向到
/path/to/file1.js
。如果请求的文件不存在,则行为未定义,可能不会加载任何内容