main.js文件讲解
1.const {app, BrowserWindow} = require(‘electron’)
cs6解构赋值,可以将属性/值从对象/数组中取出,赋值给其他变量。
electron中对于app,BrowserWindow分别赋值了
2.const path = require(‘path’)
提供了处理文件路径的小工具,node课程中讲过
3.let mainWindow
Keep a global reference of the window object, if you don’t, the window will
be closed automatically when the JavaScript object is garbage collected.
保持窗口对象的全局引用,如果你不这样做,窗口将会在JavaScript对象被垃圾回收时自动关闭。
DOM文档的加载顺序_html,css,js
示例代码:
1、DOM加载到link标签
css文件的加载是与DOM的加载并行的,也就是说,css在加载时Dom还在继续加载构建,而过程中遇到的css样式或者img,则会向服务器发送一个请求,待资源返回后,将其添加到dom中的相对应位置中;
2、DOM加载到script标签
由于js文件不会与DOM并行加载,因此需要等待js整个文件加载完之后才能继续DOM的加载,倘若js脚本文件过大,则可能导致浏览器页面显示滞后,出现“假死”状态,这种效应称之为“阻塞效应”;会导致出现非常不好的用户体验;
而这个特性也是为什么在js文件中开头需要$(document).ready(function(){})或者(function(){})或者window.onload,即是让DOM文档加载完成之后才执行js文件,这样才不会出现查找不到DOM节点等问题;
js阻塞其他资源的加载的原因是:浏览器为了防止js修改DOM树,需要重新构建DOM树的情况出现;
3、解决方法
前提,js是外部脚本;
在script标签中添加 defer=“ture”,则会让js与DOM并行加载,待页面加载完成后再执行js文件,这样则不存在阻塞;
在scirpt标签中添加 async=“ture”,这个属性告诉浏览器该js文件是异步加载执行的,也就是不依赖于其他js和css,也就是说无法保证js文件的加载顺序,但是同样有与DOM并行加载的效果;
同时使用defer和async属性时,defer属性会失效;
可以将scirpt标签放在body标签之后,这样就不会出现加载的冲突了。
解决require is not defined问题
在渲染进程的js文件中,如果使用了node语法,会出现浏览器无法识别的问题。
所以需要通过工具browserify或者是webpack把js文件编译一下,转成浏览器端可识别的。
但是!根本原因是最新的[email protected]系列中,nodeIntegration参数,默认改成false了。而在以前版本的electron中,这个nodeIntegration参数,默认为true
所以,应该在BrowserWindow的nodeIntegration: true
主进程和渲染进程的通信
渲染进程通过ipcRenderer向主进程发送响应和接受响应
const {ipcRenderer} =require('electron')
function init(){
ipcRenderer.on('asynchronous-reply',(event,arg)=>{
alert("web2"+arg)
})
}
function say_hello(){
const {ipcRenderer} =require('electron')
ipcRenderer.send('asynchronous-message','ping')
}
相应的,主进程通过ipcMain接收响应
const{ipcMain}=require('electron')
ipcMain.on('asynchronous-message', (event, arg) => {
console.log("mian1" + arg) // prints "ping"
event.sender.send('asynchronous-reply', 'pong')//在main process里向web page发出message
})
失败的话记得使用浏览器调试工具
可能是require is not defined的原因,在上面已经给出了解决方法。