zoukankan      html  css  js  c++  java
  • electron——初探

    是什么?

    • Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库。
    • Electron通过将Chromium和Node.js合并到同一个运行时环境中,并将其打包为Mac,Windows和Linux系统下的应用来实现这一目的。

    为什么选择electron?

    先来看一下官方的两句话

    使用 JavaScript, HTML 和 CSS 构建跨平台的桌面应用

    如果你可以建一个网站,你就可以建一个桌面应用程序。 Electron 是一个使用 JavaScript, HTML 和 CSS 等 Web 技术创建原生程序的框架,它负责比较难搞的部分,你只需把精力放在你的应用的核心上即可。

    如果你是一个前端,你就明白这个有多简单了

    哦,对了!或许你还不知道,Visual Studio Codewordpressslack 等客户端都是基于 Electron 开发的。

    1.可以用 Web 前端技术开发跨平台的桌面客户端

    这是 Electron 最迷人的地方,究其根本是因为它是建立在 ChromiumNode 之上的,一个负责界面,一个负责背后的逻辑,有句话怎么说来着 你负责貌美如花,我负责赚钱养家,所以Electron 能够开发跨平台的桌面应用也就可以理解了。

    作为一名前端小菜鸟来说:

    • 可以用自己熟悉的方式去写应用界面,ps: 不要和我说什么java、c语言,鄙人行走江湖就一把js,遇到需求就是干,学好js,走遍天下都不怕(✿◡‿◡)
    • 逻辑部分也还是 JS,如果你精通 Node ,那就更好了,后端也一并写了,ps: sorry,会js就是无所不能,我不是针对某个语言,我是说在座的所有,都是。。。(开玩笑,不要打我╥﹏╥...)

    so,一个 Web 前端开发者可以花很少的成本去上手 Electron,而相比于以前开发多平台客户端的成本,利用 ELectron 开发多平台客户端的成本是极低的

    2.可以从 Node 的生态获得极大的助力

    因为 Electron 是基于 Node 的,意味着,Node 这个大生态下的模块,Electron 也都可以用,这减少了很多造轮子的时间,你要写一些逻辑将首先思考有没有成熟的模块可以引入,而不是自己吭哧吭哧闭门造车,自己造时间精力会大量得被消耗,上路还可能翻车。

    3.为什么需要客户端?

    既然 Electron 是用 Web 技术写客户端,那么看上去 Electron 要做的事,可以搬到网站上,为什么还要搬到客户端,这里有3个角度的回答:

    • 用户角度: 客户端是一款独立的软件,其综合体验一般都是比网站高的,尤其是涉及到「工具」范畴的应用,此外,特定的用户群体也会有类似的使用习惯
    • 发行方角度: 客户端是另一种产品形式,是一种产品的分发方式和入口,客户端可以实现很多本地应用独有的需求去触达用户,也能提供更加可靠的服务
    • 开发角度: 终于...不用考虑浏览器兼容了!!!,Chromium 也足够开发使用一些先进的 CSS 或 JS 特性,我们现在还没计划引入 webpack 和 babel,因为现在好像够用,克制才是爱,除了写起来爽,对于开发来说,终于跳出了浏览器的沙盒,你可以自己去控制 Electron 中的「浏览器」,莫名的开心

    这些综合起来回答这个小节的问题就是,用 Electron 开发客户端,用户体验好,开发麻烦小,功能更强大,世界更和平~~~

    怎么用?

    从开发的角度来看, Electron application 本质上是一个 Node. js 应用程序。 与 Node.js 模块相同,应用的入口是 package.json 文件。 一个最基本的 Electron 应用一般来说会有如下的目录结构:

    your-app/
    ├── package.json
    ├── main.js
    └── index.html
    

    为你的新Electron应用创建一个新的空文件夹。 打开你的命令行工具,然后从该文件夹运行npm init

    npm init
    

    npm 会帮助你创建一个基本的 package.json 文件。 其中的 main 字段所表示的脚本为应用的启动脚本,它将会在主进程中执行。 如下片段是一个 package.json 的示例:

    {
      "name": "your-app",
      "version": "0.1.0",
      "main": "main.js"
    }
    

    注意:如果 main 字段没有在 package.json 中出现,那么 Electron 将会尝试加载 index.js 文件(就像 Node.js 自身那样)。 如果你实际开发的是一个简单的 Node 应用,那么你需要添加一个 start 脚本来指引 node 去执行当前的 package:

    {
      "name": "your-app",
      "version": "0.1.0",
      "main": "main.js",
      "scripts": {
        "start": "electron ."
      }
    }
    

    安装 Electron

    现在,您需要安装electron。 我们推荐的安装方法是把它作为您 app 中的开发依赖项,这使您可以在不同的 app 中使用不同的 Electron 版本。 在您的app所在文件夹中运行下面的命令:

    npm install --save-dev electron
    

    开发一个简易的 Electron

    Electron apps 使用JavaScript开发,其工作原理和方法与Node.js 开发相同。 electron模块包含了Electron提供的所有API和功能,引入方法和普通Node.js模块一样:

    const electron = require('electron')
    

    electron 模块所提供的功能都是通过命名空间暴露出来的。 比如说: electron.app负责管理Electron 应用程序的生命周期, electron.BrowserWindow类负责创建窗口。 下面是一个简单的main.js文件,它将在应用程序准备就绪后打开一个窗口:

    const { app, BrowserWindow } = require('electron')
    
    function createWindow () {   
      // 创建浏览器窗口
      let win = new BrowserWindow({
         800,
        height: 600,
        webPreferences: {
          nodeIntegration: true
        }
      })
    
      // 加载index.html文件
      win.loadFile('index.html')
    }
    
    app.on('ready', createWindow)
    

    您应当在 main.js 中创建窗口,并处理程序中可能遇到的所有系统事件。 下面我们将完善上述例子,添加以下功能:打开开发者工具、处理窗口关闭事件、在macOS用户点击dock上图标时重建窗口,添加后,main. js 就像下面这样:

    const { app, BrowserWindow } = require('electron')
    
    // 保持对window对象的全局引用,如果不这么做的话,当JavaScript对象被
    // 垃圾回收的时候,window对象将会自动的关闭
    let win
    
    function createWindow () {
      // 创建浏览器窗口。
      win = new BrowserWindow({
         800,
        height: 600,
        webPreferences: {
          nodeIntegration: true
        }
      })
    
      // 加载index.html文件
      win.loadFile('index.html')
    
      // 打开开发者工具
      win.webContents.openDevTools()
    
      // 当 window 被关闭,这个事件会被触发。
      win.on('closed', () => {
        // 取消引用 window 对象,如果你的应用支持多窗口的话,
        // 通常会把多个 window 对象存放在一个数组里面,
        // 与此同时,你应该删除相应的元素。
        win = null
      })
    }
    
    // Electron 会在初始化后并准备
    // 创建浏览器窗口时,调用这个函数。
    // 部分 API 在 ready 事件触发后才能使用。
    app.on('ready', createWindow)
    
    // 当全部窗口关闭时退出。
    app.on('window-all-closed', () => {
      // 在 macOS 上,除非用户用 Cmd + Q 确定地退出,
      // 否则绝大部分应用及其菜单栏会保持激活。
      if (process.platform !== 'darwin') {
        app.quit()
      }
    })
    
    app.on('activate', () => {
      // 在macOS上,当单击dock图标并且没有其他窗口打开时,
      // 通常在应用程序中重新创建一个窗口。
      if (win === null) {
        createWindow()
      }
    })
    
    // 在这个文件中,你可以续写应用剩下主进程代码。
    // 也可以拆分成几个文件,然后用 require 导入。
    

    最后,创建你想展示的 index.html

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8">
        <title>Hello World!</title>
      </head>
      <body>
        <h1>Hello World!</h1>
        We are using node <script>document.write(process.versions.node)</script>,
        Chrome <script>document.write(process.versions.chrome)</script>,
        and Electron <script>document.write(process.versions.electron)</script>.
      </body>
    </html>
    

    启动你的应用

    在创建并初始化完成 main.jsindex.htmlpackage.json之后,您就可以在当前工程的根目录执行 npm start 命令来启动刚刚编写好的Electron程序了。

    参考文章:

    Electron,从玩玩具的心态开始,到打造出一款越来越优秀的桌面客户端产品

  • 相关阅读:
    032 Gradle 下载的依赖jar包在哪?
    031 can't rename root module,Android Studio修改项目名称
    030 Cannot resolve symbol'R' 问题解决汇总大全
    029 Android Studio层级显示目录文件
    028 You are about to commit CRLF line separators to the Git repository.It is recommended to set the core. autocrlf Git attribute to true to avoid line separator issues If you choose Fix and Comit ,
    027 【Android基础知识】Android Studio 编译慢及 Adb connection Error:远程主机强迫关闭了一个现有的连接
    026 Android Studio 和Gradle版版本对应关系
    025 Cause: org.jetbrains.plugins.gradle.tooling.util.ModuleComponentIdentifierIm
    024 Android Studio上传项目到Github 最全记录
    023 解决AndroidStudio下载gradle慢的问题
  • 原文地址:https://www.cnblogs.com/loveyt/p/11005336.html
Copyright © 2011-2022 走看看