zoukankan      html  css  js  c++  java
  • electron-利用node开发桌面应用

    简介

    web前端语言的发展有目共睹, 从原来的pc web, 到后来的mobile SAP, 再到 nodejs,全站工程师应运而生. js快速而且稳健的发展让人不得不重视, 相应的前端开发人员的地位也越来越高, 越来越多的人愿意投入到前端的阵营里去. 而桌面app向来是web前端开发开发人员下意识的避开方向. 但是依然不乏有憧憬的人.于是借助于webkit内核和nodejs,出现了web移动app解决方案和web桌面app的解决方案. 而我们需要做的就是利用熟悉的前端语言借助大拿们的工具,愉悦的开发就好了.

    Electron的前身是atom-shell, 是github目前比较出名的Atom编辑器的一个兄弟项目,它是一个借助nodejs和Chromium, 利用HTML/CSS/JavaScript语言创建桌面应用的一个工具. 与之类似的还有一个微软的工程师搞的NW.js, 原理基本相同. 但是个人感觉可能Electron更新更好一些,社区发展也更热闹些.

    具体的说明,大家可以去参考官方的中文文档

    下面边操作边摘一些环境安装以及打包的基础:

    运行环境

    一旦你创建了最初的 main.js, index.html 和 package.json 这几个文件,你可能会想尝试在本地运行并测试,看看是不是和期望的那样正常运行。

    electron-prebuilt

    electron-prebuilt 是一个 npm 模块,包含所使用的 Electron 预编译版本。 首先全局安装:

    npm install -g electron
    //npm官方安装electron我老遇到问题,建议使用cnpm安装(后面所有的安装的时候如果出现问题就尽量使用cnpm),首先要安装cnpm
    npm install -g cnpm --registry=https://registry.npm.taobao.org
    cnpm install -g electron
    

    然后你只需要按照如下方式直接运行你的应用:

    electron .
    

    如果你是局部安装,那运行:

    ./node_modules/.bin/electron .
    

    如果你手工下载了 Electron 的二进制文件,你也可以直接使用其中的二进制文件直接运行你的应用。

    Windows

    $ .electronelectron.exe your-app
    

    Linux

    $ ./electron/electron your-app/
    

    macOS

    $ ./Electron.app/Contents/MacOS/Electron your-app/
    

    Electron.app 里面是 Electron 发布包,你可以在 这里 下载到。

    web应用结构

    大体上,一个 Electron 应用的目录结构如下:

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

    package.json的格式和 Node 的完全一致,并且那个被 main 字段声明的脚本文件是你的应用的启动脚本,它运行在主进程上。你应用里的 package.json 看起来应该像:

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

    注意:如果 main 字段没有在 package.json 声明,Electron会优先加载 index.js。由于环境基于node,所以你的js可以使用任何node模块.

    main.js 应该用于创建窗口和处理系统事件,具体请参考官方的demo或者文档.

    应用部署(官方版本)

    方法一 替换已有应用的资源文件

    为了使用 Electron 部署你的应用程序,你存放应用程序的文件夹需要叫做 app 并且需要放在 Electron 的 资源文件夹下(在 macOS 中是指 Electron.app/Contents/Resources/,在 Linux 和 Windows 中是指 resources/) 就像这样:

    在 macOS 中:

    electron/Electron.app/Contents/Resources/app/
        ├── package.json
        ├── main.js
        └── index.html
    

    在 Windows 和 Linux 中:

    electron/resources/app
        ├── package.json
        ├── main.js
        └── index.html
    

    然后运行 Electron.app (或者 Linux 中的 electron,Windows 中的 electron.exe), 接着 Electron 就会以你的应用程序的方式启动。electron 文件夹将被部署并可以分发给最终的使用者。

    方法二 asar打包

    除了通过拷贝所有的资源文件来分发你的应用程序之外,你可以通过打包你的应用程序为一个 asar 库文件以避免暴露你的源代码。

    为了使用一个 asar 库文件代替 app 文件夹,你需要修改这个库文件的名字为 app.asar , 然后将其放到 Electron 的资源文件夹下,然后 Electron 就会试图读取这个库文件并从中启动.

    在 macOS 中:

    electron/Electron.app/Contents/Resources/
        └── app.asar
    

    在 Windows 和 Linux 中:

    electron/resources/
        └── app.asar
    

    如何打包呢?

    官方提供的打包原理是将web目录打包成一个asar,Electron 可以无需解压,即从其中读取任意文件内容。asar 包中的内容不可更改,所以 Node APIs 里那些可以用来修改文件的方法在对待 asar 包时都无法正常工作。

    安装 asar

    $ npm install -g asar
    

    用 asar pack 打包

    $ asar pack your-app app.asar
    

    使用 asar 包

    在 Electron 中有两类 APIs:Node.js 提供的 Node API 和 Chromium 提供的 Web API。 这两种 API 都支持从 asar 包中读取文件。

    #nodejs 从 asar 包读取一个文件:
    const fs = require('fs')
    fs.readFileSync('/path/to/example.asar/file.txt')
    
    #nodejs 使用 asar 包中的一个模块:
    require('/path/to/example.asar/dir/module.js')
    
    #webapi
    <script>
    var $ = require('./jquery.min.js');
    $.get('file:///path/to/example.asar/file.txt', function(data) {
    console.log(data);
    });
    </script>
    

    更详细的说明,请参考官方文档

    更换名称与下载二进制文件

    在使用 Electron 打包你的应用程序之后,你可能需要在分发给用户之前修改打包的名字。

    Windows

    你可以将 electron.exe 改成任意你喜欢的名字,然后可以使用像 rcedit 编辑它的 icon 和其他信息。

    macOS

    你可以将 Electron.app 改成任意你喜欢的名字,然后你也需要修改这些文件中的 CFBundleDisplayName, CFBundleIdentifier 以及 CFBundleName 字段。 这些文件如下:

    Electron.app/Contents/Info.plist
    Electron.app/Contents/Frameworks/Electron Helper.app/Contents/Info.plist
    

    你也可以重命名帮助应用程序以避免在应用程序监视器中显示 Electron Helper, 但是请确保你已经修改了帮助应用的可执行文件的名字。

    一个改过名字的应用程序的构造可能是这样的:

    MyApp.app/Contents
        ├── Info.plist
        ├── MacOS/
        │   └── MyApp
        └── Frameworks/
            ├── MyApp Helper EH.app
            |   ├── Info.plist
            |   └── MacOS/
            |       └── MyApp Helper EH
            ├── MyApp Helper NP.app
            |   ├── Info.plist
            |   └── MacOS/
            |       └── MyApp Helper NP
            └── MyApp Helper.app
                ├── Info.plist
                └── MacOS/
                    └── MyApp Helper
    

    Linux

    你可以将 electron 改成任意你喜欢的名字。

    应用部署(插件版本-推荐)

    除了使用官方提供的方法外,很多第三方的模块也可以完成该打包过程.并直接生成各系统的安装文件。比较常用的是 electron-packagerelectron-builder. 通过npm安装后直接可以使用命令生成安装包和运行包, 简直太方便了. 不过可能需要对package.json做一些简单的配置.下面会分开说说.

    electron-packager

    electron-packager可以将项目打包成各平台可直接运行的程序,比如app,exe等。打包出来的程序至少100M,这是跨平台工具无法避免的通病。善用ignore参数,排除程序运行不必要的包。

    安装

    cnpm install -g electron-packager
    

    打包命令

    electron-packager <sourcedir> <sourcedir> --platform= <platform> win32,darwin --arch=all --electronVersion=1.6.10 --out=dist/ --overwrite --ignore=node_modules/electron-* --ignore=node_modules/.bin --ignore=.git --ignore=dist --prune
    #*<sourcedir> : 项目的位置
    #*<sourcedir> : 应用名
    #*--out <out> : 指定输出的目录
    #*--electronVersion=<version> : 指定编译的 electron-prebuilt 版本,可以使用前面prebuid安装的版本,查看命令  electron -h 
    #--platform=<platform> : 打包的系统(darwin、win32、linux)
    #--arch=<arch> : 系统位数(ia32、x64)
    # --icon=<icon> : 指定应用的图标(Mac 为 .icns 文件,Windows 为 .ico 或 .png)
    

    下面是一个例子:

    electron-packager . hello ../ --electronVersion 1.6.10 --overwrite
    

    electron-builder

    与electron-packager不同,electron-builder是直接将项目打包成安装文件,比如,dmg,exe,msi.os系统,只能打包dmg文件,window系统才能打包exe,msi文件。打完包后基本不小于40兆。

    安装

    npm install electron-builder
    #或者
    cnpm install electron-builder
    

    安装之后,全局的话则可以使用cli命令build(这名起的真让人难受),局部安装则使用node_modules/.bin/build来调用命令生成压缩包,运行包和安装包. 具体的参数可以参考官方文档或者使用 build --help来查看

    配置package.json

    配置文件中必须的几项为, name, description, version and author. 同时你要带上electron-builder专用的配置键build,要求的键值appId和编译针对的系统平台参数,具体配置详情点击这里,下面是一个简单的示例:

    {
    "name": "helloworld",
    "version": "0.1.0",
    "author":"awen",
    "description":"test",
    "main": "main.js",
    "build": {
        "appId": "com.electron.awen.hello",
        "copyright":"awen",
        "productName":"测试",
        "dmg":{
          "background":"build/background.png",
          "icon":"build/icon.icns",
          "window":{
            "x":100,
            "y":100,
            "width":500,
            "height":300
          }
        },
        "mac": {
         "category": "public.app-category.developer-tools",
         },
        "squirrelWindows":{
          "iconUrl":"https://github.com/favicon.ico"
         },
        "win": {
            "icon": "icon.ico"
        }
    }
    }
    

    图标和背景

    在web根目录下建一个build文件夹,里面来放图标和背景图片,当然也可以在package.json中自己配置(官方推荐使用目录,但是个人倾向于配置文件),说明如下:

    webRoot
        └──build
            ├──background.png  (mac的DMG安装文件打开后的背景)
            ├──icon.icns  (mac的图标文件)
            ├──icon.ico  (windows的图标文件)
            └──icons (linux的图标文件,也可以省略直接继承mac的图标文件)
                └──32x32.png
    

    最后打包

    弄好你的环境之后你可以执行以下build --help中的示例生成三平台的程序,初次执行会下载对应平台的electron包.

    build -mwl
    

    多平台打包依赖

    编译多平台的包时,你需要安装一些依赖,当然还是希望在不同平台下打包。因为下面这种方式兼容性并没有想象中的好:

    MacOS

    #MacOS上编译windows:
    brew install wine --without-x11
    brew install mono
    #MacOS上编译linux:
    brew install gnu-tar graphicsmagick xz
    #如果需要生成rpm
    brew install rpm.
    

    Linux

    sudo apt-get install --no-install-recommends -y icnsutils graphicsmagick xz-utils
    
    #生成rpm: 
    sudo apt-get install --no-install-recommends -y rpm
    
    #生成pacman: 
    sudo apt-get install --no-install-recommends -y bsdtar
    
    #Linux上编译windows:
    ##安装(wine1.8+)
    sudo add-apt-repository ppa:ubuntu-wine/ppa -y
    sudo apt-get update
    sudo apt-get install --no-install-recommends -y wine1.8
    ##安装mono(4.2+)
    sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
    echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
    sudo apt-get update
    sudo apt-get install --no-install-recommends -y mono-devel ca-certificates-mono
    
    #64位机器上编译32位的包
    sudo apt-get install --no-install-recommends -y gcc-multilib g++-multilib
    

    Windows

    使用 Docker

  • 相关阅读:
    400 Bad Request
    Django 中间件 阅读目录 初步了解 中间件 中间件的介绍 自定义中间件 process_template_response(用的比较少) 中间件的执行流程 中间件版登录验证
    关于python语言优化的一些思考
    从系统角度考虑性能优化 【被面试官吊打】从系统角度考虑性能优化 目录 什么是性能? 定义系统范围 重定义功能 关注价值 总结
    需求设计
    开源软件评选白热化,这些项目冲击 Top 5
    两个向量的outer product
    协同过滤算法中皮尔逊相关系数的计算 C++
    求向量间的点积
    string 类型的翻转
  • 原文地址:https://www.cnblogs.com/cczw/p/5984012.html
Copyright © 2011-2022 走看看