Build a JSX Live Compiler as a React Component

Joe Maddalone
InstructorJoe Maddalone

Share this video with your friends

Send Tweet
Published 8 years ago
Updated a year ago

As a tool for future lessons, we want to have the ability to write JSX and see the output live in the browser. In this lesson we will use React to build our own live JSX compiler.

[00:00] In this lesson, we're going to create an in-browser JSX transpiler. Here, in our index.html of our Create React App application, I'm bringing in the standalone version of Babel.

[00:14] Here, in our code, we've got a simple component that says returning a div. We're going to add to that a header. This is where we're going to place our error, if we have one. That's going to come from our state. We're going to have a div with a class name of container. We'll be styling that in just a moment.

[00:31] We're going to have a text area. This guy is going to have an onChange event=this.update, and we'll bind that to the context of this. We're going to have a default value=this.state.input. That's going to be for the code that we're typing that we want to transpile.

[00:54] Next to that, we're going to have a pre tag. Its content is going to be for the output. We'll get that from this.state.output.

[01:02] Let's go ahead and set up our state. Create a constructor called super to get our context. We're going to say this.state= first, we're going to have our input.

[01:14] We're going to go and set that to a default of, "Add your JSX here." We'll have our output. That will just be an empty string, and it will have our error. That will also be an empty string. Let's go ahead and create our update method. This is going to take in an event off of our text area. We're going to say let code=e.target.value. We're going to throw the rest of this in a try catch block.

[01:43] What we're going to try to do is set our state of output to window.babel. We're accessing that library that we're bringing in over CDN. We're going to call its transform method. Into that, we're going to pass our code.

[02:01] I'm going to break this up a little bit, so we can see it a little better. Along with our code, we need to pass our options. What we need is the presets, which is an array.

[02:11] Into that, we're going to say, "Yes, 2015 and React." From the result of that, we need code. What we're doing is we're saying window.babel transform our code using these presets, and then give us that code back.

[02:27] Assuming that doesn't fail, we're going to set our error to empty string. If it does fail, we're going to set our error to error.message.

[02:39] Let's go ahead and save that. See if we messed anything up. It's going to be a little hard to see here before we style it. I'm going to go ahead and create a div, close it. It looks like everything is working.

[02:52] Now, we need to create our style. Right here in source, I'm going to create a new file, app.css. We're going to import that into our component right here. After we import our React package, we're going to say import app.css, and we'll go ahead and start setting that up.

[03:09] On our body, we're going to have a margin of zero, a padding of zero. We're going to try to set everything up to be a font family of monospace.

[03:20] Our header, which is going to house our error, I'm going to say display block on that guy, give it a height of five viewport height units. Just in case our errors get long, we're going to say overflow auto. Give that a background color. I'm going to go with pink. We're going to give it a bit of color. Since it's an error, we'll make that red.

[03:43] I'm going to set up a font size of 28 pixels. We can see that there in the browser.

[03:51] Now, on our container, which holds our text area and our pre, we're going to have that take up the remaining viewport height, and we're going to set that to display with flex. We've got our pre, which is going to house our output. That's going to be the element down the right below the header. We're going to give that a light grey background, so we'll do F8.

[04:13] For our pre and our text area, give each of those a width of 50 percent. Use that monospace family. We'll have the font size match the header size, so 28 pixels.

[04:29] Give that a margin of zero, a padding of, let's go with 10. A color, something blackish. That's starting to come together.

[04:38] In OS X, we're going to get this outline here. Let's go ahead and get rid of that. We'll say text area focus outline zero. Let's blow this up. If we start typing here, let's say starting off our div, we haven't enclosed it. We are getting an error message.

[04:58] If I close that, we get a react.create element over on the right. Let's try a class name really quick. This seems to be working just fine.

Daniel
Daniel
~ 7 years ago

Looks like there is a slight type with importing the bootstrap css. The link should go to http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css instead of //netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css

Michel
Michel
~ 7 years ago

This works if you use a web server to preview the page, because using "//" uses the same protocol as was used to load the page. This won't work if you're previewing by doing "Open File" from your browser, because the protocol is "file://".

Chris Kobrzak
Chris Kobrzak
~ 6 years ago

At the time of writing this post the JSBin snippet is using React 0.14.3 and it doesn't seem to work in the browser. Adding the type="text/babel" attribute to the index.js <script> tag in index.html seems to have resolved this issue (tested in Safari 9 and Chrome Canary 49).

Seb
Seb
~ 6 years ago

Nice lesson. I love how you can just bosh out the CSS without any kind of effort or much typing because of the macros and seemingly infinite experience.

Jun
Jun
~ 6 years ago

Thank you for posting this. The type="text/babel" attribute saved me tons of time debugging.

Roland Cedo
Roland Cedo
~ 5 years ago

I'm receiving "Error in ./src/App.js Module not found: 'App.css' in path_to_project/src".

I have App.css in my src directory. A quick search on Google suggests that I'm missing a loader but I don't think the course covered any steps set up anything. Suggestions?

Chris Frewin
Chris Frewin
~ 5 years ago

Roland, I have the exact same error. I tried npm install --save-dev css-loader and npm install --save-dev style-loader, but they didn't help... did you manage to find a solution?

Roland Cedo
Roland Cedo
~ 5 years ago

Hey Chris,

I tried the exact same thing after doing some time on StackOverflow. No luck yet, hopefully we can get some admin help sometime soon. I managed to finish this course without it though. Some breaking changes in React may have happened since this was recorded.

Maxim Kazantsev
Maxim Kazantsev
~ 5 years ago

Hey Roland, Chris! I had the same issue just now and turns out if you do import './App.css', it works nicely. I assume it's a new version of Webpack or change of Webpack config in create-react-app that is causing it.

Neil Kempin
Neil Kempin
~ 5 years ago

I believe the usage of import 'App.css' is not supported in a non-ejected create-react-app app without some css loader configuration, at this time.

Anthony Buckley-Thorp
Anthony Buckley-Thorp
~ 5 years ago

I just encountered this same issue when following along. To get around it I just put the CSS in some <style type='text/css"></style> tags in the index.html file which worked fine.

yulia
yulia
~ 4 years ago

the correct import './App.css’ instead of 'App.css’; otherwise it will be error

Itamar Silverstein
Itamar Silverstein
~ 4 years ago

full of errors. first error - cannot find webpack somehow... even after npm i --save webpack and npm i --save webpack-dev-server GUYS please first test the code in vs code / atom / whatever before you push this project to git people pay money for this you know

Janis
Janis
~ 2 years ago

As of now, Aug 2019, Github repo doesn't work last I tried. Path problems with webpack or something. Didn't dig deeper I dunno webpack. Same problem as Itamar suggested above.