Electron中关于静态资源加载问题的解决方案

 更新时间:2024年12月20日 08:51:47   作者:_island  
通常,我们在使用electron框架的时候会使用到loadFile/loadURL进行页面的加载,分别是加载本地文件和加载网络文件,当nuxtjs/nextjs想引入到electron中显示时,你会遇到资源路径引用的问题,所以本文给大家介绍了Electron中关于静态资源加载问题的解决方案

Electron中的关于静态资源加载问题解决方案

今天来给大家分享一个比较实用的npm包,electron-serve

它是用来干嘛的呢

通常,我们在使用electron框架的时候会使用到loadFile/loadURL进行页面的加载,分别是加载本地文件和加载网络文件

在构建生产环境中,当我们使用loadFile加载本地文件的时候可能会出现资源找不到的情况,(net::ERR FILE NOT FOUND

这是因为我们构建出来的产物中资源引入路径出现了问题

比如您使用了Vite构建工具,您需要在vite.config.tsbase属性设置为./,告诉Vite我的资源路径都是相对于当前页面的目录的

那么,在electron中引入是没问题的,但事情总不是那么一帆风顺的

nuxtjs/nextjs想引入到electron中显示时,你会遇到资源路径引用的问题(如下图)

那么这个问题怎么解决,前面我们提到只要将base设置./,就可以解决这个问题,但在nuxt中这并不能生效

它还是以一个绝对路径的方式去寻找它的依赖,所以还是会出现找不到的问题

这个时候,我们可以换一种解决方式,不应该一头扎进base

我们是不是可以像开发环境一样开一个devServer来解决这个问题?

electron-serve

这就到了本篇文章的主角,electron-serve登场了

pnpm install electron-serve

它是一个在electron中开启静态服务器的npm包,让我们可以以网络协议的方式去访问我们的静态资源

我们使用它也是很简单的,只要在electron主线程中的main.js/ts中引入它,并调用它的serve方法即可

import serve from 'electron-serve'

// 这里填写我们的静态资源目录
serve({ directory: 'renderer' })


function createWindow() {
  const mainWindow = new BrowserWindow({
    width: 1000,
    height: 800,
  })
  // 通过app协议去访问静态资源,这个是electron-serve中处理的,我们只需要这样子写就可以了
  mainWindow.loadURL('app://./index.html')
}

配置好之后,我们再运行一下项目,这时你就会发现找不到资源的问题已经得到解决了

另外,这个库还解决了一个问题:当我们使用loadFile加载本地文件时,是无法正常使用vue-router/react-router中的history模式的。因为这些路由机制依赖于history.pushState,因为loadFile使用的是file协议,会导致找不到对于路径的资源

electron-serve的实现原理

翻看了下源码,发现electron-serve的实现原理很简单

  • 大致分为下面两步
    • electron时,创建一个会话(或者使用外部传入的会话)
    • 先是注册了一个特定的协议为app(这个参数是可以外部传入的,默认为App),告诉electron当遇到这个app协议的时候,应该使用提供的hander函数进行处理

handler函数实现

const handler = async (request, callback) => {
    // 获取index文件路径,访问时路径时跳转index.html
		const indexPath = path.join(options.directory, `${options.file}.html`);
    // 处理请求的路径文件
		const filePath = path.join(options.directory, decodeURIComponent(new URL(request.url).pathname));
    // 获取相对路径
		const relativePath = path.relative(options.directory, filePath);
    // 判断路径是否准确,如果不正确则返回错误
    // ..说明为上级目录或者绝对路径,返回错误
		const isSafe = !relativePath.startsWith('..') && !path.isAbsolute(relativePath);

		if (!isSafe) {
			callback({error: FILE_NOT_FOUND});
			return;
		}
    // 最终得到的路径
		const finalPath = await getPath(filePath, options.file);
    // 获取文件的后缀
		const fileExtension = path.extname(filePath);
    // 判断文件是否为html或者asar(electron中的一种压缩包格式),如果不是则返回错误
		if (!finalPath && fileExtension && fileExtension !== '.html' && fileExtension !== '.asar') {
			callback({error: FILE_NOT_FOUND});
			return;
		}
    // 最后返回资源路径
		callback({
			path: finalPath || indexPath,
		});
	};

到此这篇关于Electron中关于静态资源加载问题的解决方案的文章就介绍到这了,更多相关Electron静态资源加载问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript实现将数组数据添加到Select下拉框的方法

    JavaScript实现将数组数据添加到Select下拉框的方法

    这篇文章主要介绍了JavaScript实现将数组数据添加到Select下拉框的方法,涉及javascript数组操作及页面元素动态赋值的相关技巧,需要的朋友可以参考下
    2015-08-08
  • JavaScript中Map与reduce的应用小结

    JavaScript中Map与reduce的应用小结

    Map构造函数创建一个新Map对象,它允许以键值对的形式存储数据,提供了一种更加灵活的数据结构,本文给大家介绍JavaScript中Map与reduce的应用小结,感兴趣的朋友一起看看吧
    2024-06-06
  • 前端实现界面切换主题代码示例

    前端实现界面切换主题代码示例

    这篇文章主要介绍了前端实现界面切换主题的相关资料,文中介绍了两种方法,通过link标签的rel属性和通过变量设置,前者适用于确定的主题样式切换,后者则适用于在拾色器中任意选择颜色更换主题的情况,需要的朋友可以参考下
    2025-02-02
  • VSCode中如何利用d.ts文件进行js智能提示

    VSCode中如何利用d.ts文件进行js智能提示

    这篇文章主要给大家介绍了关于VSCode中如何利用d.ts文件进行js智能提示的相关资料,文中通过图文以及示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2018-04-04
  • 简单聊聊JavaScript的事件循环机制

    简单聊聊JavaScript的事件循环机制

    前端开发的童鞋应该都知道,JavaScript是一门单线程的脚本语言,这就意味着JavaScript 代码在执行的时候,只有一个主线程来执行所有的任务,同一个时间只能做同一件事情,这篇文章主要给大家介绍了关于JavaScript事件循环机制的相关资料,需要的朋友可以参考下
    2022-03-03
  • JS高仿抛物线加入购物车特效实现代码

    JS高仿抛物线加入购物车特效实现代码

    本篇文章主要介绍了JS高仿抛物线加入购物车特效实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-02-02
  • JS实现验证码倒计时的注册页面

    JS实现验证码倒计时的注册页面

    这篇文章给大家分享一段实例代码发送验证码之后开始60S倒计时功能,具体实例代码大家参考下本文
    2018-01-01
  • layui 阻止图片上传的实例(before方法)

    layui 阻止图片上传的实例(before方法)

    今天小编就为大家分享一篇layui 阻止图片上传的实例(before方法),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • 用window.onerror捕获并上报Js错误的方法

    用window.onerror捕获并上报Js错误的方法

    这篇文章主要介绍了用window.onerror捕获并上报Js错误的方法,需要的朋友可以参考下
    2016-01-01
  • 两个JS之间的函数互相调用方式

    两个JS之间的函数互相调用方式

    这篇文章主要介绍了两个JS之间的函数互相调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03

最新评论