+1 on rewriting the JS codebase. I'm personally a huge fan of TypeScript as well and use it on a daily basis, and I don't see a downside with choosing it since it's very popular these days.
One other possibility, however, is pure Java using JSweet ( http://www.jsweet.org/). It's certainly more build overhead than just using TypeScipt, but since it uses the tsc compiler internally _and_ integrates with maven, it might be a good choice. It doesn't have a runtime library like Kotlin. ___ Kito D. Mann | @kito99 | Author, JSF in Action Web Components, Polymer, JSF, PrimeFaces, Java EE training and consulting Virtua, Inc. | virtua.tech JSFCentral.com | @jsfcentral | knowesis.io - fresh Web Components info +1 203-998-0403 * Listen to the Enterprise Java Newscast: http://enterprisejavanews.com On Thu, Oct 5, 2017 at 3:19 AM, Werner Punz <werner.p...@gmail.com> wrote: > Hi guys > > > I just wanted to start a discussion on how we are going to proceed with > the jsf.js codebase. > The issue is following: > > Our codebase which currently is adapted by me for 2.3 is rather old. > It by now is around 9-10 years old and back then most of the stuff I did > made sense > a) The library needed to be self contained > b) There were an awful lot of browsers in use, which did not adhere to any > standards whatsoever > c) There was no real inheritance system available just the prototype > system which is one level below inheritance by allowing to access the > class/object tree and manipulate it on the fly > > So what I did was following > Implement my own class system for not having to deal with prototype > inheritance all the time > Since I needed to be self contained integrating a library like JQuery > (which also was it its infancy at that time) was out of the question > due to possible conflicts. There also was no widespread support > for querySelector on node level some browsers had it some browsers > had other workarounds to speed the dom node lookup up. > > Also no unified ajax handling, the ajax api was at its infancy and I still > had to support the archaic IE way of doing things. > > To the worse there were significant differences in dom and xml handling > between the various browsers out in the wild compared to the already > defined standards (I am speaking of you IE and mobile browsers in use back > then) > > So in the end I ended up with a codebase which is about 40-50% there just > to support legacy browsers. While I did some work to isolate the quirks > code and compile it out of the codebase there still is work to be done. > > Again all of this made sense back then... > > > Lots of things have been changed in those 10 years and now most of the > things do not make sense anymore. > > a) We have saner meta languages which allow to compile to javascript, > following candidates come to my mind > > - Typescript, a language which I amn very familiar with due to my day to > day work > - Coffeescript ... not very familiar with that one > - Kotlin... yes that one also has a javascript target compiler > > We definitely should opt for a meta compiler instead of pure js. > The reasons are many, and I can speak here atm only for Typescript > > - You can change ecma script levels on build level > - You can change the package management system in build level > - You get additional coding security by having the apis fortified at least > with some types instead of doing constantly your manual asserts > - In the end the Meta language codebase is way cleaner than the original > one > > > The downside is > > > at least for typescript the maven integration is non existent, there is a > maven clientside plugin which downloads the entire node js chain onto your > machine within a build, but my guess is we do not need to do this > for the apache integration builds, because in the end we just need the js > codebase. We can add special dev profile which enables the client side > build to build the js files. > > As for Kotlin, I have not evalauted their javascript stuff but what put me > off was that the website said you have to integrate kotlin.js which is a no > go, but this depends, if kotlin.js just implements their runtime lib we can > probably bypass that. I need to have a serious look at it. > > The plus side probably is that it has decent maven support and a perfect > IDE support on the Jetbrains IDEs. (Dont get me wrong the IDE support > of Typescript also is very good on those, I use it on a daily base) > > > Browser support: > > Since mobile browsers are up to rather recent standards nowadays the > problem is the desktop which at least in a corporate environment is moving > really slowly (I wonder corporations are really cautious regarding security > and yet often use stone old often outdated not updated anymore, browsers - > but that is just a snarky sidenote). But still there things have gotten > better. > > From a browser support standpoint we probably can strip the support pre > IE9 level which means we finally at least can use a standard ajax api, ajax > multiform requests instead of the iframe hack I had to introduce for jsf > 2.2. > > I would prefer to have IE11 as baseline, given that most corporations > probably have frozen their environment on a Windows 7 IE11 baseline by now, > but I guess we have to drag at least IE9 with us with some third party lib > support. > > By mildly adding small external libraries and avoiding shims > we might get a small query monadish api on top of node.selectorAll like > jquery. > > I still would avoid to integrate jquery because we have a core lib > so everything integrated needs to be small. We do not have the luxury of > for instance Prime Faces which can require or bundle a huge lib like JQuery > and JQuery UI. > > Also we definitely would need promises (again rip the code out of a proven > shim lib but do not shim it, if it is not supported by the browser > natively) > > So my proposal is, after 2.3 I will start with a reimplementation which > might take some time in a saner environment and with a newly defined > baseline. > And once I am done we can drop it in as alternative jsf.js codebase > for the users (we still keep the old one for 2.3) > And for 2.4 upwards we will drop the legacy codebase entirely and just > use the new reworked and cleaned up one. > > > Just a little bit of food for discussion. > > Werner > > > > > >