You can easily develop an application with stand-alone ReactJS MVC application by simply using the template which is shipped by default with Visual Studio. There is also an alternate way to build a client-side application architecture by leveraging the command and npm command of create-react-app command.
If you don’t know how to use this, please read about how to use create-react-app command which creates the boilerplate for react application and on top of that you can start developing the ReactJS application based on the structure which suits your project requirement better. Such type of application can be easily used with MVC Web API where you have no MVC View but only APIs to deal with.
Have you ever thought of an application structure with a hybrid approach where you have to use both MVC and ReactJS together? Yes, this might be one of the challenges where you need to integrate ReactJS component within the MVC View. But the question is how are we going to inject component within the MVC View?
Before you dive deep into this blog it is expected that the target audience are familiar with
- NET Core
- Little knowledge of Webpack
- Babel configuration and how it works
In hybrid structure, you integrate both MVC and client-side framework i.e. ReactJS together. When I say together, it is expected that you leverage the flavor of ASP.NET (CORE) and ReactJS.
Well, there are few third party Nuget packages which you can make use of, but you wouldn’t be having much control over third party packages. Few reasons are – your current version of Asp.net Core is 2.1 and the 3rd party Nuget package version requires you to move to 2.2 or vice versa and may be the package only supports JSX extension but not TSX(TypeScript) and you have to wait until the support is being given for TSX files.
These challenges are very obvious and relying on the 3rd party is quite highly dependent, and which may delay your project delivery by going through the POCs doing R&D on the 3rd party packages on which we don’t have any control.
So, what are we supposed to do now? Shall we continue exploring the 3rd party packages and keep googling until the new version is released for the package which fulfils the requirement.
Jokes apart, but instead of spending too much time on the one which we are not sure about, we could find the alternate way or better way where you have full control on what you do, how you do and most important that fulfils the requirement of your project requirement.
Yes, you got me right, writing your own configuration for the hybrid approach. In the next few sections, we will be understanding how we can write hybrid application which includes ASP.NET Core and ReactJS.
Let’s dive into the fun part of the discussion
In order to go ahead, I would like you to make sure that you follow the steps and create a simple sample application that uses hybrid approach.
- Visual Studio/ Visual Code - Installed
- NodeJS - Installed
- net Core SDK
Why we need hybrid applications if many things can be done by using the stand-alone applications or even using ReactJS build-in template provided by Visual Studio?
Think about the large enterprise application, which uses SPA and keep the flavor of MVC applications too where you have numerous views. And how difficult is it to manage such applications simply in react. Another example could be your application uses such as 3rd party complex tools which are not available in ReactJS. So, keeping the Hybrid approach can save you from all these complex problems where you have all the control of choosing which view would suit your requirement i.e. MVC View or React Component.
In this section, we will try to understand how to build and use such complex application which handles such complex business scenarios.
MVC Project set up
Open the visual studio and create an MVC Core project name it as ‘HYBRID.WEB’.
When a project is created go to Views/Home and open the Index.cshtml
Remove all the content from Index.cshtml and keep it clean. We are done with this page for now and we will re-visit this page when our client-side application is set up and ready to be injected within the CSTML view.
Client side set up
Now, we are going to set up the client-side project under the MVC project. So that it can be injected within the MVC view i.e. <view name>.chtml.
Create a directory let’s say ‘ClientApp’ on the root level of ‘HYBRID.WEB’
Open the command prompt on the root level of the ‘HYBRID.WEB’ project and install the libraries required for react typescript, see the package.json snippet.
You can install the package by using the command
npm install --save react react-dom
npm install --save-dev @types/react @types/react-dom
npm install --save-dev @babel/preset-react
Create a file on the root directory of ‘HYBRID.WEB’ name it as ‘.babelrc’ and then configure the file and babel as mentioned below
npm install --save-dev webpack
npm install --save-dev webpack-cli
Now we are all set to start the coding. The only one thing remaining now is setting up the webpack. Let’s do it now.
Create a file ‘webpack.config.js’ under the root directory of project ‘HYBRID.WEB’ and configure the file as below.
Note: you need to install ts-loader, inline-source-map and other dependent packages by running npm install –save <<package name>
We are now all set to write our client-side react application and use it in MVC View. But before that, we need to configure our package.json scripts section which will help running the webpack.config.js setting which we have done in the previous section.
Let’s see how to configure the scripts in package.json.
Before writing the code, let’s open the command prompt under project root directory i.e. ‘HYBRID.WEB’
Everything is in place now.
Create react component
Create a directory say ‘components’ under ‘ClientApp’ which we had created previously.
Under ‘components’ directory, create one more directory ‘home’ and under that create one typescript file say ‘HomeComponent.tsx’
If you are familiar with the ReactJS you can simply write a component that shows a message.
The above code will parse the React component in browser as HTML <h2> tag. What is React and JSX syntax and how babel plays a role is altogether is a different topic and you can go through any blogs and websites for more information on this topic.
So far, we have one react component i.e. ‘HomeComponent.tsx’ ready but how is it going to be used inside MVC View.
Well, here we will be setting up the module. A module is not any naming convention but something i use to refer.
Group of functionalities performed under one react component or say Container. Let’s create ‘HomeModule.tsx’ as we have created ‘HomeComponent.tsx’ which is very specific to perform a task related to home page activity.
You can decide the directory structure. I am creating a typescript file at a location ‘ClientApp/components’. Let’s name it as ‘HomeModule.tsx’.
Now write few codes inside this file like below-
What are we doing in this file?
Well if you notice from lines 2 and 3, we are importing ‘react’ and ‘react-dom’ in order to use render method of ‘react-dom’.
Note: Please read more about this on your own if you are not familiar with these.
In line no.7, we are rendering the component which we have created i.e. ‘HomeComponent’ in previous section.
Render method takes two parameters:
- Which component needs to be rendered
- Where do you want to render the element
Now go to the ‘Views/Home’ and there we have Index.cshtml which we will be modifying now and after the modification, the Index.cshtml will look something like below-
- Element id is the same as the render method’s second parameter where you want to render this component. Ids must be same in order to render the HomeComponent to cshtml
Here comes the part where all your efforts so far are going to be seen on the screen. But before that, you need to run a command-
npm run build or npm run watch
build one-time activity - running in this mode any changes wouldn’t be reflected until you re-run the same command.
watch and keep checking the file if something is modified then it will invoke webpack to build and compile the changes.
If you notice in the below image there are home.bundle.js file is created. You must be wondering how this file got created. Remember we had configured the webpack in ‘Webpack Configuration’ section – there we had mentioned entry object and had given a name.
But how come in home.bundle.js you have the answer in the configuration section only i.e. output object, see the below image
Here, we are telling webpack that creates a file with the [name].bundle.js which is home.bundle.js and we are also specifically telling webpack that copy these generated files under wwwroot/publish directory.
The location looks like this-
Injecting react component to View
Here comes the final step. In the above section, we see the commons.bundle.js and home.bundle.js files are created. commons.bundle.js files hold the references of multiple entries such as files like home.bundle.js, contact.bundle.js.
So, if you see the commons.bundle.js file then you can add this script file it _Layout.cshtml as this is going to be common to all the pages.
We have Index.cshtml page where we will be injecting our react component like below
These bootstraps the home component in Index.cshtml and you will see the <h2> tag with the message.