【发布时间】:2015-09-21 14:33:50
【问题描述】:
我有以下 TypeScript:
namespace CompanyName.HtmlTools.Cookie
{
export function eraseCookie(name:string, path:string)
{
createCookie(name, "", path, -1);
}
export function readCookie(name:string)
{
var nameEQ:string = name + "=";
var ca:string[] = document.cookie.split(';');
for(var i=0;i < ca.length;i++)
{
var c:string = ca[i];
while (c.charAt(0) == ' ') c = c.substring(1, c.length);
if (c.indexOf(nameEQ) == 0)
return c.substring(nameEQ.length, c.length);
}
return null;
}
// http://stackoverflow.com/questions/14573223/set-cookie-and-get-cookie-with-javascript
// http://blog.codinghorror.com/protecting-your-cookies-httponly/
export function createCookie(name:string, value:string, path:string, days:number)
{
var expires:string = "";
if(!path)
path = "/";
if (days)
{
var date:Date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
expires = "expires=" + date.toUTCString() + "; ";
}
var allValues = name + "=" + encodeURIComponent(value) + "; " + expires + "path=" + path + ";";
if(window.location.protocol === 'https:')
allValues += " secure;"
document.cookie = allValues;
}
export function getDirName(path:string)
{
if(path === null) return '/';
if(path.indexOf("/") !== -1)
{
var subs:string[] = path.split('/') //break the string into an array
subs.pop() //remove its last element
path = subs.join('/') //join the array back into a string
if(path === '')
return '/';
return path;
}
return "/";
}
}
现在我希望能够像这样使用这个打字稿的最小化和优化的 JavaScript:
CompanyName.HtmlTools.Cookie.createCookie("name","value", "path", 2);
但是,当我通过 google 闭包编译器(仅在高级模式下)运行它时,漂亮的函数名称消失了,我有了 CompanyName.HtmlTools.Cookie.f,它破坏了使用此脚本的所有其他脚本。
现在,问题似乎是,在 TypeScript 转译器创建的未压缩的 javaScript 中,有这样的:
Cookie.createCookie = createCookie;
如果是的话
Cookie["createCookie"] = createCookie;
然后它将在高级模式下的 Closure-Compiler 中工作。
有没有办法让 TypeScript 将函数导出为
Cookie["createCookie"] = createCookie;
而不是
Cookie.createCookie = createCookie;
?
命名空间也一样,应该是
})(window["CompanyName"]|| (window["CompanyName"] = {}));
而不是
})(公司名 || (公司名= {}));
【问题讨论】:
-
我不是 Closure 方面的专家,但我会首先考虑在 Closure 上修复该选项。我很惊讶它的默认行为是完全消除用户定义的字符串映射,只是因为它认为它们只是在内部使用。
-
@Katana314 闭包编译器的行为是设计使然——但它只是编译器高级模式的一部分。这绝对不是错误。
-
不过我很好奇;既然函数名与模块名一样重要,那么是什么阻止了
CompanyName.HtmlTools.Cookie成为g.f.e?如果所有内部代码都是同一编译过程的一部分,那么仍然可以让所有内部代码正常工作,但同样会破坏外部代码。 -
@Katana314 高级模式下的闭包编译器假定它知道所有外部库/代码以及源的所有外部使用。如果正确满足这些假设,
CompanyName.HtmlTools.Cookie可以变为var a。 closuretools.blogspot.com/2012/09/… -
@Katana314:没什么,实际上是 g.f.e.;正如我在问题下面写的那样,“命名空间也一样”
标签: javascript typescript minify google-closure-compiler