electron 与 jquery 不得不说的故事,如何解决 require 函数冲突问题
发布于 作者:苏南大叔 来源:程序如此灵动~electron
基于node是个不争的事实,而jquery
在市面上的普及度,也是有目共睹的。虽然近些年来,被react
、vue
们抢了不少市场。但是,姜还是老的辣,jquery
的普及度还是不可小觑的。
在本文的经验分享中,苏南大叔将要描述的是:electron
和jquery
的冲突何在,如何让两者和平共处。
update210529:随着
electron
的版本更新,本文有后续新文章。见下面的网址:
- 《electron和jquery,不同electron版本下的冲突引发因素对比》 https://newsn.net/say/electron-jquery-2.html
症状描述
本文还是以改造版的quick-start
项目为例,加载的网站还是 https://electron.org.cn 。
electron
使用BrowserWindow
加载url,nodeIntegration
参数不设置(默认为true)。- 网站代码内使用了
jquery
这个库。
下面的对比图中,左侧是chrome
正常加载,右侧是通过electron
加载。
那么我们可以明显看到,electron
加载的网页,提示jquery is not defined
。nodeIntegration
默认值是true
,意思就是为页面中注入node
相关能力。但是node
相关代码的加载方式和jquery
冲突。
方案一:还原网页的本来面目,去除node
功能加持
如果你不能修改被加载网页的代码的话,那么本条目是你的解决方案。见下图。
方案代码就是:
webPreferences:{
nodeIntegration:false
}
我们可以手动关闭nodeIntegration
。
方案二,和平共处,jquery做妥协
这个和平共处方案比较不错,需要修改页面代码。但是不用修改node
的函数名。主进程中的nodeIntegration
,还是保持开启。在渲染进程里面,换成下面的方式加载jquery.js
,而不是使用传统的加载方式。
window.$ = window.jQuery = require("./jquery.js");
下面的是一个变种代码,大家可以试试:
if(typeof module==="object"){
window.jQuery=window.$=module.exports;
}
这种方案需要注意的就是:jquery.js
需要放置在本地,而不能加载网络地址。然后,路径必须写相对路径。路径中的./
是不能省略的。否则,就会提示找不到模块。
方案三,和平共处,node
做妥协
本解决方案适用于,你能修改项目源码的情况。main.js
中开启nodeIntegration
(或者使用默认值),而渲染页面中,对node
相关模块进行处理。
main.js
:
webPreferences:{
nodeIntegration:true
}
渲染页面:
方案三,效果展示截图
为了更好的演示本方案,这个修改版的quick-start
暂时还原其本来面目。下面的对比图将演示:开启nodeIntegration
,如何影响页面中使用node
相关功能函数。
相关的调用代码是这样的。
为了演示和jquery
的冲突关系,苏南大叔增加了jquery
相关的代码。如下图:
不开启nodeIntegration
的话,则显示为node
相关函数错误。
开启nodeIntegration
之后,不对代码进行改造,则显示为jquery
相关函数错误。
开启nodeIntegration
之后,再对页面中的代码进行改造,两者和平共处。
总结
对于大多数情况来说,方案二或者方案三,应该是你最好的解决方案。当然,本文的两个解决方案,不仅仅适用于jquery
,还适用于其他的常见js
类库,例如:RequireJS
或者 AngularJS
等等。
想get到苏南大叔带来的更多electron
实战技巧吗?请点击这里:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
隐藏内容解锁
不错不错 评论可见内容
感谢分享
厉害了
00
支持博主
不邋啊
kkkkk
看下不可见内容
评论可见内容是什么
就想看个方案三……
看看方案三~~~~~
顶
试试方案三
看下隐藏内容
太直白了...
评论可见内容是什么
方案三效果不错~