# 1. Make sure you've a somewhat new Node version
# 2. clone this repo
# 3. cd into monator-liferay-react-hello-world/react
npm install
Build webpack and then the portlet itself to generate a .war file
# cd into monator-liferay-react-hello-world/react
npm run build
# war file will be in monator-liferay-react-hello-world/portlet/target
In Dev mode, Hot Module Replacement is active, when you update the source file the changes are instantaneously shown in the web browser.
npm start
# open web browser to localhost:3000
When building, the directory portlet/src/main/webapp/static is cleaned from all files named bundle.* and the subdirectory static is completely cleaned.
The artifactId (specified in the pom.xml) is used as a namespace for the React component. Therefor, when you change it, you also need to change the view which is rendering the component (src/main/webapp/html/view.jsp)
The artifactId is also used by Liferay asthe base URL for any files in the portlet. E.g: If you add an image to the project, it will be available at server.com/my-artifact-id/static/gen.c9a5ddd9d2.jpg
Webpack reads the pom.xml and takes care of adding "/{artifactId}/static/" to all URLs automagically.
- To change the artifactId name (is
monator-liferay-react-hello-world-portlet):pom.xmlchange<artifactId>src/main/webapp/html/view.jspchange in... window.reactComponents['monator-liferay-react-hello-world-portlet'].reactComponent ...
The friendly-url-mapping is used to create URLs. As React is in charge of creating URLs we need to create something that Liferay understands.
Looking at an url such as this:
http://example.com/en_US/web/guest/react-example-page/-/hello-world/12345
The http://example.com/en_US/web/guest/react-example-page part is the URL to the actual page with the portlet on it. The /-/hello-world/12345 says that portlet with friendly-url-mapping hello-world should be given the parameter 12345.
Therefor we need to pass on the friendly-url-mapping to React. This is done automagically. Webpack reads <friendly-url-mapping> from portlet/src/main/webapp/WEB-INF/liferay-portlet.xml where you can change it.
Nothing special at all, any portlet developer already know this.
-
Change portlet class (is
ReactHelloWorld)src/main/java/com/monator/react/ReactHelloWorld.javachange the file name itselfsrc/main/java/com/monator/react/ReactHelloWorld.javachangepublic classsrc/main/webapp/WEB-INF/portlet.xmlchangeportlet-class
-
Change the namespace:
- Create folder(s) and move
src/main/java/com/monator/react/ReactHelloWorld.javato the desired namespace src/main/webapp/WEB-INF/portlet.xmlchange<portlet-class>src/main/java/com/monator/react/ReactHelloWorld.javachangepackage com.monator.react
- Create folder(s) and move
-
Change the portlet name (is
monator-liferay-react-hello-world):src/main/webapp/WEB-INF/portlet.xmlchange<portlet-name>.src/main/webapp/WEB-INF/liferay-portlet.xmlchange<portlet-name>and<css-class-wrapper>src/main/webapp/WEB-INF/liferay-display.xmlchange<portlet id="monator-liferay-react-hello-world" />
-
Change the portlet display name (is
Monator Liferay React Hello World):src/main/webapp/WEB-INF/portlet.xmlchange<display-name>,<title>, and<short-title>
-
Change the portlet category (is
Monator):src/main/webapp/WEB-INF/liferay-display.xmlchange<category name="Monator">
-
Change the project name (is
Monator Liferay React Hello World Portlet)pom.xmlchange<name>
-
Change the project groupId (is
com.monator.react)pom.xmlchange<groupId>
-
Change liferay-plugin-package.properties (is
react-hello-world)src/main/webapp/WEB-INF/liferay-plugin-package.propertieschangename(and whatever else you want).
This project is using version 3.0.0-beta.2 of react-hot-loader to enable hot loading of stateless components (read more on GitHub).
Currently, when using React router and hot reload it will log an error in the developer console (only in dev mode of course). There's an open issue on this. However, you can just disregard the error. Or even filter it away if you're running Chrome. Just add:
^((?!You cannot change <Router (routes|history)>).)+$
to the console log filter:
