Nothing frustrated me more about Royale/FlexJS than the fact that I couldn't
use untyped objects without bracket notation. It's a very bad user experience
when trying to consume JSON, or even when choosing to create my own object
literals. While it's a good best practice to create value objects, that
shouldn't be forced on everyone. I frequently use untyped objects when
prototyping because it's more convenient. They're also useful in example code
to reduce boilerplate that isn't particularly relevant to the concept/feature
that you're trying to demonstrate. And, of course, there's the already
mentioned JSON.
In the past, I kept trying to advocate making SIMPLE_OPTIMIZATIONS the default
instead of ADVANCED_OPTIMIZATIONS. In my opinion the slightly larger file size
is an acceptable trade off, if it reduces the frustration of this situation.
Especially for new users who will absolutely think its a serious bug in the
Royale compiler. However, as Harbs notes here, if the compiler were a little
smarter, ADVANCED_OPTIMIZATIONS could be retained. The compiler could generate
code differently when something resolves as the Object type. The emitter could
translate dot notation normally most of the time, and let
ADVANCED_OPTIMIZATIONS do its renaming. However, if it detects Object, switch
to bracket notation instead. I believe it would also need to add quotes around
properties defined in object literals.
Ideally, the following code should work properly out of the box:
var obj:Object = {one: 1, "two": 2};
obj.three = 3;
obj["four"] = 4;
var one:Number = obj["one"];
var two:Number = obj.two;
var three:Number = obj["three"];
var four:Number = obj.four;
The compiler would probably emit something like this to make it work with the
Closure compiler's ADVANCED_OPTIMIZATIONS:
var obj:Object = {"one": 1, "two": 2};
obj["three"] = 3;
obj["four"] = 4;
var one:Number = obj["one"];
var two:Number = obj["two"];
var three:Number = obj["three"];
var four:Number = obj["four"];
Again, that's only for when something is typed as Object. If something actually
has a class, let Closure compiler go nuts and rename everything it wants.
- Josh
On 2018/02/06 08:51:19, Gabe Harbs <[email protected]> wrote:
> Quite sure. In my angular app I was using an older version of the closure
> compiler to minify the js files. I was using the default options which
> clearly does not use ADVANCED_OPTIMIZATIONS, so the object literals didnât
> get renamed.
>
> I think most modern app frameworks use other tools such as Babel for
> magnification, but I believe that handles object literals correctly too.
>
> We definitely want to use ADVANCED_OPTIMIZATIONS, but thatâs killing object
> literals. Iâm proposing a compiler *option* to allow to continue using
> ADVANCED_OPTIMIZATIONS, but prevent renaming on objects which should not be
> renamed.
>
> Harbs
>
> > On Feb 6, 2018, at 9:38 AM, Alex Harui <[email protected]> wrote:
> >
> > Are you sure Angular and React minify your code instead of running it
> > against their minified framework?
> >
> > -Alex
> >
> > On 2/5/18, 11:22 PM, "Gabe Harbs" <[email protected]> wrote:
> >
> >>> Maybe I'm missing something. I don't think Royale has any extra
> >>> problems
> >>> with JSON objects than other JS Frameworks have. If you want to minify,
> >>> you have to use brackets and strings.
> >>
> >> It does.
> >>
> >> Iâve written angular apps and Iâve never had to worry about using
> >> bracket
> >> notation for minifying simple js objects. Iâm pretty sure the same is for
> >> React, etc.
> >>
> >>> On Feb 5, 2018, at 11:34 PM, Alex Harui <[email protected]>
> >>> wrote:
> >>>
> >>> Maybe I'm missing something. I don't think Royale has any extra
> >>> problems
> >>> with JSON objects than other JS Frameworks have. If you want to minify,
> >>> you have to use brackets and strings. If you don't want to minify, then
> >>> you don't need to worry about that. Am I wrong about that?
> >>>
> >>>
> >>> JSON has something like a "reviver". Has anyone played with that to see
> >>> if it can be used to convert straight to VO's?
> >>>
> >>> Thanks,
> >>> -Alex
> >>>
> >>> On 2/5/18, 1:08 PM, "Gabe Harbs" <[email protected]> wrote:
> >>>
> >>>> An additional point:
> >>>>
> >>>> How do you propose handling json thatâs multiple levels deep? Walk the
> >>>> json and construct VOs on each level? That seems to me just as bad as
> >>>> the
> >>>> problem. Imagine you just want foo.baz.thingy.uid? Youâd need to
> >>>> create a
> >>>> VO of foo, baz and thingy or be forced to use
> >>>> foo[âbazâ][âthingyâ][âuidâ]. Of course the average user is
> >>>> not going to
> >>>> remember to do that until their release build doesnât workâ¦
> >>>>
> >>>> Creating VOs means you canât simply use JSON.parse(). Youâd need your
> >>>> own
> >>>> parser for each type of json youâre consuming. OK. Maybe not full
> >>>> parsing, but the constructors for these VOs will get pretty messy â
> >>>> especially if the structure is a bit fluid.
> >>>>
> >>>> Harbs
> >>>>
> >>>>
> >>>>> On Feb 5, 2018, at 10:36 PM, Gabe Harbs <[email protected]> wrote:
> >>>>>
> >>>>> In theory, everything you say is true. It might even be good practice.
> >>>>>
> >>>>> Iâm telling you that this was a pain point when migrating my app.
> >>>>> Simply declaring types as VOs didn't solve the problem for me. The way
> >>>>> Iâve found thatâs needed to solve the problem was passing the object
> >>>>> literal into a VO constructor and declaring the variables using
> >>>>> bracketed access. I was likely going about it wrong, but it was easier
> >>>>> to just go with the bracketed literals.
> >>>>>
> >>>>> Again: Suggesting using VOs (if we can figure out easy instructions to
> >>>>> do so) is probably a good idea and better recommended practice, but
> >>>>> people live on the edge using other JS frameworks, and Iâd rather not
> >>>>> make it harder than it needs to be if they do want to use untyped
> >>>>> object
> >>>>> literals.
> >>>>>
> >>>>> Harbs
> >>>>>
> >>>>>> On Feb 5, 2018, at 8:01 PM, Alex Harui <[email protected]>
> >>>>>> wrote:
> >>>>>>
> >>>>>> It was great to skip type-checking in Flash at times, but the runtime
> >>>>>> was
> >>>>>> also strongly typed. Also, JS was not a practical language for
> >>>>>> Flash.
> >>>>>> It
> >>>>>> is more risky to do skip type-checking in Royale for JS. These new
> >>>>>> cars
> >>>>>> with lane warnings are a rough analogy. They only let you be less
> >>>>>> attentive on nice new painted highways. Flash's runtime wouldn't let
> >>>>>> you
> >>>>>> make type mismatches so it effectively had lane lines. JS is a road
> >>>>>> without lane lines. A ValueObject keeps your eyes on the road. An
> >>>>>> ounce
> >>>>>> of prevention is better than a pound of cure.
> >>>>>>
> >>>>>> IMO, you might be better off writing a bead that you can pass a JSON
> >>>>>> object and it will generate the AS class for you to copy from the
> >>>>>> clipboard and paste into a file. Then you could guess at the types.
> >>>>>> That
> >>>>>> wouldn't require compiler changes and would encourage early
> >>>>>> prevention.
> >>>>>>
> >>>>>> Just an idea,
> >>>>>> -Alex
> >>>>>>
> >>>>>> On 2/5/18, 9:39 AM, "Gabe Harbs" <[email protected]> wrote:
> >>>>>>
> >>>>>>> Yeah. Thatâs what youâve argued in the past, and in a pure world
> >>>>>>> youâd be
> >>>>>>> right.
> >>>>>>>
> >>>>>>> However, Iâd prefer the option to be practical when dealing with
> >>>>>>> more
> >>>>>>> data types. Being forced to fiddle with properly typed objects
> >>>>>>> *always*
> >>>>>>> is too confining IMO. What I personally ended up doing when dealing
> >>>>>>> with
> >>>>>>> APIs and the like was the make sure to quote everything in my app
> >>>>>>> rather
> >>>>>>> than declare VOs even though finding all the instances were a pain.
> >>>>>>>
> >>>>>>> I think itâs pretty common for folks to use untyped objects
> >>>>>>> *especially*
> >>>>>>> when dealing with APIs in classic Flex apps. It seem overly
> >>>>>>> draconian
> >>>>>>> to
> >>>>>>> make that a requirement for Royale.
> >>>>>>>
> >>>>>>> Part of the attraction of ActionScript has been that itâs
> >>>>>>> *optionally*
> >>>>>>> typed. Minification in JS makes the optional typing pretty weak.
> >>>>>>>
> >>>>>>>> If you don't care about SWF support, you can quickly make
> >>>>>>>> ValueObjects
> >>>>>>>> just for the compiler.
> >>>>>>>
> >>>>>>> Quickly? Iâm not sure how.
> >>>>>>>
> >>>>>>> My $0.02.
> >>>>>>> Harbs
> >>>>>>>
> >>>>>>>> On Feb 5, 2018, at 7:28 PM, Alex Harui <[email protected]>
> >>>>>>>> wrote:
> >>>>>>>>
> >>>>>>>> IMO, your proposal sort of defeats the purpose of ActionScript and
> >>>>>>>> Royale,
> >>>>>>>> which is to provide a type system at compile time. Not only should
> >>>>>>>> you
> >>>>>>>> want to address your JSON fields, but you should want to have them
> >>>>>>>> type-checked, and that you spelled the field name correctly.
> >>>>>>>> Otherwise,
> >>>>>>>> the compiler is going to also allow you to mistype:
> >>>>>>>>
> >>>>>>>> var name = myProps["nme"];
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> And there will be no errors. And similarly:
> >>>>>>>>
> >>>>>>>> var myObj:Object = {
> >>>>>>>> nme: "foo",
> >>>>>>>> age : 30.1415
> >>>>>>>> }
> >>>>>>>>
> >>>>>>>> Will be allowed when it probably shouldn't. And also, you could
> >>>>>>>> then
> >>>>>>>> use
> >>>>>>>> myObj when you intended to use myOtherObj and nobody will know
> >>>>>>>> until
> >>>>>>>> you
> >>>>>>>> try to debug in JS.
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> If you don't care about SWF support, you can quickly make
> >>>>>>>> ValueObjects
> >>>>>>>> just for the compiler. In ASDoc, the ValueObject is never
> >>>>>>>> instantiated.
> >>>>>>>> It is just like a typedef for the compiler.
> >>>>>>>>
> >>>>>>>> HTH,
> >>>>>>>> -Alex
> >>>>>>>>
> >>>>>>>> On 2/5/18, 8:43 AM, "Gabe Harbs" <[email protected]> wrote:
> >>>>>>>>
> >>>>>>>>>> JSON Objects are not destroyed.
> >>>>>>>>>
> >>>>>>>>> Yeah. I know, but untyped js literals are pretty much useless in
> >>>>>>>>> minified
> >>>>>>>>> Royale apps.
> >>>>>>>>>
> >>>>>>>>>> Propose a way to determine that a data structure
> >>>>>>>>>> is external and what the compiler should generate and implement
> >>>>>>>>>> it.
> >>>>>>>>>> IMO,
> >>>>>>>>>> the answer is to create ValueObjects. That is essentially
> >>>>>>>>>> typedefs
> >>>>>>>>>> and
> >>>>>>>>>> AFAIK, there is no way to automate typedef generation.
> >>>>>>>>>
> >>>>>>>>> I already made a suggestion once:
> >>>>>>>>>
> >>>>>>>>> For untyped Objects, the compiler could convert dot notation to
> >>>>>>>>> bracket
> >>>>>>>>> notation.
> >>>>>>>>>
> >>>>>>>>> The other half of that would be to convert all object literals to
> >>>>>>>>> âquotedâ literals automatically.
> >>>>>>>>>
> >>>>>>>>> So if I have a function:
> >>>>>>>>>
> >>>>>>>>> function parseMyJson(json:String):Object{
> >>>>>>>>> return JSON.parse(json);
> >>>>>>>>> }
> >>>>>>>>>
> >>>>>>>>> var myProps:Object = parseMyJson(json);
> >>>>>>>>>
> >>>>>>>>> var name:string = myProps.name;
> >>>>>>>>>
> >>>>>>>>> Would become:
> >>>>>>>>>
> >>>>>>>>> function parseMyJson(json){
> >>>>>>>>> return JSON.parse(json);
> >>>>>>>>> }
> >>>>>>>>>
> >>>>>>>>> var myProps = parseMyJson(json);
> >>>>>>>>>
> >>>>>>>>> var name = myProps["name"];
> >>>>>>>>>
> >>>>>>>>> And this:
> >>>>>>>>> var myObj:Object = {
> >>>>>>>>> name: "foo",
> >>>>>>>>> age : 30
> >>>>>>>>> }
> >>>>>>>>>
> >>>>>>>>> Would become:
> >>>>>>>>> var myObj = {
> >>>>>>>>> "name": "foo",
> >>>>>>>>> "age" : 30
> >>>>>>>>> }
> >>>>>>>>>
> >>>>>>>>> These two features would have solved almost all minification
> >>>>>>>>> issues
> >>>>>>>>> Iâve
> >>>>>>>>> run into.
> >>>>>>>>>
> >>>>>>>>> Iâd love to work on this myself, but Iâm still not up to making
> >>>>>>>>> any
> >>>>>>>>> major
> >>>>>>>>> changes to the compiler⦠:-(
> >>>>>>>>>
> >>>>>>>>>> On Feb 5, 2018, at 6:13 PM, Alex Harui <[email protected]>
> >>>>>>>>>> wrote:
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>> On 2/5/18, 2:01 AM, "Gabe Harbs" <[email protected]> wrote:
> >>>>>>>>>>
> >>>>>>>>>>> Iâll try to work on this. Itâs pretty slow loading the debug
> >>>>>>>>>>> build.
> >>>>>>>>>>>
> >>>>>>>>>>> I still maintain there should be a compiler setting or language
> >>>>>>>>>>> feature
> >>>>>>>>>>> to prevent objects produced from JSON being destroyed on
> >>>>>>>>>>> minification.
> >>>>>>>>>>
> >>>>>>>>>> JSON Objects are not destroyed. The code referencing their
> >>>>>>>>>> fields
> >>>>>>>>>> by
> >>>>>>>>>> name
> >>>>>>>>>> has those names changed. Propose a way to determine that a data
> >>>>>>>>>> structure
> >>>>>>>>>> is external and what the compiler should generate and implement
> >>>>>>>>>> it.
> >>>>>>>>>> IMO,
> >>>>>>>>>> the answer is to create ValueObjects. That is essentially
> >>>>>>>>>> typedefs
> >>>>>>>>>> and
> >>>>>>>>>> AFAIK, there is no way to automate typedef generation.
> >>>>>>>>>>
> >>>>>>>>>> Also, you can turn off minification for the app as a whole.
> >>>>>>>>>>
> >>>>>>>>>> Other ideas welcome,
> >>>>>>>>>> -Alex
> >>>>>>>>>>
> >>>>>>>>>>> This remains a pain point for developing apps and having to
> >>>>>>>>>>> create
> >>>>>>>>>>> VOs
> >>>>>>>>>>> for every API is a drag.
> >>>>>>>>>>>
> >>>>>>>>>>>> On Feb 5, 2018, at 10:21 AM, Alex Harui
> >>>>>>>>>>>> <[email protected]>
> >>>>>>>>>>>> wrote:
> >>>>>>>>>>>>
> >>>>>>>>>>>>
> >>>>>>>>>>>>
> >>>>>>>>>>>> On 2/4/18, 1:10 AM, "Gabe Harbs" <[email protected]> wrote:
> >>>>>>>>>>>>
> >>>>>>>>>>>>> Typo. I meant js-reease.
> >>>>>>>>>>>>
> >>>>>>>>>>>> Yeah, at some later point in time someone should build Value
> >>>>>>>>>>>> Objects
> >>>>>>>>>>>> for
> >>>>>>>>>>>> the JSON and get js-release working. Maybe after this release.
> >>>>>>>>>>>> I'm
> >>>>>>>>>>>> just
> >>>>>>>>>>>> trying to make the ASDoc useful.
> >>>>>>>>>>>>
> >>>>>>>>>>>> I'm going to add Events to the class detail page and anchor
> >>>>>>>>>>>> links
> >>>>>>>>>>>> from
> >>>>>>>>>>>> the
> >>>>>>>>>>>> lists to the details and maybe a simple search-for-class
> >>>>>>>>>>>> feature,
> >>>>>>>>>>>> then I
> >>>>>>>>>>>> think it will be time for a release.
> >>>>>>>>>>>>
> >>>>>>>>>>>> -Alex
> >>>>>>>>>>>>>
> >>>>>>>>>>>>>> On Feb 4, 2018, at 8:08 AM, Alex Harui
> >>>>>>>>>>>>>> <[email protected]>
> >>>>>>>>>>>>>> wrote:
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> 1. Why is bin-release not working?
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> Do you mean SWF support?
> >>>>>>>>>>>>>
> >>>>>>>>>>>>
> >>>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>
> >>>>>>>>
> >>>>>>>
> >>>>>>
> >>>>>
> >>>>
> >>>
> >>
> >
>
>