javascript - 关闭编译后有错误的代码

标签 javascript google-closure-compiler

我有几个对象;一种称为 DomDependent,一种称为 WorkFlow,一种称为 mediator。

domdependent 具有以下代码:

  myApp.DomDependent.attachEvents=function(){
    myApp.mediator.attach("doConversion",mmt.WorkFlow.doConversion);

DomDependent 在中介器上注册“事件”,WorkFlow 具有实现它们的函数。当我使用 DomDependent 之后列出的 WorkFlow 编译代码时,事件被注册,但函数为空。当我使用 DomDependent 之前列出的 WorkFlow 进行编译时,某些事件根本不会注册,而有些事件则使用函数来实现它们。

我不确定实现循环依赖的正确方法是什么,因为 WorkFlow 对象也会调用 Domdependent 来获取文本框值等:

来自工作流程:

myApp.DomDependent.removeAdded();

我尝试将 goog.require 放入 DomDependent(到 WorkFlow)和 WorkFlow 到 DomDependent 中,但由于循环依赖,它根本无法编译。

因此,删除了文件中 myApp 的 goog.require 语句,并将它们作为命令行参数提供给 calcdeps.py:

set calc="D:\software\closure compiler\library\closure\bin\calcdeps.py"
c:\Python27\python.exe %calc% ^
--path D:\flex_sdk_4.6\projects\EnglishConverter\bin\js\ ^
--input D:\flex_sdk_4.6\projects\EnglishConverter\bin\js\myApp\Mediator.js ^
--input D:\flex_sdk_4.6\projects\EnglishConverter\bin\js\myApp\WorkFlow.js ^
--input D:\flex_sdk_4.6\projects\EnglishConverter\bin\js\myApp\data.js ^
--input D:\flex_sdk_4.6\projects\EnglishConverter\bin\js\myApp\Messenger.js ^
--input D:\flex_sdk_4.6\projects\EnglishConverter\bin\js\myApp\DomDependent.js ^
--compiler_jar "D:\software\closure compiler\compiler.jar" ^
--output_mode compiled ^
--compiler_flags="--compilation_level=ADVANCED_OPTIMIZATIONS" ^
--compiler_flags="--formatting=PRETTY_PRINT" ^
--compiler_flags="--warning_level=VERBOSE" ^
--output_file D:\flex_sdk_4.6\projects\EnglishConverter\bin\js\main.js
pause

我的问题是:

这是获得依赖的正确方法吗?如果我在 DomDependent 中选择 goog.require ,那么 WorkFlow 中的所有代码都会被删除,并且触发向中介器注册的任何事件都将尝试调用 undefined。

我如何确保这些函数没有被删除,它们是通过中介调用的,但我认为编译器错过了其中的几个,我还没有找出原因。未编译的代码可以工作,但编译后中介器会尝试调用不存在的函数(中介器也会编译,因此它不是重命名函数部分)。

[更新]

发现了一个我怀疑事件未注册的错误。它已注册,但由于重命名变量而没有执行任何操作。例如,此函数将文本添加到行的开头或结尾:

    myApp.WorkFlow.addBegin=function(){
        myApp.WorkFlow.addEndOrBegin("begin");
    };
    myApp.WorkFlow.addEndOrBegin=function(whereTo){
        var where={begin:"",end:""},
        lines=myApp.DomDependent.getAddwordsContent(false).split("\n"),
        i;
        where[whereTo]=mmt.DomDependent.getBeginEnd();
            for(i=0;i<lines.length;i++){
              lines[i]=where.begin+lines[i]+where.end;
   ...

在编译版本中,where 对象变量没有 begin 和 end 属性,因此 where["begin"] 不存在或未定义。

我还是想知道编译循环依赖文件的正确方法是什么。

最佳答案

您需要引用您的 beginend 属性。您当前将它们引用为带引号的属性和点式属性,这违反了 ADVANCED_OPTIMIZATIONS 的属性重命名限制。请参阅Implications of global variable, function, and property renaming

var where={begin:"",end:""}, //unquoted - quote these to fix

where[whereTo]=... //quoted

关于javascript - 关闭编译后有错误的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16234351/

相关文章:

javascript - 带有 css 转换的 jquery,有时它不起作用

javascript - vue.js - 动态 html 标签(使用变量)

javascript - 我如何告诉 Google 闭包编译器不要删除 var

google-closure-compiler - 使用谷歌闭包编译器将文件夹中的所有js压缩到新文件夹?

javascript - 忽略 Google Closure 中一个文件的编译器警告

Javascript - 谷歌闭包注释属性类型

javascript - 如何在 jquery 选项卡中加载我的谷歌地图?

javascript - jquery选择器语法问题

javascript - onmouseover javascript 照片库

javascript - 使用闭包编译器时如何拥有一组带有静态方法的类?