我正在開發Windows 8/8.1 JavaScript應用程序。它基本上是我們web應用程序的一個端口。對於部署,我使用grunt,grunt-contrib-uglify和grunt-contrib-cssmin(接近一些,但那些沒有連接到我的問題)。Windows應用程序開發中的Grunt和UglifyJS - UTF8問題
UglifyJS用於打包我所有的JS文件和庫因爲Windows應用程序認證強制使用帶有簽名(BOM)的UTF-8編碼,所以我的所有源文件都以這種方式編碼。我也設置了將默認編碼爲UTF-8並將preserveBOM設置爲true。但我的縮小文件在us_ascii中編碼,有些甚至在二進制流中編碼。
對於Windows 8.1 32位和Mac OS小牛,這種行爲是相同的
我該怎麼辦?
使用UTF-8 BOM編碼重新保存此打包版本會導致通過認證檢查,但應用程序未運行(白色屏幕,看起來像縮小的JS不再工作,但它在重新打開之前完美無瑕,保存)。
這就是我與之後的JS文件做CONCAT /縮小:
var buf = grunt.file.read(fileName, { encoding: null });
var missingBOM = (buf[0] !== 0xEF && buf[1] !== 0xBE && buf[2] !== 0xBB);
if (missingBOM) {
grunt.file.write(fileName, '\ufeff' + buf, { encoding: 'utf-8' });
}
更新: 我發現有多個BOM表在我的合併文件,所以我改進我的腳本脫光那些寫出來的新前:
var buf = grunt.file.read(dist + fileName, { encoding: null });
var BOM = new Buffer([0xEF,0xBB,0xBF]);
// remove multi BOMs from Buffer
var bufString = buf.toString('utf-8');
bufString = bufString.replace(BOM.toString('utf-8'), null);
buf = new Buffer(bufString, 'utf-8');
// add new UTF-8 BOM to the beginning of the file buffer
var bomFile = Buffer.concat([BOM,buf]);
grunt.file.write(dist + fileName, bomFile, { encoding: 'utf-8' });
儘管如此,沒有運氣-.-
燁執行
uglify
,元定義是存在的。我現在也通過手動將BOM添加到文件中來獲得正確的編碼。現在剩下的唯一問題是,該應用程序只在調試器存在時才起作用。如果我打開打包和安裝的應用程序,我會以白色屏幕結束(所有應用程序UI均由JS構建)。如果我調試安裝的應用程序,它的運行完美無瑕 –