<body>
<p id="click-me">Click me!</p>
...
<script src="node_modules/jquery/dist/jquery.min.js"></script> //jQuery should be loaded now
<script>$("#click-me").click(() => {alert("Clicked")});</script>
</body>
上面的代码无法运行。实际上,打开DevTools,转到控制台视图,然后单击
<p>
元素。您应该看到function $ is not defined
或类似的东西。#1 楼
更好,更通用的IMO解决方案:<!-- Insert this line above script imports -->
<script>if (typeof module === 'object') {window.module = module; module = undefined;}</script>
<!-- normal script imports etc -->
<script src="scripts/jquery.min.js"></script>
<script src="scripts/vendor.js"></script>
<!-- Insert this line after script imports -->
<script>if (window.module) module = window.module;</script>
使用相同的代码可同时用于浏览器和电子产品
解决所有第三方库(不仅仅是jQuery)的问题,而不必指定每个库
脚本构建/打包友好(即将所有脚本都咕unt咕Gu地打包到vendor.js中)
不需要
node-integration
为假此处来源
评论
@fareednamrouti是的,但是此解决方案的要点是您不必列出第三方库(它可以工作!)。导入许多库(或自捆绑脚本)时非常方便
–戴尔·哈德斯(Dale Harders)
16年8月15日在1:47
谢谢!就我而言,此解决方案也适用于d3或更早版本的d3
–不利因素
16-10-5在18:57
@DaleHarders事实证明window.module以与module相同的值开头,因此您的代码无法按预期工作。正确的方法是将模块保存到其他(未使用的)窗口属性中,例如window.tempModule。要确认我的意思,请在最后一条语句后尝试console.log(module),以验证现在module === undefined。
– Lucio Paiva
16-11-5在23:15
@Lucio Nope。我们需要保存到window.module,因为这是第三方库期望的位置(浏览器环境)。我认为您在混淆Node.js和浏览器环境。该技巧有助于开发,因此您的代码可以在浏览器AND节点/电子中运行,而无需任何其他配置。还有许多其他方法可以做到这一点,但这是最简单的恕我直言。
–戴尔·哈德斯(Dale Harders)
16年4月4日在5:59
对于CSP,这是有问题的-没有内联脚本
–特雷弗
18 Mar 20 '18在4:35
#2 楼
如https://github.com/atom/electron/issues/254所示,此问题是由于以下代码引起的:if ( typeof module === "object" && typeof module.exports === "object" ) {
// set jQuery in `module`
} else {
// set jQuery in `window`
}
jQuery代码“看到”它在CommonJS环境中运行并且忽略
window
。该解决方案确实很简单,而不是通过<script src="...">
加载jQuery,您应该像这样加载:<script>window.$ = window.jQuery = require('./path/to/jquery');</script>
注意:路径前的点是必需的,因为它指示它是当前目录。另外,请记住在加载依赖于它的任何其他插件之前先加载jQuery。
评论
谢谢,但是我有一个由yeoman创建的角度系统。 Grunt接受了我所有的Bower依赖项并将它们构建到vendor.js文件中。如何加载jquery,修复您的行并继续需要jquery的其他Bower依赖项?
–bluesky777
2015年10月7日23:10
我不明白,vendor.js里面有jquery?如果是这样,您可以使用window。$方法afaik加载vendor.js。
–布鲁诺·瓦兹(Bruno Vaz)
2015年10月10日,下午2:01
在链接的问题后面的一些评论中有一个更好的解决方案:'node-integration':false作为BrowserWindow的选项。
– Boldewyn
15年12月17日在15:55
这不会影响其他事情吗?
–布鲁诺·瓦兹(Bruno Vaz)
15年12月18日在16:57
#3 楼
电子常见问题解答:http://electron.atom.io/docs/faq/
我不能在其中使用jQuery / RequireJS / Meteor / AngularJS Electron。
由于Electron的Node.js集成,在DOM之类的模块(导出,需求)中插入了一些额外的
符号。这
导致某些库出现问题,因为它们想插入具有相同名称的
符号。
要解决此问题,可以在Electron中关闭节点集成:
//在主过程中。
let win = new BrowserWindow({
webPreferences: {
nodeIntegration: false } });
但是,如果要保留使用Node.js和Electron API的功能,则必须重命名包括其他库之前的页面中的符号:
<head>
<script>
window.nodeRequire = require;
delete window.require;
delete window.exports; delete window.module;
</script>
<script type="text/javascript" src="jquery.js"></script>
</head>
评论
@ Fran6如果要加载外部页面怎么办? :(
– geoorgiosd
16 Dec 17'在16:36
这可以正常工作,但是执行此操作后,我的Electron应用程序将无法关闭-也就是说,我无法退出网页。
–tale852150
17年8月4日在20:13
#4 楼
<script>window.$ = window.jQuery = require('./path/to/jquery');</script>
的另一种书写方式是:<script src="./path/to/jquery" onload="window.$ = window.jQuery = module.exports;"></script>
评论
我发现这是最佳答案,因为我仍然可以使用CDN!无需覆盖任何内容。
– patotoma
19年6月1日19:02
#5 楼
刚刚遇到了同样的问题npm install jquery --save
<script>window.$ = window.jQuery = require('jquery');</script>
为我工作
评论
这正是我最初的回答。
–布鲁诺·瓦兹(Bruno Vaz)
16-10-9在19:04
嗨,如何使用materialize.min.jscdnjs.cloudflare.com/ajax/libs/materialize/0.98.2/js/…做同样的事情。 ..类似这样的
评论
为什么不只使用电子要求功能呢?