Closed GoogleCodeExporter closed 8 years ago
As it says in the docs using ADVANCED_OPTIMIZATIONS is not recommended because
it is most likely will break javascript. If you are using command line
compressor then this optimization level should be almost always avoided.
The only way of using this optimization level properly would be to run HTML
compressor from Java and fine tune ClosureJavaScriptCompressor configuration to
your specific needs by providing a list of externs and setting proper
compilation options.
If you don't want to go through all this then please use SIMPLE_OPTIMIZATIONS
level instead.
Please see:
http://code.google.com/closure/compiler/docs/api-tutorial3.html
http://htmlcompressor.googlecode.com/svn/trunk/doc/com/googlecode/htmlcompressor
/compressor/ClosureJavaScriptCompressor.html
Original comment by serg472@gmail.com
on 25 Apr 2011 at 5:40
Hi serg472,
thanks for answering, can you explain me how is passed the script of and html
page to the closure compressor?
Best Regards
Original comment by juanschi...@gmail.com
on 25 Apr 2011 at 7:24
Each inline <script> tag is compressed individually and independently using
closure or yui compressors.
Compressing inline javascript is kind of a bad idea to begin with. The better
solution would be to move as much of your inline javascript into external js
file as possible and then compress that file instead (using closure or
whatever). It will make javascript compressor more efficient as it sees the
whole picture, your javascript will be cached by the browser, and it will make
html compression much faster as compressing inline js takes the longest time by
far.
If you feel the need of advanced closure compilation then I think it is a good
sign that you need to move your js into an external file.
Original comment by serg472@gmail.com
on 25 Apr 2011 at 7:42
Thanks, and I will try to explain my need: I use the html compressor and
closure to do static compression, because my web server run in CPU firmware
with lower count of RAM, and only one thread, and if I low the files requested
the global performance is improved.
When the htmlcompressor found a <string> tag, put the string in a file an pass
to the closure, or there are a for to pass like a line command.
Original comment by juanschi...@gmail.com
on 25 Apr 2011 at 8:11
Sorry, I didn't understand the question.
Lets say you have such page:
<html>
<script>
var a=1;
</script>
...
<script>
alert(a);
</script>
</html>
HTML compressor makes 2 calls to Closure compiler:
1. Compress "var a=1;" and put compressed result back
2. Compress "alert(a);" and put compressed result back
It doesn't use any files, just compresses strings.
If your server doesn't handle big number of connections, you can combine all
your javascript into one file (jquery.js + jquery plugins + your own files).
Combine all your images into one sprite, all your css into one file. So as a
result you will just have 3 external files to include (which will be cached by
the browser too). It is considered a good practice to combine many files into
one.
Original comment by serg472@gmail.com
on 25 Apr 2011 at 8:27
Thanks for the explanation. I will try to show the code that when compressed is
renamethe tags value, enabled, checked, etc.
the source code :
// JavaScript Document
window['default_values'] = default_values;
function get_obj(name)
{
return document.getElementById(name);
}
function default_values()
{
get_obj("i31").enabled = false;
get_obj("i32").enabled = false;
get_obj("i30").checked = false;
}
compressed with the following line:
java -jar compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --js
general_inline.htm --js_output_file general_comp.htm
give this result:
window.default_values=a;function
a(){document.getElementById("i31").enabled=!1;document.getElementById("i32").ena
bled=!1;document.getElementById("i30").checked=!1};
the
window.default_values=a;function
a(){document.getElementById("i31").enabled=!1;document.getElementById("i32").ena
bled=!1;document.getElementById("i30").checked=!1};
when compile the same code without the <script> tags with the following line:
java -jar compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --js
general_inline.htm --js_output_file general_comp.htm
give the following result:
window.default_values=a;function
a(){document.getElementById("i31").enabled=!1;document.getElementById("i32").ena
bled=!1;document.getElementById("i30").checked=!1};
The htmlcompressor witch options pass to the closure?
Original comment by juanschi...@gmail.com
on 25 Apr 2011 at 9:13
Sorry, I don't see any differences between those 3 examples.
HTML compressor calls Closure with default settings, I am not sure what they
are.
Original comment by serg472@gmail.com
on 25 Apr 2011 at 9:36
sorry, I past the wrong output:
<script>window.default_values=a;function
a(){document.a("i31").b=!1;document.a("i32").b=!1;document.a("i30").c=!1};</scri
pt>
for htmlcompress. with the following line:
java -jar htmlcompressor-1.3.jar --type html --remove-link-attr
--remove-intertag-spaces --simple-doctype --remove-quotes --remove-style-attr
--remove-input-attr --remove-form-attr --remove-js-protocol --simple-bool-attr
--remove-script-attr --charset ISO-8859-1 --compress-js --js-compressor closure
--closure-opt-level advanced general_inline.js -o general_comp.htm
I thinks the problem is that from the htmlcompressor you pass the
--use_only_custom_externs, that disable the defaults externs of closure
compiler.
Original comment by juanschi...@gmail.com
on 25 Apr 2011 at 9:51
Ok, I will look into it.
Original comment by serg472@gmail.com
on 25 Apr 2011 at 10:28
I see in the ClosureJavaScriptCompressor.java the line:
private JSSourceFile externs = JSSourceFile.fromCode("externs.js", "");
I don't know where to put the externs.js, I put in the same folder than
htmlcompressor-1.3.jar, but don't load.
Original comment by juanschi...@gmail.com
on 25 Apr 2011 at 10:53
That line just means externs are empty (default settings). Are you compressing
html from command line or directly from java api? If you are using java api
then you could do something like:
ClosureJavaScriptCompressor jsCompressor = new ClosureJavaScriptCompressor();
jsCompressor.setExterns(JSSourceFile.fromFile("/path/to/file"));
Command line compressor currently doesn't support externs.
Original comment by serg472@gmail.com
on 25 Apr 2011 at 11:22
I compress html from the command line.
Can you explain me how to compile the source of htmcompressor?
Original comment by juanschi...@gmail.com
on 26 Apr 2011 at 12:22
hi, I found how to compile, type ant and I get the compressor compiled.
Original comment by juanschi...@gmail.com
on 26 Apr 2011 at 12:45
1) If I change JSSourceFile externs = JSSourceFile.fromCode("externs.js", "");
to JSSourceFile externs = JSSourceFile.fromFile("externs.js");, I can
pass extern symbols in the externs.js file.
2) Also I found that in the this blog:
http://blog.bolinfest.com/2009/11/calling-closure-compiler-from-java.html, they
comment this:
// To get the complete set of externs, the logic in
// CompilerRunner.getDefaultExterns() should be used here.
3) Now I will try to implement, but my Java expertise is poor.
Original comment by juanschi...@gmail.com
on 26 Apr 2011 at 2:41
Ok, thank you. I should be able to make those changes by the end of the week,
so if you can wait a few days the problem should be fixed.
Original comment by serg472@gmail.com
on 26 Apr 2011 at 6:03
thanks, and I can wait.
In the mean time I made this workaround, proposed by the:
http://www.google.com/codesearch/p?hl=en#IwN_TdTjnqM/trunk/src/com/bolinfest/clo
sure/StripTypeOnlyExample.java&q=getDefaultExterns&sa=N&cd=2&ct=rc
The workaround need unzip the exports.zip in the same folder of htmlcompressor,
and add the following list:
final String path = "externs/";
List<JSSourceFile> externs = ImmutableList.of(
JSSourceFile.fromFile(path + "deprecated.js"),
JSSourceFile.fromFile(path + "es3.js"),
JSSourceFile.fromFile(path + "es5.js"),
JSSourceFile.fromFile(path + "fileapi.js"),
JSSourceFile.fromFile(path + "flash.js"),
JSSourceFile.fromFile(path + "gears_symbols.js"),
JSSourceFile.fromFile(path + "gears_types.js"),
JSSourceFile.fromFile(path + "gecko_css.js"),
JSSourceFile.fromFile(path + "gecko_dom.js"),
JSSourceFile.fromFile(path + "gecko_event.js"),
JSSourceFile.fromFile(path + "gecko_xml.js"),
JSSourceFile.fromFile(path + "google.js"),
JSSourceFile.fromFile(path + "html5.js"),
JSSourceFile.fromFile(path + "ie_css.js"),
JSSourceFile.fromFile(path + "ie_dom.js"),
JSSourceFile.fromFile(path + "ie_event.js"),
JSSourceFile.fromFile(path + "ie_vml.js"),
JSSourceFile.fromFile(path + "iphone.js"),
JSSourceFile.fromFile(path + "w3c_css.js"),
JSSourceFile.fromFile(path + "w3c_css3d.js"),
JSSourceFile.fromFile(path + "w3c_dom1.js"),
JSSourceFile.fromFile(path + "w3c_dom2.js"),
JSSourceFile.fromFile(path + "w3c_dom3.js"),
JSSourceFile.fromFile(path + "w3c_elementtraversal.js"),
JSSourceFile.fromFile(path + "w3c_event3.js"),
JSSourceFile.fromFile(path + "w3c_event.js"),
JSSourceFile.fromFile(path + "w3c_geolocation.js"),
JSSourceFile.fromFile(path + "w3c_indexeddb.js"),
JSSourceFile.fromFile(path + "w3c_range.js"),
JSSourceFile.fromFile(path + "w3c_selectors.js"),
JSSourceFile.fromFile(path + "w3c_xml.js"),
JSSourceFile.fromFile(path + "webgl.js"),
JSSourceFile.fromFile(path + "webkit_css.js"),
JSSourceFile.fromFile(path + "webkit_dom.js"),
JSSourceFile.fromFile(path + "webkit_event.js"),
JSSourceFile.fromFile(path + "webkit_notifications.js"),
JSSourceFile.fromFile(path + "webstorage.js"),
JSSourceFile.fromFile(path + "window.js")
);
attached I send you the modification.
Original comment by juanschi...@gmail.com
on 26 Apr 2011 at 6:38
Attachments:
Thanks, where can I get this "exports.zip"?
Original comment by serg472@gmail.com
on 26 Apr 2011 at 8:29
the exports.zip is inside compiler.jar
Original comment by juanschi...@gmail.com
on 26 Apr 2011 at 9:56
Attachments:
Fixed in 1.3.1 release.
When using advanced level of compilation, default externs from compiler.jar are
applied automatically. You can also provide your own list of externs that will
be added to default ones using --closure-externs <file> params, and set
--closure-custom-externs-only parameter to skip default externs.
Thanks.
Original comment by serg472@gmail.com
on 30 Apr 2011 at 6:35
serg472,
I test the new version and work fine, thanks a lot.
Regards
Juan
Original comment by juanschi...@gmail.com
on 30 Apr 2011 at 8:59
Original issue reported on code.google.com by
juanschi...@gmail.com
on 25 Apr 2011 at 3:14