Electron&node实战笔记(一) main.js文件讲解 DOM文档的加载顺序_html,css,js 解决require is not defined问题 主进程和渲染进程的通信

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

示例代码:

DOM文档的加载顺序是由上而下的顺序加载;

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的原因,在上面已经给出了解决方法。

发布了165 篇原创文章 · 获赞 24 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/treblez/article/details/104066848