【问题标题】:Get TypeScript to export proper function name for closure-compiler?让 TypeScript 为闭包编译器导出正确的函数名称?
【发布时间】: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 aclosuretools.blogspot.com/2012/09/…
  • @Katana314:没什么,实际上是 g.f.e.;正如我在问题下面写的那样,“命名空间也一样”

标签: javascript typescript minify google-closure-compiler


【解决方案1】:

使用一个通用的超类来存储静态方法:

在 TypeScript 中,类的静态属性是继承的,而在 Closure 中则不是。为了解决这个问题,我们创建了一个通用的超类。

这些虚假的超类实际上并不存在,只是为了模拟 TypeScript 定义文件中goog.inherits(SubClass, SuperClass) 的行为。在非声明 TypeScript 代码中调用 new SuperClass__Classextends SuperClass__Class 将产生运行时错误。您应该在非声明 TypeScript 代码中使用 new SuperClassextends SuperClass

参考文献

【讨论】:

    【解决方案2】:

    Cookie["createCookie"] = createCookie;

    使用此 ^ 解决方法或在闭包编译器上切换名称修饰。

    【讨论】:

    • 他知道这行得通。他想找到一种方法,让 TypeScript 在编译成 JavaScript 时以这种方式生成函数。
    • @Katana314:没错;即使我手动完成,Visual Studio 也会在下一次更改时覆盖(如果生成的代码可以正常工作,那就没问题了)。
    • @basarat:这是问题的描述,而不是解决方案。
    猜你喜欢
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多