Photo by Zoltan Tasi on Unsplash
I had a chance to update a legacy ASP.NET MVC website using AngularJS (yes, the first version) to use Webpack & Babel 7 (which used to import AngularJS files using script tags).
Previous post Setting up an ES6 Environment for ASP.NET MVC 5 was a bit outdated as it was using older version of babel and webpack, so I decided write more concise post to get started with the newest libraries.
As I have moved onto React, I will show you how to set up React environment for ASP.NET MVC 5.
🧐 Prerequisite
I will assume that you are familiar with NPM & Webpack,
so I won’t go into too much details on what each option in NPM & Webpack.
👣 Setup Steps
- Create an ASP.NET MVC web site
- Create & configure NPM configuration file (package.json)
- Create & configure Babel configuration file (.babelrc)
- Create & configure Webpack configuration file (webpack.config.js)
- Install NPM packages
- Install Visual Studio Extensions (NPM Task Runner)
1. Create an ASP.NET MVC web site
Create a new ASP.NET MVC project (choose a choice of your .NET framework).
And select a template.
2. Create & configure NPM configuration file (package.json)
Add a new item in the project root.
Create NPM configuration file, package.json
.
And add a script section. And package.json
would initially look like the following.
3. Create & configure Babel configuration file (.babelrc)
Add a new file named .babelrc
in the same directory as package.json
file created in the previous step.
And add following babel options.
- @babel/preset-env – enables latest JavaScript syntax
- @babel/preset-react – adds support for React syntax
- @babel/plugin-proposal-class-properties – adds support for an instance and/or static member declarations in JavaScript classes.
4. Create & configure Webpack configuration file (webpack.config.js)
Create a file named webpack.config.js
in the project root (same location as package.json
& .babelrc
) & configure it as shown below.
Webpack outputs a bundle as ./Scripts/dist/Home/react/bundle.js
so let’s add the script in View\Home\Index.cshtml
razor file.
5. Install NPM packages
Now let’s install NPM packages to enable latest JavaScript and React syntax.
- babel-loader – Webpack loader for babel
- browser-sync & browser-sync-webpack-plugin – sync’ing browser upon code change
- webpack & webpack-cli – for running Webpack
- webpack-notifier – Shows pretty webpack notification
- react& react-dom – React library
6. Install Visual Studio Extensions (NPM Task Runner)
This is an optional step but to make our lives easier, let’s install a Visual Studio extension, NPM Task Runner for running NPM scripts from Visual Studio.
⚛ Let’s write some React code
Now we are ready to write a React script using the latest JavaScript syntax (ES6+).
Let’s add an entry point for React in Views\Home\Index.cshtml
file by deleting everything except ViewBag.Title
section and add <div id="app"></div>
.
Now we have an entry point, let’s write a simple React file index.js
under Scripts\Home\react
directory.
🏃 Transpiling and Running
You could run the dev
script within package.json
file but let’s use the NPM task runner to make the life easier.
Open the “Task Runner Explorer” by right clicking on package.json
file in the project root.
Start dev
script (double click), which monitors the changes in index.js
.
To enable browser-sync, you need copy a script generated by browser-sync message in _Layout.cshtml
under Shared
folder near end of </body>
tag.
And lastly, let’s run ASP.NET from Visual Studio to see the result.
♻ Reloading Browser Automatically
You’ve installed browser-sync*
packages so as you change your code, the browser will reload automatically upon saving.
👋 Parting Words
In this post I’ve assumed that you know the basics of NPM & Webpack so skipped much of details so that you can easily get up and running.
Please refer to documentations linked in-line in the post if you want to understand how each step works and to troubleshoot should you run into an issue.
Source code is available on GitHub.
The post Setting up a React Environment for ASP.NET MVC appeared first on Sung's Technical Blog.
Top comments (46)
I start dev script in the task runner and it works very good, but only once. When I edit index.js and save it, it doens't recompile the file and I need to run dev again every time. Do you think I'am doing some thing worng?
Justo solved by adding the following lines in the webpack.config.js file:
watchOptions: {
poll: 1000 // Check for changes every second
}
Thanks for the update & the fix, Daniel~
I honestly moved away from using React within ASP.NET MVC, so wasn't aware of how to deal with it :)
Out of curiosity, have you moved away from using React with .NET MVC for a particular reason or have you just become interested in other things? My team wants to implement a JavaScript technology to build out some parts of our site that might be a pain otherwise and I have been learning React because it seemed like a good fit. I know everything is dependent on the project at hand, but if there are general drawbacks in your opinion I would be interested in hearing. Thanks for this article it was very useful!
Hi Tory, check out the replies below.
Tooling support for classic ASP.NET MVC (I haven't used ASP.NET Core) has been subpar (hot reloading was buggy, requireing manual refresh & new JavaScript syntax was flagged as erroneous, etc).
And also following JamStack, having a separate API server with a pure React front-end helped to separate responsibilities.
I can't seem to find the post(was it a forum?) now, but MS wasn't focusing on making SPA easier to develop few years ago so I moved away.
Thanks for your perspective on this. Hoping to make the switch to .NET Core sometime soon and it seems like it is better suited, going to the Live 360 conference later this month and will hopefully get more information. Have a good one!
Hi, I tried out your process using VS2019, step by step and got the following error. Was hoping you might nudge me in the right direction :). [I am a relative newbie with npm]
Hi Bill.
I am sorry it's because the code snippet is out of sync from the instruction. You might want to use
React.Fragment
instead of<>...</>
because it's a syntatic sugar (you'd need to set up plugin-transform-react-jsx for that syntax to work, which is not set up in this article.)As a workaround, you can use
React.Fragment
directly as shown below (I've also updated the gist to reflect the change).Thanks so much for the quick reply.
That didn't change the outcome. Same error unexpected token.
I did note that the first line in the index.js file
was reporting an Intellisense error: "(js) cannot use imports, exports, or module augmentations when '--module' is 'none'"
Could this be a contributing factor.
Article says
Webpack outputs a bundle as ./Scripts/dist/Home/react/bundle.js so let’s add the script in View\Home\Index.cshtml razor file.
but then the picture below it shows it being added to _Layout.cshtml. Is this just a typo?
I tried to create about.js for about.cshtml and followed the same steps for index.js and index.cshtml, but it did not work. So I am not thinking if there are additional steps that I need to do? Thanks in advanced!
Hi @jiaqizuo
What's error and do you have code snippets handy?
So basically I just did the same things what you taught to about.js and about.cshtml, but it seems there is no thing to show up on the About Page
First off, thank you for the great article : it's helping me a lot to configure ReactJS.NET within our ASP.NET MVC 4 website.
In step 4, you wrote :
Webpack outputs a bundle as ./Scripts/dist/Home/react/index.js
when I think you meant :
Webpack outputs a bundle as ./Scripts/dist/Home/react/bundle.js
Cheers!
Thank you, Jérôme 🙏 enjoying the post and spotting the error.
I've updated the post 🙂🤜
any idea how to create production verion (without node_modules folder) using the environment you created (mvc project)
When you generate a bundled JavaScript, you do not need to deploy the
node_modules
folder or add to the source control.You could just deploy the bundled JavaScript in your production.
Or do you not want to have
node_modules
folder in the first place? If so you would need to use CDN scripts.if i remove the "node_modules" from the environment , the project fall and i get error like Module build failed: Error: ENOENT: no such file or directory, open
'...node_modules\react\index.js'
Ah, I see what you mean.
I am sorry I made a mistake in the post so updated step 5. Install NPM packages to install
react
&react-dom
as a dependency not as a dev dependency, which is not included in the final bundle.So
react
&react-dom
should be underdependencies
as shown inpackage.json
below.dont have any pack in devdependency
here is package.json
"name": "webbuildingoverhaul",
"version": "1.0.0",
"description": "",
"main": "webpack.config.js",
"dependencies": {
"@progress/kendo-data-query": "1.5.0",
"@progress/kendo-date-math": "1.3.2",
"@progress/kendo-drawing": "1.5.7",
"@progress/kendo-react-common": "2.4.0",
"@progress/kendo-react-dateinputs": "2.4.0",
"@progress/kendo-react-dropdowns": "2.4.0",
"@progress/kendo-react-excel-export": "2.6.1",
"@progress/kendo-react-grid": "2.4.0",
"@progress/kendo-react-inputs": "2.4.0",
"@progress/kendo-react-intl": "2.4.0",
"@progress/kendo-react-pdf": "2.4.0",
"@progress/kendo-theme-default": "2.56.0",
"babel-core": "6.26.3",
"babel-loader": "7.1.5",
"babel-preset-es2015": "6.24.1",
"babel-preset-react": "6.24.1",
"bootstrap": "4.1.3",
"css-loader": "0.28.11",
"kendo-ui-core": "2018.3.911",
"moment": "2.22.2",
"prop-types": "15.6.2",
"react": "16.5.0",
"react-alert": "4.0.4",
"react-alert-template-basic": "1.0.0",
"react-datetime": "2.16.3",
"react-dom": "16.5.0",
"react-redux": "5.0.7",
"react-router": "4.3.1",
"react-router-dom": "4.3.1",
"react-router-native": "4.3.0",
"react-transition-group": "2.4.0",
"redux": "3.7.2",
"redux-thunk": "2.3.0",
"restore": "0.3.0",
"style-loader": "0.19.1",
"webpack": "3.12.0",
"webpack-cli": "2.1.5",
"html-webpack-plugin": "3.1.0",
"webpack-dev-server": "3.1.8"
},
"devDependencies": {},
"scripts": {
"watch-test": "mocha --watch --reporter spec test",
"build-js": " reactify app.jsx | uglifyjs -mc > bundle.js",
"build": " webpack"
},
"author": "",
"license": "ISC"
}
...
I can empathize with your experience because
I've also been bitten badly trying to figure out why a page wasn't working properly as I
assumed
the site was rendered correctly without any build issues.That's why I have a separate build script that'd just run webpack without watching the file change so I can fire up an one off build when I am paranoid 😀😄
Thanks a lot! That was really easy to follow!
You're welcome and thank you for the props, Riadul~
Thank you so much for this article! I was looking to start with React in .Net.
You're welcome Nicolas.
But also consider creating React & Back-end in separate projects as discussed in this reddit post, Reaact and backend different or in same solution.
Great advice, thank you!
Thanks for the nice simple article.
Thanks Mark :)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.