How to integrate a react application in drupal 8, using drupal custom module?

穿精又带淫゛_ 提交于 2020-01-04 07:04:38

问题


I am very new to react and drupal 8. I know to create custom modules in drupal and react SPAs, but I m not able to call my react app using a drupal8 controller . Can someone please make me clear of the flow and the correct way to integrate react app in drupal 8?


回答1:


So there isn't really a good means of calling a React application from within the regular Drupal controller layer or in the twig templates of Drupal 8.

There are two ways people usually connect a React Application to D8.

Option 1 - Progressively decoupled sites - This is where Drupal still uses the TWIG engine to generate the vast majority of the site views, and can use React for some small part of the site while communicating with Drupal through a Drupal based webservice. Check out this project for more information - https://www.drupal.org/project/pdb. This is a nice option if you just want to add a small React based widget, but want to keep the bulk of your site in using standard TWIG.

Option 2 - Fully decouples sites - This is where you render 100% of your applications view layer using React, and just use Drupal as a CMS that provides a web service. There are multiple options for the webservice portion including https://www.drupal.org/project/graphql and https://www.drupal.org/docs/8/api/restful-web-services-api/restful-web-services-api-overview. So an example of this would be serving a create-react-app on a static server and communication with D8 through a web service.

Here is some additional information that might help guide your decision. https://dri.es/how-to-decouple-drupal-in-2018

Best of luck!




回答2:


Long post with some assumptions(but it works): I was seeking to achieve the same (Drupal 8 and react decoupled block), and I searched and searched, I found myself returning to this page more than once, so I will leave the little thing I discovered here. My Assumptions:

  • you have created a custom block that has it's own twig template.
  • you have defined your libraries in your libraries file (we will review this)
  • you have created your react app in the root folder of your module with npx create-react-app my-app.

create-react-app my-app creates a react app inside my-app folder, my-app contains all the react code and configs. To get our app(custom react js library) to play well with drupal we will need to override somethings, like scripts to rename our files (build command),to something drupal can identify(recognize) and load. Run yarn add react-app-rewired --dev, to download react app rewire, that let's us override the default react-app configs without having to eject our app. In the root of your react-app folder, create a file named config-overrides.js that should contain the below code

module.exports = function override(config, env) {

  config.optimization.runtimeChunk = false;
  config.optimization.splitChunks = {
    cacheGroups: {
      default: false
    }
  };

  return config;
};

and edit the scripts in in the package.json to

"build": "react-app-rewired build && yarn run build:dist",
"build:dist": "cd build && copy static\\js\\*.js main.js && copy static\\css\\*.css main.css",

NB: I have edited the build command and added the build:dist script (however if not on windows please replace copy with cp and \\ with / in the build:dist). This will make sure every time you run the build script, your build files will be renamed to main.js and main.css without the filename..js/css which we can then reference in our libraries.yml file.

my modulename.libraries.yml looks like this (filename = modern_js_drupal.libraries.yml)

react_local:
  version: 1.x
  js:
    my-app/build/main.js: {}
  css:
     layout:
       my-app/build/main.css: {}

and my block.html.twig

<div class="row">
  <div id="root">
    <h4>React App</h4>
</div>

{{ attach_library('modern_js_drupal/react_local') }}

The reason I named my div 'root' and not anything else if because react app uses the same id when rendering your app. Look into react_js/public/index.html and react_js/src/index.js. index.html provides the div to hook our app into and index.js renders the app on the div provided ( ReactDOM.render(<App />, document.getElementById('root'));), The advantage of this during development is, you get to create your app and view the changes instantly on your app (http://localhost:3000/) and you can later run yarn build to view the most recent changes on your drupal 8 site.



来源:https://stackoverflow.com/questions/49511618/how-to-integrate-a-react-application-in-drupal-8-using-drupal-custom-module

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!