I put my thoughts together on improving SimpleCSSValuesImpl here: 
https://github.com/apache/royale-asjs/issues/1171

Regarding your points:

> On Dec 29, 2021, at 3:55 AM, Alex Harui <aha...@adobe.com.INVALID> wrote:
> 
> Theoretically, we can build a better optimizer/minifier than Google since 
> they have to be general purpose and we know the patterns in our code.

Yeah. Maybe one day. This sounds like a super-hard problem.

> I've mentioned adding a super-strict compiler option before.  It would warn 
> on every Object and * type resolution.  Maybe that would help?

Probably not. I have too many legitimate cases of those.

> Does it matter whether you remove unused classname strings before or after 
> minification?  Maybe a post-processor can remove all className strings that 
> aren't implementing IUIBase if you know you don't need them.

No. I actually have a post-processor shell script to get rid of (actually 
rename) qualified names. But we should have a general purpose solution

> We discussed ways of shortening private names in the past as well.  Maybe it 
> is time to implement that.

Maybe.

> 
> -Alex
> 
> On 12/28/21, 1:36 PM, "Harbs" <harbs.li...@gmail.com 
> <mailto:harbs.li...@gmail.com>> wrote:
> 
>    After 2 weeks of intense work, I got my app fully functional with the 
> options below.
> 
>    Here’s in short what I did:
> 
>    1. I audited as many cases of quoted access I could in the unminified JS 
> code. Any place where it was accessing something on a class/instance was 
> because the compiler couldn’t figure out the type.
>    2. I added types to all the places I could find. I basically eliminated 
> every use of :Object and :* that I could.
>    3. I used Vectors where I could (using the 
> -js-vector-emulation-class=Array option)
>    4. I removed unknown class accessors (no looping through classes and 
> calling static methods) 
>    5. Removed all the dynamic bracket access and assignment. (no for-ins on 
> class instances, etc.)
> 
>    In my travels I discovered that:
>    1. Jewel does not look like it can be aggressively minified. (Spectrum 
> can.)
>    2. MX/Spark does not look like it can either.
>    3. I need to heavily modify my already modified version of TLF to get it 
> to work with minification.
>    4. There was some unnecessary Reflection and Vector dependencies in 
> framework code which I fixed.
>    5. Class names is a prime candidate for code removal, and (besides 
> reflection) the current roadblock with that is SimpleCSSValuesImpl which 
> accesses ROYALE_CLASS_INFO. If we can eliminate that, I’d save 66KB (12KB 
> gzipped) in my app.
>    6. It’s worthwhile to use protected methods for event listener callbacks, 
> because the long-winded private method names end up in the minified code. (I 
> still need to address this.)
> 
>    End results:
> 
>    Before my effort, my app was 2,903,814 bytes and 777,071 bytes when gzipped
>    Afterwards: 1,989,596 bytes and 621,851 bytes gzipped
> 
>    That’s a savings of 1MB before gzipping (about 1/3) and 155KB after 
> gzipping. (about 20% reduction)
> 
>    If we can get rid of the class names we can get down to: 1,923,653 
> bytes/610,493 bytes.
> 
>    A little over 600KB is a totally reasonable size for an application of 
> this size and complexity. The Flash version was MANY times that and has a LOT 
> less code.
> 
>    This turned into somewhat of an obsession for me, but I’m pleased with the 
> results. :-)
> 
>    HTH,
>    Harbs
>> On Dec 16, 2021, at 8:54 PM, Harbs <harbs.li...@gmail.com> wrote:
>> 
>> Well I spent more time. Besides the XML issues which are pretty much 
>> resolved, I ran into:
>> 
>> 1. I have a setter in a class which was removed by the goog dead code 
>> removal. I worked around it by turning the setter into a method. I’ll see if 
>> I can come up with a minimal test case on that.
>> 
>> 2. I have a library which has a LOT of dynamic pieces. I spent a LONG time 
>> trying to assign types to places where I was getting runtime errors. I now 
>> got to the point where there’s no more runtime errors, but it’s still not 
>> working and I’m pretty sure it’s because I missed some typing.
>> 
>> Is there any way to keep public accessors on one library or specific 
>> classes? I’d like to compile my app with:
>> 
>> "-js-dynamic-access-unknown-members=true",
>> "-export-public-symbols=false",
>> "-prevent-rename-protected-symbols=false",
>> "-prevent-rename-public-symbols=false",
>> "-prevent-rename-internal-symbols=false"
>> 
>> but be able to exclude a list of classes from that.
>> 
>>> On Dec 1, 2021, at 7:47 PM, Harbs <harbs.li...@gmail.com 
>>> <mailto:harbs.li...@gmail.com> <mailto:harbs.li...@gmail.com 
>>> <mailto:harbs.li...@gmail.com>>> wrote:
>>> 
>>> I’m pretty sure the issue is related to events not being properly handled. 
>>> Although blinding might be worth looking into.
>>> 
>>> I’ll look into it some more when I have more time.
>>> 
>>> Thanks!
>>> 
>>>> On Dec 1, 2021, at 7:14 PM, Josh Tynjala <joshtynj...@bowlerhat.dev 
>>>> <mailto:joshtynj...@bowlerhat.dev> <mailto:joshtynj...@bowlerhat.dev 
>>>> <mailto:joshtynj...@bowlerhat.dev>>> wrote:
>>>> 
>>>>> It *almost* works. I found and fixed two cases of bracket access which
>>>> broke things. Now I’m getting no errors, but it’s still not quite working.
>>>> I’m guessing it’s something simple that I need to fix.
>>>> 
>>>> Have you tried a smaller set of prevent-rename options? That might help you
>>>> narrow things down, if things start working better. I'd try allowing public
>>>> variables, and maybe public accessors, to be renamed first, and see if that
>>>> works. Those types of symbols are most likely to be getting accessed
>>>> dynamically somehow. However, I don't really have much in the way of tips
>>>> to narrow it down from there. ConstantBinding would be one thing to look
>>>> out for, which I mentioned in my summary.

Reply via email to