我们可以把preload放在public下,然后通过区分生成环境和开发环境并配合使用__dirname传入不同的路径到preload属性(__dirname是指当前文件运行的绝对路径,可以通过require(‘path’)拼接点点斜杠…/来获取上层目录)。
但这里有一个很大的隐患:由于放在public下,webpack并不会处理,只是简单的复制到资源目录,用户拿到应用程序后,preload.js是源码存放在磁盘中,即使在打包后的应用程序依然可以找到preload.js文件,并通过修改它来执行恶意代码。
使用node的功能创建preload.js文件,然后用file协议指向它,每次执行之前都再创建一次并覆盖之前的preload.js。这样即使用户改了,也会在执行之前还原成我本身的js文件。
经过上述配置之后,无论是生产环境还是开发环境preload.js文件都是经过webpack处理的,用户无法直接看到源码,稍微增加了修改preload.js来执行恶意代码的难度
这里可以用上面提到的方法引入到渲染进程的webview,即在渲染进程中通过区分生产环境和开发环境并配合使用__dirname传入不同的路径到preload属性。但不推荐这么做,因为渲染进程的.vue文件,与打包后的preload.js文件的目录可能会因为各种原因发生改变,而且如果不给webview开启nodeIntegration的话是无法访问__dirname的,以致于无法得到正确的路径。
这里我想到了一种较好的办法,既然官方教程是在主进程中使用path.join(__dirname, ‘preload.js’)来指向它,那这个指向肯定不会出错,比自己找相对路径要稳妥很多。既然这样那我把path.join(__dirname, ‘preload.js’)返回的路径字符串传到渲染进程中webview的preload不就行了!马上实验一下,果然可以。
主进程传值给渲染进程可以通过ipc实现,在渲染进程的created钩子中,发送消息给主进程,主进程回应preload的路径即可拿到
又或者使用global共享变量: