在预加载脚本(Electron BrowserWindow)中需要JQuery时,文档未定义

在预加载脚本(Electron BrowserWindow)中需要JQuery时,文档未定义,jquery,node.js,electron,Jquery,Node.js,Electron,我找到了一个解决方法,但我不理解过程中文档的问题。一旦('loaded') require('jquery') 在一个electron中(使用webPreferences.nodeIntegration=true),我使用window.JQuery=window.$=require('JQuery')加载JQuery 我宁愿避免使用nodeIntegration,而是在预加载脚本中定义所有require: process.once('loaded',()=>{ console.log(“文档”,

我找到了一个解决方法,但我不理解
过程中
文档的问题。一旦('loaded')

require('jquery')
在一个electron中(使用
webPreferences.nodeIntegration=true
),我使用
window.JQuery=window.$=require('JQuery')加载JQuery

我宁愿避免使用
nodeIntegration
,而是在预加载脚本中定义所有
require

process.once('loaded',()=>{
console.log(“文档”,文档);
global.jQuery=global.$=require('jQuery');
});
问题在于,
require
抛出错误:

无法加载预加载脚本:{hiddenPath}\app\windows\main\preload.js

此错误隐藏:

未捕获的TypeError:无法读取未定义的属性“createElement” at assert({hiddenPath}\node\u modules\jquery\dist\jquery.js:899:20)

我去检查文件(第899行的jquery.js),它是
var el=document.createElement(“fieldset”)。错误说明
文档
未定义,但正上方的
控制台.log
显示它。。。 为什么jquery.js不知道
文档

我找到的解决方案/解决方法 在
窗口中需要JQuery(如果需要,还需要引导)。onload

window.onload=函数(){
window.jQuery=window.$=require('jQuery');
window.Bootstrap=require('Bootstrap');
log('JQuery和Bootstrap已加载');
}
process.once('loaded',()=>{
global.ipcRenderer=require('electron').ipcRenderer;
});
然后我遇到了“未捕获的引用错误:$未定义” 我加载了多个需要JQuery才能工作的JS脚本,以及一个调用每个“启动”函数的“主文件”(
init.JS

head
标签(pug文件):

init.js

$(文档).ready(函数(){
initother();//在'anotherScript.js'中
initRPC();//在“rpc.js”中
/*还有一些,为了简洁而隐藏*/
});
以下是控制台日志:

未捕获引用错误:$未在init.js中定义:1

JQuery和Bootstrap已加载

$('#btnSubmit')//我在控制台中手动执行此操作,它会找到按钮:因此JQuery可以工作

在预加载脚本中,
init.js
似乎是在
window.onload
之前加载的

我发现的解决方案/解决方案: Mmove
$(document).ready()
在预加载脚本中:

window.onload=函数(){
window.jQuery=window.$=require('jQuery');
window.Bootstrap=require('Bootstrap')/>未捕获类型错误:无法读取Bootstrap.bundle.min.js:6处未定义的属性'fn'
log('JQuery和Bootstrap已加载');
$(文档).ready(函数(){
initother();
initRPC();
});
}
这不是一个问题,只是一个细节,但是:是否还有其他类似于
window.onload
的事件,在让JQuery首先加载之前触发?
我尝试了
window.onloadstart
,但这不起作用

我的最终代码: /main.js

“严格使用”
const{app}=require('electron');
const setupPug=require('electron-pug');
const main=require('./windows/main');
异步函数Init(){
试一试{
让帕格=等待设置帕格({pretty:true});
pug.on('error',err=>console.error('electron-pug error',err));
}捕捉(错误){
console.log('cannotinitiatepug',err);
}
main.Create();
}
应用程序开启(“就绪”,初始);
/*为了简洁而隐藏*/
/windows/main/index.js

const{BrowserWindow}=require('electron');
const path=require('path');
让win=null;
函数Create(){
如果(赢)返回;
win=新浏览器窗口({
宽度:800,
身高:600,
网络首选项:{
preload:path.join(uu dirname,'./preload.js'),
},
});
loadURL(`file://${\uu dirname}/view.pug`);
/*为了简洁而隐藏*/
}
module.exports={
创造,,
}

使用jquery所做的一切就是将其保存到窗口中。为什么你正在加载的网站不能这样做呢?它不是一个真正的网站,它是一个电子网站(我编辑了我的帖子),我需要将我的
[…]=require('jquery')
从我的pug文件移到一个预加载脚本,以防止使用
nodeIntegration=true
选项。我的意思是你的浏览器窗口应该正确加载页面?预加载脚本适用于窗口需要加载第三方内容的情况。如果您不这样做,您就不需要预加载。如果我理解您的意思,JQuery不能在预加载脚本中
require
,因为JQuery不是“真正”的NodeJS模块,所以我必须将其导入到pug/html文件中?您是对的,我的预加载脚本在窗口上加载了一些其他nodejslib(如
ipcrederer
pug
,…),它们工作正常。现在我用
script
导入,我编辑了我的问题,因为有几件事我不明白。不,这不是我真正想说的。使用jquery所做的一切就是将它粘贴到窗口对象上,这样它就可以在加载到窗口中的页面中使用。为什么这是必要的?为什么该页面不能加载jquery?你能控制它吗?您的浏览器窗口是否实际加载了任何网站或文件?您是否有任何
loadURL
loadFile
呼叫?
head
  link(rel='stylesheet', href='../../../node_modules/bootstrap/dist/css/bootstrap.min.css')

  script(src='./clientJS/anotherScript.js')
  script(src='./clientJS/rpc.js')
  script(src='./clientJS/init.js')