Ask Questions and Find Answers
Important:
Ask is now read-only. You can review any existing questions and answers, but not add anything new.
But - don't panic! While ask is no more, we've replaced it with discuss - the new Liferay Discussion Forum! Read more here here or just visit the site here:
discuss.liferay.com
RE: Improving page load performance (reducing Javascript)
After migrating from 6.2 to 7.1 I am disappointed by degrading the page load performance. While bare 6.2 page requires 1.5 MB resources to load, the 7.1 version requires 5.5 MB (the initial load without anything in the cache yet). I can see some improvements in 7.2, which requires 4.5 MB. Once the page is cached, the size is reduced, but it is IMHO still too high (1.5 M
.
My portlets are typical Liferay MVC portlets, just JSP + standard taglibs (AUI, Liferay UI) + plain JavaScript. Even these portlets are simple, I suppose lot of additional dependencies goes from the core components like navigation menu, personal menu or additional stuff from the Classic theme.
I am afraid there is mix of frameworks used across the portal (AUI, Metal) requiring various dependencies. Clay components are beying migrated to React, which is another one to the future mix.
Is there a chance to reduce this JavaScript package size without complete rewriting the frontend, e.g by avoiding few not so important components? I like Classic theme and with small tweaks it satisfies my needs.

My portlets are typical Liferay MVC portlets, just JSP + standard taglibs (AUI, Liferay UI) + plain JavaScript. Even these portlets are simple, I suppose lot of additional dependencies goes from the core components like navigation menu, personal menu or additional stuff from the Classic theme.
I am afraid there is mix of frameworks used across the portal (AUI, Metal) requiring various dependencies. Clay components are beying migrated to React, which is another one to the future mix.
Is there a chance to reduce this JavaScript package size without complete rewriting the frontend, e.g by avoiding few not so important components? I like Classic theme and with small tweaks it satisfies my needs.
There is not a "mix of frameworks" really.
Metal is the lowest level, AUI sits on top of that and clay essentially refers more to material design than it does a Javascript framework. There is a minimal JQuery (to support Bootstrap).
But all of this script is necessary to support the interactivity built into the UI. You can't have interactive w/o Javascript. And sure, it is more JS than what you would need if you hand-coded the interactivity for a specific page and the necessary widgets that were on it, but Liferay uses its JS frameworks to support the widgets on any portal page.
I still find these kinds of arguments interesting. Yes, the first time load of a page is going to be heavy, there is no arguing about that. But the reality is that the browser is going to cache that and use it for all subsequent requests... So sure, let's say the first page load does pull down 5.5 mb of data, but what is the measurement for the subsequent requests? I mean, does it drop down to 5k or something? 1.5m, that kind of implies that you have fairly large pages with a lot of portlets on them, possibly without enabling Senna, so it reflects more your own choices instead of a portal default of 1.5m per request...
I mean, I won't argue the first page size, there's no way around it, there is always going to be that hit. Even as the portal's JS changes (from the old Prototype to JQuery to AUI/YUI to Metal/AUI and maybe off to React or whatever other form it takes), the first page hit is going to be heavy.
But in reality no real browser is going to take that hit on every other page request. All browsers will cache those artifacts and reuse them, even mobile browsers.
So for me, the argument about JS download size, well it starts to lose water. It's a one time hit the first time a user hits your site. Ideally you'll have the minified version of the JS and it will serve from a cache appliance like Varnish. But you take that hit and all subsequent requests, including those from future visits from the same browser, they'll use the cache and not pull again. So for the level of interactivity you get, the dynamism that is supported across every portal page, that works without having to code up a React or other JS framework to make all pages so interactive, well that seems to me like a really small price to pay in the end.
Metal is the lowest level, AUI sits on top of that and clay essentially refers more to material design than it does a Javascript framework. There is a minimal JQuery (to support Bootstrap).
But all of this script is necessary to support the interactivity built into the UI. You can't have interactive w/o Javascript. And sure, it is more JS than what you would need if you hand-coded the interactivity for a specific page and the necessary widgets that were on it, but Liferay uses its JS frameworks to support the widgets on any portal page.
I still find these kinds of arguments interesting. Yes, the first time load of a page is going to be heavy, there is no arguing about that. But the reality is that the browser is going to cache that and use it for all subsequent requests... So sure, let's say the first page load does pull down 5.5 mb of data, but what is the measurement for the subsequent requests? I mean, does it drop down to 5k or something? 1.5m, that kind of implies that you have fairly large pages with a lot of portlets on them, possibly without enabling Senna, so it reflects more your own choices instead of a portal default of 1.5m per request...
I mean, I won't argue the first page size, there's no way around it, there is always going to be that hit. Even as the portal's JS changes (from the old Prototype to JQuery to AUI/YUI to Metal/AUI and maybe off to React or whatever other form it takes), the first page hit is going to be heavy.
But in reality no real browser is going to take that hit on every other page request. All browsers will cache those artifacts and reuse them, even mobile browsers.
So for me, the argument about JS download size, well it starts to lose water. It's a one time hit the first time a user hits your site. Ideally you'll have the minified version of the JS and it will serve from a cache appliance like Varnish. But you take that hit and all subsequent requests, including those from future visits from the same browser, they'll use the cache and not pull again. So for the level of interactivity you get, the dynamism that is supported across every portal page, that works without having to code up a React or other JS framework to make all pages so interactive, well that seems to me like a really small price to pay in the end.
David H Nebinger:
The thing is, Liferay is compared to other products, which do better. ALOT better. Also, Webpages get measured by the first page load time. All tools out there use that as one of the main metrics.
So for me, the argument about JS download size, well it starts to lose water. It's a one time hit the first time a user hits your site. Ideally you'll have the minified version of the JS and it will serve from a cache appliance like Varnish. But you take that hit and all subsequent requests, including those from future visits from the same browser, they'll use the cache and not pull again.
Google gives the Liferay classic them ZERO points on speed. I just checked. liferay.com actually gets 4 points from google. You can try to explain whatever you want, but often customers just don't care. When SEO is a topic, you get whacked for the abysmal performance in google page insights. It's ZERO points. And that's simply bad.
If you don't have a cdn, it really makes a difference. Go, measure a site without cdn using webpagetest.org from various locations in the world.
And I actually don't understand why an empty page, nonauthenticated, needs to load 4-5 MB javascript and an 1 MB css. It loads e.g. a product-menu css from product-navigation-product-menu-theme-contributor.
Why? I am not authenticated. Why is that css loaded? (Maybe some productmenu js is loaded too, but with that combo thingy it is hard to find out).
Liferay works pretty well for Intranet situations, but for Extranet and as a Webpage, it could do better.
The problem is that Liferay does not have any idea what an implementor is going to use on guest pages. Liferay does distinguish between the javascript.barebones.files and javascript.everything.files so unauthenticated users can have a smaller set of JS, but the OOTB barebones is more or less configured for doing Liferay demos where an admin might have a guest page with a calendar, a poll, the dictionary, ...
Since Liferay never knows what portlets you may have on your guest pages, the javascript.barebones.files tends to be on the heavy side so they don't have to deal with reports of "I dropped portlet XYZ on a guest page but guests can't use it" because the implementor wouldn't be aware of those properties that they would otherwise need to set up to use XYZ on guest pages.
However, as the implementor, you know what portlets you have on your guest pages and you are free to whittle away at the javascript.barebones.files property in portal-ext.properties... You can move entries from javascript.barebones.files to javascript.everything.files until you get the minimal set that make the portlets you use on guest pages functional.
So you do have the power to reduce the first time load, it will just take time, research and experimentation on your part to create the barebones list that works for you. This may also not be a one-time thing; if you add a new portlet to a guest view, you'll need to verify that your barebones list still works and may need to make changes if it doesn't.
Or you can stick with the basic OOTB configuration. This way the time, research and experimentation isn't necessary, all guest views will just work regardless of the changes you might make. The cost though is the FPV load...
Since Liferay never knows what portlets you may have on your guest pages, the javascript.barebones.files tends to be on the heavy side so they don't have to deal with reports of "I dropped portlet XYZ on a guest page but guests can't use it" because the implementor wouldn't be aware of those properties that they would otherwise need to set up to use XYZ on guest pages.
However, as the implementor, you know what portlets you have on your guest pages and you are free to whittle away at the javascript.barebones.files property in portal-ext.properties... You can move entries from javascript.barebones.files to javascript.everything.files until you get the minimal set that make the portlets you use on guest pages functional.
So you do have the power to reduce the first time load, it will just take time, research and experimentation on your part to create the barebones list that works for you. This may also not be a one-time thing; if you add a new portlet to a guest view, you'll need to verify that your barebones list still works and may need to make changes if it doesn't.
Or you can stick with the basic OOTB configuration. This way the time, research and experimentation isn't necessary, all guest views will just work regardless of the changes you might make. The cost though is the FPV load...
From the portal.properties comments in https://github.com/liferay/liferay-portal/blob/master/portal-impl/src/portal.properties these barebone/everything properties are empty and marked deprecated:
# This configuration is deprecated because it can be configured in a modular
# way using the "Liferay-JS-Resources-Top-Head" header in OSGi bundles'
# manifest files. It will be removed from this file in a future release.
javascript.barebone.files=
I can imagine to tweak 'Liferay-JS-Resources-Top-Head' in my bundles, but I am afraid there is no much to do with core ones.
# This configuration is deprecated because it can be configured in a modular
# way using the "Liferay-JS-Resources-Top-Head" header in OSGi bundles'
# manifest files. It will be removed from this file in a future release.
javascript.barebone.files=
I can imagine to tweak 'Liferay-JS-Resources-Top-Head' in my bundles, but I am afraid there is no much to do with core ones.
Master would represent the new 7.3 line, not a real release.
Which version are you using?
Which version are you using?
Sure, what an implementor does, is his problem. I am fine with that.
But why doesn't Liferay itself do a better job with their own modules? Of course, it is hard. It is not trivial. I fully agree on that, no discussion here. But I believe, a lot of this stuff was never touched. Or only a change here or there. It's one of the reasons I opened the other thread a few days ago about designing "new" theme concept.
Any my question remains: Why does Liferay 7.2 classic them still load product-menu styles for nonauthenticated users? They are not necessary and not used. There is no product-menu for guest users.
Sure, optimizing it away will only yield a few kilobyte. But I am quite sure that further optimizations are possible and more stuff could be removed.
Btw.: Those javascript.barebone/javascript.everything properties are deprecated. While there was a ton of files in them for 7.0, for 7.1+ they are empty. The lists are now generated from the modules dynamically.
But why doesn't Liferay itself do a better job with their own modules? Of course, it is hard. It is not trivial. I fully agree on that, no discussion here. But I believe, a lot of this stuff was never touched. Or only a change here or there. It's one of the reasons I opened the other thread a few days ago about designing "new" theme concept.
Any my question remains: Why does Liferay 7.2 classic them still load product-menu styles for nonauthenticated users? They are not necessary and not used. There is no product-menu for guest users.
Sure, optimizing it away will only yield a few kilobyte. But I am quite sure that further optimizations are possible and more stuff could be removed.
Btw.: Those javascript.barebone/javascript.everything properties are deprecated. While there was a ton of files in them for 7.0, for 7.1+ they are empty. The lists are now generated from the modules dynamically.
David H Nebinger:
let's say the first page load does pull down 5.5 mb of data, but what is the measurement for the subsequent requests? I mean, does it drop down to 5k or something? 1.5m, that kind of implies that you have fairly large pages with a lot of portlets on them, possibly without enabling Senna, so it reflects more your own choices instead of a portal default of 1.5m per request...
That not cached content is really over 1 MB even on basic layouts without portlets. Most of this size (1 M

https://www.server.com/o/js_loader_modules?t=1563545944858
As the response I can decipher tons of module paths, not scripts or so. I suppose it is some helper file. Maybe it could be eliminated by some option.
I was able to track my issue to https://issues.liferay.com/browse/LPS-92810 which was fixed in 7.1.3 (I was testing on 7.1.2). I am migrating further to 7.2 so we will see if there are other improvements. This one sounds promising.
There's a much better improvement for 7.1, in fact. You can go to System Setttings, Infrastructure, Javascript Loader and turn on "Use loader 4.x" I believe it was called.
That will stop js_loader_modules from being loaded because it effectively moves all JS module resolution to the server side, so the client side loader does not need to know what modules are deployed any more.
There are some caveats though, like for example you won't be able to use Liferay.Loader.addModule() any more but I would say that unless you have a very exotic setup, going for loader 4.x will be the best.
In 7.2 you don't need to tweak anything as we are only allowing server side resolution.
That will stop js_loader_modules from being loaded because it effectively moves all JS module resolution to the server side, so the client side loader does not need to know what modules are deployed any more.
There are some caveats though, like for example you won't be able to use Liferay.Loader.addModule() any more but I would say that unless you have a very exotic setup, going for loader 4.x will be the best.
In 7.2 you don't need to tweak anything as we are only allowing server side resolution.
Jan Tošovský:
Most of this size (1 MB ) comes from this request with some timestamp so it is downloaded every time:
https://www.server.com/o/js_loader_modules?t=1563545944858
Well it is supposed to be cached. The "t=" parameter is used to bypass the cache after a deployment, otherwise the browser would not know an updated version was ready and a stale cache item would be used.
But the browser should absolutely still serve from the cache for every request where the t= value is the same across requests.
Any chance the portal-developer.properties is peeking in here? I once had a client complaining to me that Liferay advertises that it uses caching but it never caches anything for them. Second line in their portal-ext (in Prod) was include-and-overrid=portal-developer.properties

Here are my results when loading simple page. There are apparently some optimizations in version 7.2.
In the era of fast Internet connection these 7.2.0 values seem to be acceptable, but comparing this with 6.2 it is a clear regression.
Seeing the high number of requests it is apparent the performance could be boosted by switching to HTTP/2. In old HTTP 1.1 protocol those 350 kB are fragmented into lot of small chunks which prolong the page load significantly.
+---------+----------+------------+-------------------------------------+
| Version | Requests | First load | Next load (utilizing browser cache) |
+---------+----------+------------+-------------------------------------+
| 6.2.2 | 30 | 0.4 MB | 60 kB |
| 7.1.2 | 55 | 5.0 MB | 1.300 kB * |
| 7.2.0 | 55 | 3.8 MB | 350 kB |
+---------+----------+------------+-------------------------------------+
* High value caused by bug which prevented caching one 1 MB file (fixed in 7.1.3+)In the era of fast Internet connection these 7.2.0 values seem to be acceptable, but comparing this with 6.2 it is a clear regression.
Seeing the high number of requests it is apparent the performance could be boosted by switching to HTTP/2. In old HTTP 1.1 protocol those 350 kB are fragmented into lot of small chunks which prolong the page load significantly.
<p>Hey Jan, thanks for providing those numbers!</p>
<p>We're indeed actively trying to improve our performance here. We have several open lines of work to get rid of unnecessary and legacy dependencies so we can, at least, stop adding them by default. In 7.2, you can see for example that lodash is no longer loaded by default (it was in 7.1). We'll keep working on this until we reach a sensible default and we're already working on establishing performance budgets so we don't regress back with development over time.</p>
<p>As David said, needing to account for a more generic case, we will never really be able to provide better page load performance than a project where requirements are known and maybe more "relaxed". However, that's not stopping us and we hope to show great improvement throughout 7.2 lifecycle and before 7.3 releases.</p>
<p>We're indeed actively trying to improve our performance here. We have several open lines of work to get rid of unnecessary and legacy dependencies so we can, at least, stop adding them by default. In 7.2, you can see for example that lodash is no longer loaded by default (it was in 7.1). We'll keep working on this until we reach a sensible default and we're already working on establishing performance budgets so we don't regress back with development over time.</p>
<p>As David said, needing to account for a more generic case, we will never really be able to provide better page load performance than a project where requirements are known and maybe more "relaxed". However, that's not stopping us and we hope to show great improvement throughout 7.2 lifecycle and before 7.3 releases.</p>
In case there is a wishlist:
-) Add a "I use http/2" setting. While I think that http/2 is an absolute requirement with Liferay and it's 50 or so resources, it also changes the way the system should behave. Some companies have it, some don't ...
-) Get (at least) rid of the unnecessary combo parameters like browserId
-) With http/2 combo is probably unnecessary. Except for the minifying maybe.
-) Could you please add a parameter to the inline scripts and css so that they are ignored by the minifier?
-) Could you please add a portlet parameter that says: Trust me, I have minified my stuff, no need to use the minifier on my files
-) Why are there no cache headers with a long cache time? Since you have a cache buster with the t= parameter you could kill the etag and set a high cache time
-) async?
-) Could you use dynamic imports for your stuff? (We use it with Webpack 4 and it works pretty well)
-) Add a "I use http/2" setting. While I think that http/2 is an absolute requirement with Liferay and it's 50 or so resources, it also changes the way the system should behave. Some companies have it, some don't ...
-) Get (at least) rid of the unnecessary combo parameters like browserId
-) With http/2 combo is probably unnecessary. Except for the minifying maybe.
-) Could you please add a parameter to the inline scripts and css so that they are ignored by the minifier?
-) Could you please add a portlet parameter that says: Trust me, I have minified my stuff, no need to use the minifier on my files
-) Why are there no cache headers with a long cache time? Since you have a cache buster with the t= parameter you could kill the etag and set a high cache time
-) async?
-) Could you use dynamic imports for your stuff? (We use it with Webpack 4 and it works pretty well)
I think a lot of these are great suggestions. Have you created feature requests for any of these on issues.liferay .com (if you have, let me know so I can upvote the ones I would like to see).
The only one I am not sure is the last one. I feel like I recently saw a thread about dynamic imports on the Liferay js toolkit github repo --- maybe this is something that we already have access to? (using Liferay's tools I mean of course)
The only one I am not sure is the last one. I feel like I recently saw a thread about dynamic imports on the Liferay js toolkit github repo --- maybe this is something that we already have access to? (using Liferay's tools I mean of course)
No, I didn't create feature requests. I don't believe in them anymore(*).
Dynamic imports are a proposed browser feature that will probably become standard. But there are already build tools that support that and with them you can do something like this (even in Internet Explorer):
doStartCarousel() {
import("./Carousel").then(Carousel => Carousel.start(somediv));
}
When doStartCarousel is called, it uses import to load the Carousel javascript component from "somewhere" and executes it. It is not loaded before it is used. This is very nice with http/2, but it is unclear with http/1. It could be even worse from a performance perspective.
There are some tricky and compliated problems hidden here, so it is not trivial to add such a feature to Liferay. In any case, we already use this in combination with Webpack, BUT we are kinda in a special situation (we know, we have http/2, we know the versions of our required modules and more) and for Liferay the job is far harder since they need a more generic approach.
I am not sure, to what degree Liferay supports that already or plans to support it. Probably Ivan Zaera knows, I actually have no idea. But probably Liferay would need to handle the http/1 and 2 cases differently. (Or maybe not, IMHO since Liferay already loads about 50 files on a page, you need http/2 anyway).
(*) With the exception of having them discussed earlier, e.g. here or in chat or at devcon or ... Then, those feature requests are taken kindly.
Dynamic imports are a proposed browser feature that will probably become standard. But there are already build tools that support that and with them you can do something like this (even in Internet Explorer):
doStartCarousel() {
import("./Carousel").then(Carousel => Carousel.start(somediv));
}
When doStartCarousel is called, it uses import to load the Carousel javascript component from "somewhere" and executes it. It is not loaded before it is used. This is very nice with http/2, but it is unclear with http/1. It could be even worse from a performance perspective.
There are some tricky and compliated problems hidden here, so it is not trivial to add such a feature to Liferay. In any case, we already use this in combination with Webpack, BUT we are kinda in a special situation (we know, we have http/2, we know the versions of our required modules and more) and for Liferay the job is far harder since they need a more generic approach.
I am not sure, to what degree Liferay supports that already or plans to support it. Probably Ivan Zaera knows, I actually have no idea. But probably Liferay would need to handle the http/1 and 2 cases differently. (Or maybe not, IMHO since Liferay already loads about 50 files on a page, you need http/2 anyway).
(*) With the exception of having them discussed earlier, e.g. here or in chat or at devcon or ... Then, those feature requests are taken kindly.
Hey Christoph,
I understand. I have PR with literally one line of code commented out that I submitted in 2015 still waiting to be approved lol. I guess priorities vary from person to person and org to org ;)This is the thread that I was referring to. Not sure if it if similar to what you are doing with Webpack (though I don't think they are lazy loaded are you are suggesting). I think the thread and tool references that I have seen as of late have been more in reference to the updates Liferay has made to allow you to have multiple JS portlets on the same page that use different versions of the same libraries. Check out the last comment (by Ivan) on this thread -- https://github.com/liferay/liferay-js-toolkit/issues/359
I understand. I have PR with literally one line of code commented out that I submitted in 2015 still waiting to be approved lol. I guess priorities vary from person to person and org to org ;)This is the thread that I was referring to. Not sure if it if similar to what you are doing with Webpack (though I don't think they are lazy loaded are you are suggesting). I think the thread and tool references that I have seen as of late have been more in reference to the updates Liferay has made to allow you to have multiple JS portlets on the same page that use different versions of the same libraries. Check out the last comment (by Ivan) on this thread -- https://github.com/liferay/liferay-js-toolkit/issues/359
Hi Cristoph.
There was an old issue hanging around for dynamic imports but I closed it a few days ago because it already seems to have a solution -> https://github.com/liferay/liferay-js-toolkit/issues/17
Because our loader is AMD compliant, we already do async loading, so it just seems a matter of syntax:
import(x).then(callback)
is equivalent to:
Liferay.Loader.require(x, callback)
AFAIK.
Feel free to reopen the issue and add some comments if you think we need to do something else.
Cheers,
Ivan
There was an old issue hanging around for dynamic imports but I closed it a few days ago because it already seems to have a solution -> https://github.com/liferay/liferay-js-toolkit/issues/17
Because our loader is AMD compliant, we already do async loading, so it just seems a matter of syntax:
import(x).then(callback)
is equivalent to:
Liferay.Loader.require(x, callback)
AFAIK.
Feel free to reopen the issue and add some comments if you think we need to do something else.
Cheers,
Ivan
Thanks for the info. That's very good to know.
I actually never looked into that stuff too deeply because we are into the lucky situation to be able to use Webpack. We had that working even before your new AMD loader came out. I know, it isn't a general situation, we have different constraints, but it works so far.
But it is quite possible that in future projects we won't be that lucky and it is nice to know that it can be done with the AMD loader too.
I actually never looked into that stuff too deeply because we are into the lucky situation to be able to use Webpack. We had that working even before your new AMD loader came out. I know, it isn't a general situation, we have different constraints, but it works so far.
But it is quite possible that in future projects we won't be that lucky and it is nice to know that it can be done with the AMD loader too.
Sometimes the best part of the age we live in is that there are many ways to do something. Sometimes the worst part is that there are many ways to do something lol. I think I remember talking with you at DevCON last year and from what I recall, you guys have been doing this long enough now that I am sure what you have pre-dates "being able to do it" in Liferay anyway. As you said, good to know that moving forward you have options that are a little closer to Liferay as a product. I suppose you could also make arguments about portability or being too tightly bound to Liferay but, personally, I don't put a lot of stock by those statements. My counter argument has always been that sticking closer to the product not only maximizes your return on investment but also makes upgrade paths easier. In this case though, I think being spec compliant, I would imagine a lot of it could be moved/reused with different tools (like Webpack). I'd be curious to hear your thoughts on Liferay's version, once you have the opportunity to use it, as it compares against tools like Webpack.
While the option is there, we probably won't pursue it.
The main problem is that our frontend developers are used to Webpack, we use it with Angular, React, Vue; the C#, Java, SAP, ... teams use it, well people are used to that infrastructure.
Till there is no absolute compelling reason to change something, we will stay with Webpack.
But that's our story here. For others, who don't have invested that much, don't have our infrastructure and know how it might be different.
In any case: I hope Liferay itself profits from the new options and fixes/changes.
The main problem is that our frontend developers are used to Webpack, we use it with Angular, React, Vue; the C#, Java, SAP, ... teams use it, well people are used to that infrastructure.
Till there is no absolute compelling reason to change something, we will stay with Webpack.
But that's our story here. For others, who don't have invested that much, don't have our infrastructure and know how it might be different.
In any case: I hope Liferay itself profits from the new options and fixes/changes.
Hey, Christoph, would you mind blogging about how you're using Webpack for frontend and backend portal development?
I don't know who else might be interested in it, but I'd like to see how you pull it all together...
I don't know who else might be interested in it, but I'd like to see how you pull it all together...
Yes, I can do that. I actually have a bit of spare time in the next two weeks.
Btw.: I just noticed that we have the CKEditor again.
Btw.: I just noticed that we have the CKEditor again.

Yes, unfortunately.
I'm using chrome & opera, so I get weird cursor position jumps while writing replies, especially if I hit the delete key. It will often jump to the beginning of the line and I end up deleting chars from the back of the previous line before I see what is going on.
Not that having to hit return 3 times between each line w/ the old editor was much better, but that was at least something you could get used to.
I'm using chrome & opera, so I get weird cursor position jumps while writing replies, especially if I hit the delete key. It will often jump to the beginning of the line and I end up deleting chars from the back of the previous line before I see what is going on.
Not that having to hit return 3 times between each line w/ the old editor was much better, but that was at least something you could get used to.
Phew! I am having the same experience and wasn't sure if I was fat fingering some key combination or something. For the old editor I always just swtiched it into "Advanced Reply" and that seems to handle the paragraph breaks correctly for me. Any clue how to get around the jumping cursor? orther than not making typos (totally not even a reasonable expectation for me
)

I am using Firefox and it seems to work quite well for me.
But I only have written these two posts since CKEditor was enabled, so I can't really say if I am just lucky or if it is just fine in Firefox.
But I only have written these two posts since CKEditor was enabled, so I can't really say if I am just lucky or if it is just fine in Firefox.
I'm wondering if the version of ckeditor we're using is a little old...
I've had this happen on the community site every time they switch to ckeditor.
I've had this happen on the community site every time they switch to ckeditor.
Christoph Rabel:
Yes, I can do that. I actually have a bit of spare time in the next two weeks.
Btw.: I just noticed that we have the CKEditor again.
That's great :-). Can you notify me when if you finally do it? I don't know where you usually write posts...
Thx a lot.
Sure. I actually hope that Andrew, David and maybe you could take a look at it before I will publish it.
I will blog it here on liferay.dev (if that's possible)
I will blog it here on liferay.dev (if that's possible)
I'd be happy to review in advance, Christoph.
You should have perms to blog here on liferay.dev, if not, hit me up via slack or something and I'll make sure you get squared away.
You should have perms to blog here on liferay.dev, if not, hit me up via slack or something and I'll make sure you get squared away.
Andrew -> 2 blog posts
David -> 4,532,352 blog posts
.. I think the best choice for editor is pretty obvious ;)
David -> 4,532,352 blog posts
.. I think the best choice for editor is pretty obvious ;)
Hey Chema,Quick question for you -- just in case I ever find myself in this conversation with a client that is migrating from 6.2 -> 7.x. Is it fair to say, based on the number posted above, that the additional load is the result of more JS, and there is more JS because you have a combination of market demand for richer UIs in conjunction with AUI (not yet fully retired) being in place along with all the tools and such to support modern JS stuff? I am asking for the clarification so that, if I do get asked, I have the correct (and accurate) answer to provide.
Copyright © 2025 Liferay, Inc
• Privacy Policy
Powered by Liferay™