node webkit(nw.js) 設定自動更新

會飛的Tiger發表於2016-12-08

原理:把更新的檔案放在伺服器上,設定一個客戶端版本號,每次開啟客戶端的時候,通過介面獲取伺服器上的版本,如果高於本地的版本就下載伺服器上的程式碼,低於或等於就不更新

程式碼如下:

 

<script>
        var http = require('http');
        var fs = require('fs');
        var request = require('request');
        var unzip = require('unzip2');
        var Driver = function () {
            this.timer = '';
            this.timer2 = '';
        };
        Driver.prototype = {
                /* 讀取本地版本 */
                readFile: function () {
                    var self = this;
                    if (fs.existsSync('src/js/global.js')) {                
                        self.case1();
                    } else {
                        $.ajax({
                            type: 'post',
                            url: 'url(介面地址)',
                            dataType: 'jsonp',
                            contentType: "application/jsonp; charset=utf-8",
                            data: {'userId': 0,
                            },
                            success: function (data) {
                                console.log("正在下載解壓包...");
                                if (data.code == 0) {
                                    if (data.result.update == 1) {
                                        var gx = document.getElementsByClassName('gx')[0];
                                        gx.style.display = "block";
                                        /* 下載地址 下載到的目錄*/
                                        if (fs.existsSync('nsrc') || fs.existsSync('upload/zip')) {
                                            self.rmdirFile('upload/zip', function () {

                                                self.rmdirFile('nsrc', function () {

                                                    self.createDir('upload/zip', function () {
                                                        console.log("建立下載zip目錄成功...");
                                                        //建立下載zip的目錄
                                                        self.downFile(data.result.url);
                                                    });
                                                })
                                            })
                                        } else {
                                            self.createDir('upload/zip', function () {
                                                console.log("建立下載zip目錄成功...");
                                                //建立下載zip的目錄
                                                self.downFile(data.result.url);
                                            });
                                        }
                                    } else {
                                        setTimeout(function () {
                                            window.location.href = "../src/Login/login.html";
                                        }, 2250);
                                    }
                                }
                            },
                            error: function () {

                                alert(data.msg);

                            }

                        });

                    }
                },
                /* 如果global沒有被刪除*/
                case1: function () {
                    var self = this;
                    global.post('/system/checkVersion', {}, function (data) {
                        console.log("正在下載解壓包...");
                        if (data.code == 0) {
                            if (data.result.update == 1) {
                                var gx = document.getElementsByClassName('gx')[0];
                                gx.style.display = "block";
                                /* 下載地址 下載到的目錄*/
                                if (fs.existsSync('nsrc') || fs.existsSync('upload/zip')) {
                                    self.rmdirFile('upload/zip', function () {

                                        self.rmdirFile('nsrc', function () {

                                            self.createDir('upload/zip', function () {
                                                console.log("建立下載zip目錄成功...");
                                                //建立下載zip的目錄
                                                self.downFile(data.result.url);
                                            });
                                        })
                                    })
                                } else {
                                    self.createDir('upload/zip', function () {
                                        console.log("建立下載zip目錄成功...");
                                        //建立下載zip的目錄
                                        self.downFile(data.result.url);
                                    });
                                }
                            } else {
                                setTimeout(function () {
                                    window.location.href = "../src/Login/login.html";
                                }, 2250);
                            }
                        } else {
                            alert(data.msg);
                        }
                    });
                },
                /* 下載解壓包 */
                downFile: function (url) {
                    var self = this;
                    self.download(url, 'upload/zip/nsrc.zip', function () {
                        /* 下載完成建立解壓目錄 */
                        clearInterval(self.timer);
                        sc.style.width = 0;
                        sj.innerHTML = '正在解壓安裝 2/2 '
                        console.log('正在建立臨時目錄');
                        self.createDir('nsrc', function () {
                            self.unZip();
                            console.log('正在解壓...');
                            /* 前端做的假程式 */
                            setTimeout(function () {
                                var startC = parseInt(Math.floor(Math.random() * 3 + 1) * 10);
                                sc.style.width = startC + '%';
                                self.timer2 = setInterval(function () {
                                    startC += startC + Math.floor(Math.random() * 3 + 1) * 0.2;
                                    console.log('aaa');
                                    if (startC >= 90) {
                                        clearInterval(self.timer2);
                                        startC = 90;
                                    }
                                    sc.style.width = startC + '%';
                                }, 500);
                            }, 1000);


                        });
                        /*self.unZip();*/
                    });
                },
                /* 下載完成建立交換目錄 */
                createDir: function (v, callback) {
                    var slef = this;
                    /* 建立的新目錄名是nsrc*/
                    fs.mkdir(v, function (err) {
                        if (!err) {
                            console.log('建立目錄成功...');
                            callback && callback(err);
                        } else {
                            console.log("建立目錄失敗...");
                        }
                    })
                },
                /* 解壓zip */
                unZip: function () {
                    var self = this;
                    /* 解壓到nsrc中*/
                    var extract = unzip.Extract({
                        path: 'nsrc' //process.cwd()
                    }); //獲取根目錄
                    fs.createReadStream('upload/zip/nsrc.zip').pipe(extract);
                    extract.on('error', function (err) {
                        console.log(err);

                        console.log("解壓失敗");
                    });
                    extract.on('finish', function () {
                        /* argv[1] 主模板的絕對路徑 第一個命令列從 argv[2]這個位置開始 */
                        /* 在此之前刪除之前的src資料夾 */
                        /* self.rmdirFile(process.cwd()+'\\'+'src', function () {
                            console.log(1);
                            /* 重新命名資料夾 */
                        /*self.reName(fs.readdirSync(process.cwd()+'\\'+'nsrc')[0]);*/

                        /*console.log('success')
                        });*/

                    });

                    extract.on('close', function () {
                        /* */
                        console.log("解壓成功");
                        self.rmdirFile('src', function () {
                            /*刪除掉之前的src資料夾 解壓 重新命名新的資料夾*/
                            self.copy();
                        })


                    });
                    extract.on('end', function () {});
                },
                copy: function () {
                    var self = this;
                    fs.rename('nsrc/src', 'src', function (err) {
                        /* 刪除 nsrc 如果能刪除  說明壓縮的 還未壓縮完 再次壓縮*/
                        if (fs.existsSync('nsrc')) {
                            fs.rmdir('nsrc', function (err) {
                                if (err) {
                                    console.log(err);
                                    console.log("刪除失敗....");
                                } else {
                                    console.log("刪除成功...");
                                    self.copy();
                                }
                            });
                        } else {
                            self.rmdirFile('upload/zip', function () {
                                console.log("刪除快取成功...");
                                console.log("更新完成啟動客戶端...");
                                sc.style.width = 100 + '%';
                                setTimeout(function () {
                                    window.location.href = "../src/Login/login.html";
                                }, 2250);
                            });
                        }

                    })
                },
                /* 重新命名 */
                reName: function (filename) {
                    var self = this;
                    /*  在此之前刪除之前的src資料夾 */
                    fs.rename('nsrc', 'src', function (err) {
                        if (err) {
                            console.log("重新命名失敗...");
                        } else {
                            console.log("重新命名成功...");
                            self.rmdirFile('upload/zip', function () {
                                console.log("刪除快取成功...");
                                console.log("更新完成啟動客戶端...");
                            });
                        }
                    });
                },
                /* 刪除資料夾 */
                rmdirFile: function (paths, callback) {
                    var self = this;
                    var files = [];
                    /* 判斷目錄存在 */
                    /* d遞迴遍歷*/
                    if (fs.existsSync(paths)) {
                        files = fs.readdirSync(paths); //同步請求
                        files.forEach(function (files, index) {
                            var curPath = paths + "/" + files; //遍歷出每個一個目錄
                            //如果當前目錄也是目錄
                            if (fs.statSync(curPath).isDirectory()) { //recurse
                                /* 遞迴遍歷 */
                                self.rmdirFile(curPath);
                            } else {
                                fs.unlinkSync(curPath); //刪除檔案
                            }
                        });
                        fs.rmdirSync(paths); //刪除空資料夾
                        console.log("刪除成功...");
                    }
                    callback && callback();

                },
                /*---- 下載解壓包 ----*/
                download: function (uri, filename, callback) {
                    var self = this;
                    request.head(uri, function (err, res, body) {
                        console.log('content-type:', res.headers['content-type']);
                        console.log('content-length:', res.headers['content-length']);
                        self.timer = setInterval(function () {
                            sc.style.width = (fs.statSync(filename).size / res.headers['content-length']) * 100 + '%';
                        }, 500);
                        request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
                    });
                },
            },
            console.log("執行結束");
    </script>

 

 

下面,改變我本地的 版本號!此時伺服器上版本是1.1.1

開啟後客戶端:

下載完之後,看下global.js裡面的原始碼:

版本號發生了改變,此次更新成功!

注:我並非是將所要程式碼重新打包放到伺服器,而是隻把自己修改的部分打成zip(程式碼裡可以看到我讀取的是zip ),放在伺服器上面,裡面一定要包含存放版本號的檔案,否則無法判斷是否該更新!

注:此程式並非由我寫!是我們公司的人寫的!只是覺得不錯,和大家分享分享!這裡感謝東哥!

有寫的不好的地方,還希望大家指教!

 

相關文章