0
点赞
收藏
分享

微信扫一扫

Electron学习

七公子706 2022-01-20 阅读 52

Electron的简介

Electron基于chromium和Node.js,让我们可以使用Javascript,HTML,CSS构建跨平台的桌面应用程序,同时Electron兼容Mac,Window,和Linux,可以构建出三个平台的应用程序

Electron的安装

  1. 运行cmd,
  2. 输入npm init,然后一直按enter换行即可
  3. 输入cnpm i electron -S   (如果电脑没有安装cnpm会报错,需要安装cnpm,安装步骤:运行cmd,输入命令npm install -g cnpm --registry=https://registry.npm.taobao.org

安装的是10.1.5的electron,cnpm i – S electron@10.1.5,新版本的remote取消了,所以使用老版本的

1.创建main.js文件

//app(控制应用程序的事件生命周期)BrowserWindow创建并控制浏览器窗口

const {app,BrowserWindow} = require('electron')

// 监听初始化完成的生命周期

app.on('ready', ()=>{

  new electron.BrowserWindow({

    width: 800,

    height: 300

  })

})

```

2.创建窗口

app.on('ready', ()=>{

  const mainWindow = new BrowserWindow({

    width: 800,

    height: 500

  })

  mainWindow.loadFile('./index.html')  //展示页面

})

3.解决每次数据更新都要重新启动的问题,实现自动刷新页面
安装插件
Cmp命令行输入  cnpm install --save-dev electron-reloader
然后在main.js中启动热加载

//启动热加载,自动刷新

const reloader = require('electron-reloader')

reloader(module)

 

4.Electron页面中按ctrl+shift+i可以弹出调试页面

5.自定义原生菜单

  5.1首先提供frame创建无边框窗口

  //通过frame创建无边框窗口

    frame:false,

5.2在index.html中自定义菜单,通过css,js修饰

6.1打开对话框读取文件

/打开文件
 const fileopen = function() {
 const res = dialog.showOpenDialogSync({
})
//得到选中的文件地址
console.log(res[0])

//读取对应文件中的数据,并转化为字符型
const filecontent = fs.readFileSync(res[0]).toString()
console.log(filecontent)

//将文件内容展示到textarea中
textareavalue.value = filecontent

 }

 

 

保存文件

//保存文件
const saveFile = function() {
  const res = dialog.showSaveDialogSync({
  })
  console.log(textareavalue.value)
  fs.writeFileSync(res,textareavalue.value)
}

 

7.1渲染进程和主线程通讯

定义事件

  <li class="closeWindow">关闭窗口</li>


+ 事件函数

 //点击关闭窗口

closeWindow.onclick = function() {

 console.log(123)

 ipcRenderer.send('close-window')

}



+ 主线程定义事件

ipcMain.on('close-window',()=>{

  mainwindow.close()

})



+ 传参


  ```js

  let windowSize = 'unmax-window'

  function maxWindow() {

    windowSize = windowSize === 'max-window' ?'unmax-window':'max-window'

    ipcRenderer.send('max-window',windowSize)

  }

  ```


+ 接收参数


  ```js

  ipcMain.on('max-window', (event,arg) => {

      console.log(arg)

      if(arg === 'unmax-window') return mainWindow.maximize();

      mainWindow.unmaximize()

    })

8.electron打包

1.安装electron-packager

cmd命令行输入cnpm i electron-packager -D

然后在package.json添加打包命令

"build": "electron-packager ./ HelloWorld --platform=win32 --arch=x64 --out ./outApp --overwrite --icon=./favicon.ico"

 

9.electron结合vue框架开发

在项目中安装electroncmd命令行输入cnpm i electron

// 添加electron启动配置

  "main": "main.js",

  "scripts": {

     "start": "react-scripts start",

     "build": "react-scripts build",

     "test": "react-scripts test",

     "eject": "react-scripts eject",

     "electron": "electron ."

    },

  ```


//配置main.js

  const {app, BrowserWindow} = require('electron')

  

  function createWindow () {

    // Create the browser window.

    const mainWindow = new BrowserWindow({

      width: 800,

      height: 600

    })

    // Open the DevTools.

    // mainWindow.webContents.openDevTools()

  }

  

  app.on('ready', () => {

    createWindow()

  })

  ```


//加载vue项目

  

  mainWindow.loadURL('http://localhost:8080/')

使用electron做一个简单的应用程序,界面没有怎么设置,主要是学习electron

 

 代码部分:

目录结构:

index.html:


<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./css/index.css">
    <style>
        /* 背景图片设置 */
        body {
            background: url("images/background.jpg") no-repeat;
            background-size: cover;
        }

        img {
            width: 100%;
            height: 100%;
        }

        .hzw {
            width: 960px;
            height: 300px;
            overflow: hidden;
            margin: 0 auto;
            margin-top: 400px;
        }

        /* 海贼王人物栏设置 */
        .lf {
            float: left;
            position: relative;
            width: 300px;
            height: 300px;
            background-color: pink;
            overflow: hidden;
            margin-right: 20px;
        }

        /* 阴影盒子部分 */
        .shadow {
            position: absolute;
            top: 50px;
            left: 50px;
            width: 200px;
            height: 200px;
            border: 100px solid rgba(0, 0, 0, 0.6);
            /* 怪异盒模型 */
            box-sizing: border-box;
            /* 设置怪异盒为圆形     */
            border-radius: 50%;
            /* 放大四倍 */
            transform: scale(4);
            /* 设置过渡时间 */
            transition: 2s;

        }

        /* 鼠标经过人物栏阴影以圆形方式散开 */
        .lf:hover .shadow {
            border: 1px solid rgba(0, 0, 0, 0.6);
        }
    </style>
</head>

<body>
  <div class="custom-menu">
    <ul>
      <li class="new-window">新建窗口</li>
      <li><a href="http://hong619068.3vzhuji.net/">关于我们</a></li>
      <li class="closeWindow">关闭窗口</li>
      <li class="maxWindow">全屏</li>
      <li class="umaxWindow">小屏</li>
    </ul>
  </div>
    <div class="hzw">
        <div class="lf">
            <img src="images/as.webp" alt="">
            <div class="shadow"></div>
        </div>
        <div class="lf">
            <img src="images/as1.webp" alt="">
            <div class="shadow"></div>
        </div>
        <div class="lf">
            <img src="images/hzw.webp" alt="">
            <div class="shadow"></div>
        </div>
    </div>
    <div>
      <button onclick="fileopen()">打开文件</button>
      <button onclick="saveFile()">保存文件</button>
    </div>
    <textarea  >文件内容显示</textarea>
    
    <script src="./js/index.js"></script>
</body>

</html>

index.js:

//通过remote使用主进程的方法
//dialog打开本地文件
//通过ipcRenderer与主线程通讯
const {remote: {BrowserWindow,dialog} ,shell,ipcRenderer} = require('electron')

//通过FS模块对文件进行读取
const fs = require('fs')

//获取事件
const newWindow = document.querySelector('.new-window')
const closeWindow = document.querySelector('.closeWindow')
const maxWindow = document.querySelector('.maxWindow')
const umaxWindow = document.querySelector('.umaxWindow')
//点击新建窗口
newWindow.onclick = function () {
  new BrowserWindow({
    width: 200,
    height: 300
  })
}
//点击关闭窗口
closeWindow.onclick = function() {
 console.log(123)
 ipcRenderer.send('close-window')
}
//点击显示全屏
maxWindow.onclick = function() {
  ipcRenderer.send('max-window')
}
//点击显示小屏
umaxWindow.onclick = function() {
  ipcRenderer.send('umax-window')
}


//点击a链接跳转
const allA = document.querySelectorAll('a')

allA.forEach(item=>{
  item.onclick = function(e) {
    //阻止a链接自动跳转默认行为
    e.preventDefault()
    //默认用谷歌浏览器打开链接
    shell.openExternal(item.href)
  }
})

const textareavalue = document.querySelector('textarea')

//打开文件
 const fileopen = function() {
 const res = dialog.showOpenDialogSync({
})
//得到选中的文件地址
console.log(res[0])

//读取对应文件中的数据,并转化为字符型
const filecontent = fs.readFileSync(res[0]).toString()
console.log(filecontent)

//将文件内容展示到textarea中
textareavalue.value = filecontent

 }

 //保存文件
const saveFile = function() {
  const res = dialog.showSaveDialogSync({
  })
  console.log(textareavalue.value)
  fs.writeFileSync(res,textareavalue.value)
}

 main.js:

//app(控制应用程序的事件生命周期),BrowserWindow创建并控制浏览器窗口
//Menu菜单
const {app,BrowserWindow,Menu, shell,globalShortcut,ipcMain} = require('electron')

    

//启动热加载,自动刷新
const reloader = require('electron-reloader')
reloader(module)

//监听初始化完成的生命周期
app.on('ready',() =>{
  const mainwindow = new BrowserWindow({
    width:1000,
    height:1000,

    //通过frame创建无边框窗口
    frame:false,

    webPreferences: {
      // 开启node模块
      nodeIntegration: true,
      // 开启remote模块
      enableRemoteModule: true
    }
   

  })

  //主线程接收渲染进程信号,关闭窗口
ipcMain.on('close-window',()=>{
  mainwindow.close()
})

//主线程接收渲染进程信号,显示全屏
ipcMain.on('max-window',()=>{
  mainwindow.maximize()
})

//主线程接收渲染进程信号,显示小屏
ipcMain.on('umax-window',()=>{
  mainwindow.unmaximize()
})

  

  mainwindow.loadFile('./src/index.html')

// //自动打开调试工具
   mainwindow.webContents.openDevTools()

  //引入菜单模板
  require("./menu.js")


  
})

 menu.js:

const {BrowserWindow,Menu} = require('electron')

//定义菜单模板
const template= [
  {
    label:'文件',
    submenu:[
      {
        label:'新建窗口',
        click() {
          new BrowserWindow({
            width:300,
            height:300
          })
        }
      }
    ]
  },
  {
label:'关于我们'
  }
]
//编译模板
const menu = Menu.buildFromTemplate(template)
//创建新菜单
Menu.setApplicationMenu(menu)

举报

相关推荐

0 条评论