天天看點

electron使用electron-packager打包整理

一、安裝 electron-packager

PS:安裝之前,先複制一份package.json檔案到./app目錄下,然後改下./app目錄下package.json裡 “main”: “app/main.js”的路徑(去掉app/),不這樣子的話,下面打包的時候會報錯,有的版本識别不了應用路徑。

1、使用指令 npm install --save-dev electron-packager 

将electron-package包安裝到在項目下面, 

安裝完成之後,項目根目錄下面的package.json檔案裡,會多出一條electron-package的版本号配置資訊 

二、正式打包 

首先在項目根目錄下面的 package.json 裡添加代碼, 

"packager": "electron-packager ./app HelloWorld -win=x32 --out ./OutApp --version 4.1.3 --overwrite --icon=./app/img/icon/icon.ico"

PS:這裡要注意,字段裡的 項目名字,version,icon路徑要改成自己的;

 然後,在使用指令 

npm run-script packager

以上是

hello world

生成,真正用到已有的項目中卻出現了新的坑

1. jquery引用

在項目中已經引入了

jquery.js

,控制台卻報

cannot find the jquery.js

,解決方法:在

index.html

中引入

jquery

改寫成:

<script>window.$ = window.jQuery = require('../public/lib/jquery/dist/jquery.js')</script>
           

原因分析:因為nwjs/electron環境裡有module jquery的loader認為是通過commonjs挂載的 是以他不會自動挂到全局 是以官方推薦自己來

2. 檔案突然不能正常運作

原本好好地項目,一分鐘之前還在完整的運作,沒有改動任何一行代碼,突然就無法運作,花了四個多小時找原因,結果還是沒有找出來,隻好把自己的項目拷貝到其他電腦上面運作,發現其他項目能夠順利運作可是在自己電腦上面不能運作,于是把電腦重新開機之後,項目又可以運作。

原因分析:可能是作業系統中的資源出現了沖突,另外一個程序在使用某個資源,可是現在這個程序也要使用這項資源,是以導緻的作業系統中的“堵塞???”。

3.

nodejs

require

不能在

angularjs

項目中運作

解決方法:在

index.html

的頭部加上

<script>var __require = require;</script>
           

原因分析:

angualrjs

内部有

require

指令,是以産生了命名沖突。

4. 修改伺服器的

toml

配置檔案

electron使用electron-packager打包整理

Paste_Image.png

資源路徑是相對于

exe

檔案而言的,還沒有打包之前,自己能夠順利的運作整個項目,可是打包之後一直提示

electron使用electron-packager打包整理

Paste_Image.png

ENOENT

: No such file or directory。提示找不到該檔案,自己卻一直以為是因為打包之後的

asar

包不能正常閱讀是以耗費了大量時間,最後通過修改

toml

的路徑參數解決問題。

5.

nodejs

打開路徑

最初

require

不能在

angularjs

中正常運作,是以把所有參數在

main.js

中設定成全局變量,嚴重污染了全局空間,由于問題的解決,是以就在

angularjs

controller

裡面順理成章的使用

require

等API。

$scope.openTaskmgr = function () {
    //shell打開資料總管
    var electronShell = __require("electron").shell;
    //path指定目錄
    var electronPath = __require('path');
    var apkPath = electronPath.resolve(__dirname, '../../../../tmp/dist');
    electronShell.openExternal(apkPath);
};
           

在這個項目裡面,由于時間的關系,直接把需要打開的目錄寫死了,這種處理方法不是特别的好,最好的方法是去讀取

toml

配置檔案裡面的路徑,然後再打開相關連結。

6. 伺服器日志輸出

把項目打包之後讀伺服器日志就會成為一項比較難辦的事情,是以在前端必須通過某個按鈕列印出目前的伺服器日志,這裡運用到了

nodejs

的檔案系統。

main.js

裡面打開伺服器

var p = childProcess.spawn("resources/app/packerd.exe", ["--conf", "resources/app/packerd.toml"]);
           

擷取伺服器的标準輸出和标準錯誤輸出,并在标準輸出中建立日志檔案和寫入相關日志,同時在标準錯誤輸出中寫入伺服器錯誤日志

p.stdout.on('data', function (d) {
    //建立檔案
    fs.open('resources/app/log.txt', 'w+', function(err, fd) {
        if (err) {
            return console.error(err);
        }
    });

    //寫入伺服器日志
    fs.appendFile('resources/app/log.txt', d.toString(),  function(err) {
        if (err) {
            return console.error(err);
        }
    });
});

p.stderr.on('data', function (data) {
    //寫入伺服器錯誤日志
    fs.appendFile('resources/app/log.txt', d.toString(),  function(err) {
        if (err) {
            return console.error(err);
        }
    });
});
           

exe

關閉時删除伺服器日志

app.on('window-all-closed', function () {
    if (process.platform !== 'darwin') {
        fs.unlink("resources/app/log.txt",function(err){
            if(err){
                console.log(err);
            }
        });
        app.quit();
    }
});
           

完成項目之後仔細想了想,為什麼要建立

txt

檔案而不能在

div

中輸出相關内容,因為是給使用者用的,我們不知道使用者預設的打開

txt

的是什麼軟體,萬一是一個非常非常慢的呢?在mac下又是什麼呢?是以這樣的使用者體驗性不是特别的好。同時在退出

exe

之後,自己究竟把資源清理幹淨了嗎?這也是一個值得思考的問題。

繼續閱讀