Windows应用程序开发中的Grunt和UglifyJS - UTF8问题

时间:2014-03-12 13:23:28

标签: javascript node.js encoding utf-8 gruntjs

我正在开发一个Windows 8 / 8.1 JavaScript应用程序。它基本上是我们的webapp的一个端口。对于部署,我使用的是grunt,grunt-contrib-uglify和grunt-contrib-cssmin(旁边还有一些,但那些与我的问题无关。

UglifyJS用于将每个JS文件和库打包在一个缩小的包中。对于CSS来说,使用CSSmin是一样的。

由于Windows应用程序认证强制使用带签名(BOM)的UTF-8编码,因此我的所有源文件都以这种方式进行编码。我还将grunt默认编码设置为UTF-8,并将preserveBOM设置为true。虽然,我的缩小文件在us_ascii中编码,有些甚至在二进制流中编码。

对于Windows 8.1 32位和Mac OS Mavericks,这种行为是相同的。

我该怎么办?

使用UTF-8 BOM编码重新保存此打包版本会导致通过认证检查,但应用程序未运行(白屏,看起来缩小的JS不再工作,但它在重新保存之前完美无瑕)。

这是我在concat / minify之后用JS文件做的事情:

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' });

仍然没有运气-.-

3 个答案:

答案 0 :(得分:1)

我有类似的问题,虽然很多情况都不同,所以不确定解决方案是否适合你。

丑化unescapes并将\u0000regexps中的其他unicode字符转换为utf-8。

尝试使用选项uglifyascii-only=true

执行beautify=false

更多讨论at this uglify issue

答案 1 :(得分:0)

我的猜测是你的Windows加载了错误的字符集。您是否在html页面中设置了charset,以便强制浏览器使用UTF-8加载它?

这似乎是关于如何加载文件而不是如何生成/缩小文件的问题。

链接:http://www.w3.org/International/questions/qa-html-encoding-declarations

<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 </head>
 <body>
 </body>
</html>

答案 2 :(得分:0)

问题似乎是uglify合并文件和BOM的组合。 我当前的设置缩小了每个JS文件,但不再合并它们(没有必要,因为Windows应用程序将在本地存储所有脚本,因此请求不是问题)。我使用主帖子更新2中的代码段将BOM添加到最后。

我的应用程序现已成功验证并运行完美。呼...