Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

React Support for client side #6044

Closed
69 of 77 tasks
deepu105 opened this issue Jul 6, 2017 · 114 comments
Closed
69 of 77 tasks

React Support for client side #6044

deepu105 opened this issue Jul 6, 2017 · 114 comments

Comments

@deepu105
Copy link
Member

deepu105 commented Jul 6, 2017

This is the central ticket for our React support.
This will be an evolving ticket, I'll create a Project once we have identified TODO items clearly
Any TODO must be added/modified to this opening comment.

The below is the Framework choices made so far:

  • React written in Typescript
  • Redux + react-redux + Axios + Promise middleware + redux-thunk
  • React router v4
  • Bootstrap 4 + Reactstrap
  • Tslint + tslint-eslint + tslint-react
  • Lodash
  • Karma + Mocha + Chai + Enzyme for unit tests
  • Sass support
  • i18n custom with react-jhipster lib
  • Webpack set up close to our Angular setup

The below are the initial list of TODO:

  • Merge the generator-jhipster-react library into a new branch in the generator-jhipster repo (@deepu105)
  • Migrate to bootstrap from material UI (@sendilkumarn @deepu105)
  • Migrate to Typescript from ES6 + babel (@sendilkumarn @deepu105)
  • Find a solution for i18n so that our current files can be reused. If cannot find a lib write a plugin using counterpart adapting ngx-translate(@deepu105)
  • Add sample unit tests
  • Migrate entity sub generator
  • Implement a transform stream to strip i18n related stuff when its disabled
  • Cleanup structure and finish almost done pages if any (@deepu105)
  • add more travis builds for React(no i18n, sass, ws, Search, Oauth)
  • Add options to tempate for Auth, Sass, i18n etc
  • Migrate remaining account module pages
  • Supress React options for UAA
  • move reducers to feature folders
  • use import alias and align with new entity folder structure

Modules

  • Account: activate
  • Account: password
  • Account: register
  • Account: reset
  • Account: sessions
  • Account: settings
  • Admin: audits
  • Admin: configuration
  • Admin: docs
  • Admin: health
  • Admin: logs
  • Admin: metrics
  • Admin: tracker
  • Admin: gateway
  • Admin: user-management
  • Blocks: config
  • Blocks: handlers
  • Blocks: interceptors
  • Shared: alert
  • Shared: auth
  • Shared: form
  • Shared: language
  • Shared: login
  • Shared: profiles
  • Shared: util
  • shared:all
  • Home
  • Layouts:error
  • Layouts:navbar

Issues/Bugs

Test cases

Application

  • Default options with i18n
  • Default options without i18n
  • Default options with i18n prod profile
  • Default options without i18n prod profile
  • Default options regenerate existing app
  • Default options with SASS
  • Default options with --skip-user-management flag
  • Default options with --jhi-prefix flag
  • Default options with --skip-server flag
  • Default options with i18n for Gateway
  • Default options without i18n for Gateway
  • Default options with Protractor
  • Gradle build Default with i18n
  • Gradle build Default with i18n prod profile
  • With Search engine
  • With websocket
  • Session Auth
  • Oauth2 Auth
  • add new languages to app

Entity

  • With no pagination
  • With pagination
  • With Infinite scroll
  • With blob
  • With Image
  • With Text
  • Different field types
  • Different relationship types
  • Import from JDL

cc @jhipster/developers

@atomfrede
Copy link
Member

We are currently using React and Vue.js and are exploring an approach to write custom components once with preact and then use a thin wrapper to use the component both in react (or just use the preact version) and in vue. Maybe we should also think about something similar to make it possible to use another frontend if required (or for a module that provides vue instead of react).

@deepu105
Copy link
Member Author

deepu105 commented Jul 6, 2017

In my personal experience using 2 frameworks whuch does same job only adds complexity and makes maintenance harder and implementation flaky. I would rather stick 2 just one framework. Evn using angular 1 and 2 together needed a lot of duct tape. So I would recommend to keep Vue out of question for now.

From point of Jhipster, what would be more beneficial would be to find a way to add alternative options simpler

@atomfrede
Copy link
Member

Absolutely! Supporting two frameworks in core generator is hell. When we find a way to write components (e.g. table component) once (in preact) and can use that component in different ui frameworks with little overhead (preact is 3kb) this would at least help to be able to add additional options (either in the main generator or as a module) as we would not need to rewrite everything in the new fraemwork, but agree, lets focus on react first.

@deepu105
Copy link
Member Author

deepu105 commented Jul 7, 2017

@sendilkumarn I see that you assigned items 2 & 3 to yourself, I have already done this on my company project which is based on JHipster-react so I'll do the base changes and then you can work on top of that.

@sendilkumarn
Copy link
Member

Okay 👍

@erikkemperman
Copy link
Member

erikkemperman commented Jul 18, 2017

Just wondering -- from the current package.json in this branch it seems this would be adopting FaceBook's react implementation, is that right? Have you guys considered the legal implications, given the controversial BSD+PATENTS attached to it? I am not a lawyer, but there's quite a bit of unease around their license. See, e.g.,
https://news.ycombinator.com/item?id=14779881
https://react-etc.net/entry/apache-foundation-bans-use-of-facebook-bsd-patents-licensed-libraries-like-react-js
Maybe it would be better to look at alternative implementations?

EDIT: Maybe keep an eye on this -- FB are aware that this is scaring a lot of folks: facebook/react#10191

@deepu105
Copy link
Member Author

deepu105 commented Jul 18, 2017

@erikkemperman I'm aware of it. Technically we are not an Apache Foundation project and hence this doesn't affect us. I do understand the BDS + Patents license is slightly less permissive than APL2 (I'm not a lawyer) But in any case this shouldn't worry us, in the rarest ever possibility that someone encounters a legal issue becoz of the React licence, Never happened so far, it would be very very easy to switch to something like Preact or Inferno (which are 100% API compatible) which are MIT licenced. SO let's not worry much about this now. Also once React support is added it's too easy to add an option to choose between React or Preact so for me this is not an issue at all.

@erikkemperman
Copy link
Member

@deepu105 Thanks for the quick response Deepu!

Yes, I know JH is not an ASF project, I was just curious if their reasoning would apply here as well. Apparently the fear is, roughly, that using React in your projects might allow FaceBook to co-opt all of your patents, related or not, because you give up the right to sue them for infringement.

It's probably not actually that bad, but still... ASF doesn't drop this bombshell lightly I imagine.

I just wanted to make sure this concern is on the radar, that is all.

@jdubois
Copy link
Member

jdubois commented Jul 18, 2017

@erikkemperman yes of course, in fact I tweeted about the legal implication about 1 year ago, and since then I'm regularly attacked by React developers in France.

For me we have no issue at all here, but this needs a long explanation.

First let me detail the issue with React:

  • There are legal implications for people using React. Let's take the original example I used one year ago: you develop a software for a client, using React. That client gets bought by another company. That other company sues Facebook - and hence loses the right to use your software.
  • There are a lot of attacks/trolls/insults from the React community, and also a FAQ that tells there is no problem whatsoever. Just read my example above, it has been correct from the start, and it is still correct. Now I don't care being insulted by people with no legal background.
  • As it is often replied: that company suing Facebook is "bad". Yes, I agree, and that's why I did this specific example. It's not the software developer's role to tell that the company that is buying his client is bad, and "punish" them. Who do you think you are, Batman?
  • The whole point of OSS is about the license, and not strictly following the license is wrong from my point of view. Younger people probably don't know about this, but this kind of use case already happened in the past, for example there was one person who did a GPL project, and added a clause to forbid the South African police to use it. Same thing as my previous point: we're here for making software, we're not Batman.

Now let me detail the issues we have with the use of React in JHipster:

  • We're not directly using React: we generate an application that uses React. And anyway, we're not even a company, so I wonder which kind of issue we could have (and I'm not planning to sue Facebook, anyway). I think that on our side, we are safe. And in case of trouble, we'll just drop the React option, or put it inside a module. So no problem at all for the project itself.
  • There is indeed something that worries me: this means JHipster could not become an ASF project one day. This question arises from time to time, at the moment we have no plans of doing this - basically this is because they rise a lot of legal issues and paperwork, and nobody is ready to do that (I just don't have that much free time).
  • The real issue is for our users: but it's like any JHipster-generated project, that project is the user's project, and that's his own issue. Maybe he thinks that's fine for him, maybe his legal team says it's fine - anyway that's his project and he does whatever he wants with it. We already support Oracle and MS SQL Server, which are totally proprietary technologies - honestly the React clause is a total non-issue for us, at this point.

@erikkemperman
Copy link
Member

I was just thinking of the users, actually -- myself included :-) Thanks for detailed response, good to hear you guys have thought about this.

@deepu105
Copy link
Member Author

@jdubois we are anyway safe even for your last 3 points, If we encounter issue or if we go ASF we will just switch React with Preact which has MIT license but works the same way as React and works with all other libs, so the only code change would be to change the imports technically (It can be done by find replace) look at this for example ui-router/visualizer@f07f09c

@sendilkumarn
Copy link
Member

Instead of switching to preact, why can't we start with preact 😜

@jdubois really detailed and well laid out response 👍 Thanks 😄

@survivant
Copy link

Hello, little question. Why not use Material-ui ? I was planning to use it for Desktop application, and switch to material-ui-native for mobile (when possible). Could it be possible to have the choice in the command line ?

@sendilkumarn
Copy link
Member

@survivant we want to align more towards our current JHipster Angular UI which is based on Bootstrap.
Adding a choice to choose between material UI and bootstrap will make the project more cumbersome. So definitely no for now. May be you can add in a module for that.

@survivant
Copy link

@sendilkumarn make sense, I'll have to check how to create a module. Could be more complete that way, if I want to generate code for web and native applications.

@deepu105
Copy link
Member Author

@sendilkumarn React is more popular and has more reach so lets start with it first, we will see about issue if we ever encounter one

@survivant
Copy link

survivant commented Jul 18, 2017

@deepu105 I'll like to play around with this branch. How can I generate app with the code in the branch ? I try to follow the documentation on : https://github.com/hipster-labs/generator-jhipster-react

but I obtain this error message

$ yo jhipster-react
Error jhipster-react

You don't seem to have a generator with the name “jhipster-react” installed.
But help is on the way:

You can see available generators via npm search yeoman-generator or via http://yeoman.io/generators/.
Install them with npm install generator-jhipster-react.

To see all your installed generators run yo without any arguments. Adding the --help option will also show subgenerators.

If yo cannot find the generator, run yo doctor to troubleshoot your system.

I'm not too familiar with npm

thanks, I hope to be able to help to test

@gmarziou
Copy link
Contributor

gmarziou commented Jul 19, 2017

@survivant, these instructions are obsolete as react support is no longer a module but a sub generator of main generator.
Now you can follow https://github.com/jhipster/generator-jhipster/blob/jh-react/CONTRIBUTING.md#setup.

So it should be:

git clone https://github.com/jhipster/generator-jhipster
cd  generator-jhipster
git checkout jh-react
yarn install
yarn link

And to use in an app:

mkdir my_react_app
cd my_react_app
yarn link generator-jhipster
yo jhipster

@survivant
Copy link

survivant commented Jul 19, 2017

@gmarziou thanks. I'll start from there.

If I found issues, should I start to flag them ?

for now, it's not working. here the output
`C:\Data\workspace_perso\github-forks\jhipster-react-branch>yo jhipster

Welcome to the JHipster Generator v4.6.0
Documentation for creating an application: https://jhipster.github.io/creating-a
n-app/
Application files will be generated in folder: C:\Data\workspace_perso\github-fo
rks\jhipster-react-branch
WARNING! Failed to connect to "git://github.com"
1. Check your Internet connection.
2. If you are using an HTTP proxy, try this command: git co
nfig --global url."https://".insteadOf git://


JHipster update available: 4.6.2 (current: 4.6.0)

Run yarn global upgrade generator-jhipster to update.


? (1/16) Which type of application would you like to create? Monolithic appli
cation (recommended for simple projects)
? (2/16) What is the base name of your application? jhipster
? (3/16) What is your default Java package name? com.mycompany.myapp
? (4/16) Do you want to use the JHipster Registry to configure, monitor and sca
le your application? No
? (5/16) Which type of authentication would you like to use? JWT authenticati
on (stateless, with a token)
? (6/16) Which type of database would you like to use? SQL (H2, MySQL, MariaD
B, PostgreSQL, Oracle, MSSQL)
? (7/16) Which production database would you like to use? MySQL
? (8/16) Which development database would you like to use? H2 with disk-based
persistence
? (9/16) Do you want to use Hibernate 2nd level cache? No
? (10/16) Would you like to use Maven or Gradle for building the backend? Maven

? (11/16) Which other technologies would you like to use? Social login (Google,
Facebook, Twitter)
? (12/16) Which Framework would you like to use for the client? [BETA] React
? (13/16) Would you like to use the LibSass stylesheet preprocessor for your CS
S? Yes
? (14/16) Would you like to enable internationalization support? Yes
? Please choose the native language of the application English
? Please choose additional languages to install French
? (15/16) Besides JUnit and Karma, which testing frameworks would you like to u
se?
? (16/16) Would you like to install other generators from the JHipster Marketpl
ace? No

Installing languages: en, fr
events.js:160
throw er; // Unhandled 'error' event
^

TypeError: _this[method] is not a function
at blockTemplate.templates.forEach (C:\Data\workspace_perso\github-forks\gen
erator-jhipster\generators\generator-base.js:1933:42)
at Array.forEach (native)
at constructor.writeFilesToDisk (C:\Data\workspace_perso\github-forks\genera
tor-jhipster\generators\generator-base.js:1910:45)
at constructor.writeFiles (C:\Data\workspace_perso\github-forks\generator-jh
ipster\generators\client\files-react.js:409:10)
at constructor.writing (C:\Data\workspace_perso\github-forks\generator-jhips
ter\generators\client\index.js:366:36)
at Object. (C:\Data\workspace_perso\github-forks\generator-jhipst
er\node_modules\yeoman-generator\lib\index.js:417:23)
at C:\Data\workspace_perso\github-forks\generator-jhipster\node_modules\run-
async\index.js:25:25
at C:\Data\workspace_perso\github-forks\generator-jhipster\node_modules\run-
async\index.js:24:19
at C:\Data\workspace_perso\github-forks\generator-jhipster\node_modules\yeom
an-generator\lib\index.js:418:9
at runCallback (timers.js:672:20)

C:\Data\workspace_perso\github-forks\jhipster-react-branch>

@gmarziou
Copy link
Contributor

gmarziou commented Jul 19, 2017

I got same error when I tried this morning with 2 languages too.
Maybe try without i18n first.

@deepu105
Copy link
Member Author

Yes i18n might not work, anyways I'm planning to rewrite to typescript and use bootstrap over the weekend, so next week I hope it can make some basic apps

@andidev
Copy link
Member

andidev commented Jul 19, 2017

I would suggest using redux saga with react redux instead of the Promise Middleware. Seems like a more cleaner approach. I'm no expert on react though.

@deepu105
Copy link
Member Author

I have looked at Saga and its an overkill for crud operations. Its useful if you have really complex side effects to manage. Also redux advices to start simple with promise and thunk and use saga or observable only when you have complex scenarios. Also you can always use multiple libs with redux on same app as all are middlewares. So you could use promise + thunk for simple use cases and when you have complex ones you could use saga or observable

@sendilkumarn
Copy link
Member

@deepu105 let me know once you have committed the code 👍 This is gonna be react-ful week 😝

@sdoxsee
Copy link
Contributor

sdoxsee commented Jul 21, 2017

I'm brand new to react but have been playing with it this week and discovered create-react-app that, as I'm sure most of you are already familiar with, hides details (webpack, babel, etc) in a react-scripts dependency that is managed and updated. Feels like a spring boot dependency bom. I suppose with typescript we'd already have to "eject" but I do quite like delegating the auto updating of react app dependencies to the maintainers of this >30000 star project. If typescript isn't set in stone, it would be awesome if we could leverage the tool without ejecting. Do you think that would be possible or desirable? Again...I'm new...which is why I don't want to configure with tools that keep shifting....grunt, gulp, webpack... :) The convention sounds really attractive.

Refs:
- https://medium.com/@tuchk4/why-i-love-create-react-app-e63b1be689a3
- https://github.com/facebookincubator/create-react-app
- https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md

Update:
As for typescript, there's this fork https://github.com/wmonk/create-react-app-typescript that also seems to have the backing of Microsoft? https://github.com/Microsoft/TypeScript-React-Starter

@deepu105
Copy link
Member Author

deepu105 commented Jul 21, 2017 via email

@hsellik
Copy link

hsellik commented Mar 30, 2018

Using Jhipster 4.14.1 with --experimental for React.

How to implement the social login buttons? The "tip" I found on jHipster doc is for angular. Could not find any information for React.

@deepu105
Copy link
Member Author

deepu105 commented Mar 30, 2018 via email

@tianlinzx
Copy link

@gmarziou BTW, when will JHipster5-Beta be released ?

@gmarziou
Copy link
Contributor

gmarziou commented Mar 31, 2018

Easy one: when it's ready 😉 In April probably

@deepu105
Copy link
Member Author

deepu105 commented Apr 1, 2018

@jhipster/developers the React client should be much more stable and feature complete now, please test and report any issue found here

@pascalgrimaud
Copy link
Member

Here some React builds: https://travis-ci.org/hipster-labs/jhipster-travis-build/builds/359716846
There are some configurations which didn't work yet.

@deepu105
Copy link
Member Author

deepu105 commented Apr 1, 2018

#7392 should fix many of the issues

@deepu105
Copy link
Member Author

@agaspardcilia @chrisdns can you guys check the issue/bug items that are not ticked yet? Also can you guys test the combinations mentioned in the original comment and update any issues found?

@deepu105
Copy link
Member Author

Also we need to add some protractor tests. The skeleton files are already there, it needs some cleanup and fixes. Also needs template for entity. We can reuse them from Angular with some slight modifications

@agaspardcilia
Copy link
Member

@deepu105, @chrisdns did almost every Protractor tests, he called in sick today so it should be PRd tomorrow.

@jdubois
Copy link
Member

jdubois commented Apr 10, 2018

Awesome! BTW we'll all need to meet next week at Devoxx :-)

@deepu105
Copy link
Member Author

deepu105 commented Apr 10, 2018 via email

@vishal423
Copy link
Contributor

I was looking at admin module codebase to see how react and redux are integrated, and noted that we don't fully leverage cache/store. I am not sure if this already got discussed and reasoning to make n/w calls instead of lookup from redux store (which already have same data).

@deepu105
Copy link
Member Author

@vishal423 nope there was no discussions. we cant always read only from Redux as the data might be outdated due to changes in the backend by other people. I did want to normalize the store data model so that getAll and get fetches data from the same place

@deepu105
Copy link
Member Author

@vishal423 i'm happy to discuss it now if you want :)

@agaspardcilia
Copy link
Member

agaspardcilia commented Apr 11, 2018

@deepu105 I tried to see what was done or not here is the result:

Modules

  • Blocks: config
  • Blocks: hanlders
  • Shared: util

I honestly have no idea what you meant with these, so I guess it's more an Angular direct conversion.

  • Shared: profiles
    A PR has been submitted about that.
  • Layouts:error
    The current notification middleware is handleling X-<appname>-error headers. There's still some error alert duplication ie: login error. We could just use X-<appname>-error most of the time to notify stuff but it would mean that we need to change some things in the back-end which could creates problems with Angular. So I guess we need to remove every regular Alerts and make Toaster mandatory when it comes to notifications.

Issues/Bugs

  • Error handling when authentication fails
    Same as Layouts:error.
  • Pagination component tries to paginate when there is no next page (needs unit tests in lib as well)
    Fixed
  • Entity dialog page creates lot of methods to handle relations, try to remove and simplify those
    Not done.

Test cases

Application
  • Default options with i18n
  • Default options without i18n
  • Default options with i18n prod profile
    Works but the administration menu shouldn't contains Database and API Docs.
  • Default options without i18n prod profile
    Same issue with the administration menu.
  • Default options regenerate existing app
  • Default options with SASS
  • Default options with --skip-user-management flag
  • Default options with --jhi-prefix flag
    Works but I'm not sure to know what it's suppose to do though
  • Default options with --skip-server flag
    Some TS errors with login not being exported from authentication but it's prolly normal since there's no server after all.
  • Default options with i18n for Gateway
  • Default options without i18n for Gateway
    Some TS errors.
  • Default options with Protractor
    Implementation in progress.
  • Gradle build Default with i18n
  • Gradle build Default with i18n prod profile
  • With Search engine
  • With websocket
  • Session Auth
  • Oauth2 Auth
    Some TS errors in tests, it has been broke recently by my last reducer test PR.
  • add new languages to app
    i18n files are added but nothing else is updated. Probably has something to do with needles.

Every configuration described above has been tested without entity (except Elastic search).

Entity

I believe everything is working concerning entities.

@vishal423
Copy link
Contributor

@deepu105 , stale data is always an issue with cache. Caching would also be tricky with server side pagination that goes over records not in cache. I can see following options:

  1. Let user do explicit refresh (F5), in which case store needs to be re-populated.
  2. Provide explicit refresh button on list page along with last sync time. User can explicitly refresh if interested.
  3. Implicitly invalidate cached data after configurable duration (say 5 mins) so that next call goes to server instead served from cache.
  • Pagination/sort/search queries still needs to go to server to ensure they are across all records.
  • Exception should invalidate cache to ensure latest data is fetched from server.

If we think stale data would be major issue, then, I agree to limit to view(id)/update/delete operation at moment as list page should fetch latest data.

@deepu105
Copy link
Member Author

@vishal423 yes there are many ways to workaround, but they all have issues which are not acceptable for user experience and data integrity.
If you fetch stale data for write operation you will end up overwriting any new data on the server which is not acceptable, so IMO it's not worth the trouble as the majority of the use cases would want the latest data all the time. If someone has a system which rarely writes data then this can help them and in that case, I would say they need to implement this themselves

@vishal423
Copy link
Contributor

vishal423 commented Apr 11, 2018

@deepu105, I still feel we could at least do this for view, update and delete operations as the requested user data would already be in cache (fetched during list page rendering). To further safeguard against stale data, we could store last synced timestamp in store and if that's greater than configurable limit, fetch from server, otherwise, serve from cache. If end users are interested in no stale data, then, this allowed limit can be changed to zero and that should ensure sync from server. Those who like to leverage cache for better performance can tune this configuration appropriately.

@deepu105
Copy link
Member Author

@vishal423 unfortunately, I don't agree. Its really important to fetch latest data before an update operation. In a real world app with multiple users this will be a huge issue and IMO client side caching is a bad practice for CRUD applications. We already have server side caching and if you really need this its easy to add an Axios middleware to cache the requests. Client side caching will only work for PWA apps which are intended to be offline and for apps which has very less update operations. I would suggest you add this as a Tip so that those who are interested can make use of it.

@pascalgrimaud
Copy link
Member

Still one failed build left: react with OAuth2
https://travis-ci.org/hipster-labs/jhipster-travis-build/jobs/368013327

Hope we can fix it before the next release

@mraible
Copy link
Contributor

mraible commented Apr 19, 2018

Here's the error from above:

ERROR in /home/travis/app/src/main/webapp/app/entities/test-root/bank-account-my-suffix/bank-account-my-suffix-update.tsx
(11,26): Cannot find module 'app/modules/administration/user-management/user-management.reducer'.

I'm looking into it now.

@chrisdns
Copy link
Member

chrisdns commented Apr 19, 2018

@mraible @pascalgrimaud I have fixed this issue I am about to PR it soon.
PR: #7506

@jdubois
Copy link
Member

jdubois commented Apr 30, 2018

For me this is all done, at least the development stream is done and if there are some bugs or missing features they should be some specific tickets, as otherwise it's impossible to follow here.
@deepu105 are you OK to close this?

@deepu105
Copy link
Member Author

deepu105 commented May 1, 2018

I'll close this after checking some stuff

@jdubois
Copy link
Member

jdubois commented May 18, 2018

@agaspardcilia @chrisdns could you check the boxes that have been completed here? I'd like to have this closed, as support is now merged - then we could do smaller tickets, one per missing feature

@deepu105
Copy link
Member Author

I'm closing this even though some of the checkboxes are not checked. The reason is as below

  1. Most major features are done and works
  2. The small items missed can be fixed as and when someone reports it(means when need arises)
  3. There will be improvements here always anyway

@jdubois jdubois added this to the 5.0.0-beta.2 milestone Jun 11, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment