一、安裝 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
生成,真正用到已有的項目中卻出現了新的坑
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
配置檔案

Paste_Image.png
資源路徑是相對于
exe
檔案而言的,還沒有打包之前,自己能夠順利的運作整個項目,可是打包之後一直提示
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
之後,自己究竟把資源清理幹淨了嗎?這也是一個值得思考的問題。