You may already be familiar with webpack for asset management on projects. However, there’s another cool tool out there called Parcel, which is comparable to webpack in that it helps with hassle-free asset bundling. Where Parcel really shines is that it requires zero configuration to get up and running, where other bundlers often require writing a ton code just to get started. Plus, Parcel is super fast when it runs because it utilizes multicore processing where others work off of complex and heavy transforms.
So, in a nutshell, we’re looking at a number of features and benefits:
- Code splitting using dynamic imports
- Assets handling for any type of file, but of course for HTML, CSS and JavaScript
- Hot Module Replacement to update elements without a page refresh during development
- Mistakes in the code are highlighted when they are logged, making them easy to locate and correct
- Environment variables to easily distinguish between local and production development
- A “Production Mode” that speeds up the build by preventing unnecessary build steps
Hopefully, you’re starting to see good reasons for using Parcel. That’s not to say it should be used 100% or all the time but rather that there are good cases where it makes a lot of sense.
In this article, we’re going to see how to set up a React project using Parcel. While we’re at it, we’ll also check out an alternative for Create React App that we can use with Parcel to develop React applications. The goal here is see that there are other ways out there to work in React, using Parcel as an example.
Setting up a new project
OK, the first thing we need is a project folder to work locally. We can make a new folder and navigate to it directly from the command line:
mkdir csstricks-react-parcel && $_
Next, let’s get our obligatory package.json
file in there. We can either make use of npm or Yarn by running one of the following:
## Using npm
npm init -y
## Using Yarn, which we'll continue with throughout the article
yarn init -y
This gives us a package.json
file in our project folder containing the default configurations we need to work locally. Speaking of which, the parcel package can be installed globally, but for this tutorial, we’ll install it locally as a dev dependency.
We need Babel when working in React, so let’s get that going:
yarn add parcel-bundler babel-preset-env babel-preset-react --dev
Next, we install React and ReactDOM…
yarn add react react-dom
…then create a babel.rc
file and add this to it:
{
"presets": ["env", "react"]
}
Next, we create our base App
component in a new index.js
file. Here’s a quick one that simply returns a “Hello” heading:
import React from 'react'
import ReactDOM from 'react-dom'
class App extends React.Component {
render() {
return (
<React.Fragment>
<h2>Hello!</h2>
</React.Fragment>
)
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
We’ll need an HTML file where the App
component will be mounted, so let’s create an index.html
file inside the src
directory. Again, here’s a pretty simple shell to work off of:
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Parcel React Example</title>
</head>
<body>
<div id="root"></div>
<script src="./index.js"></script>
</body>
</html>
We will make use of the Parcel package we installed earlier. For that to work, we need to edit the start
script in package.json
file so it looks like this:
"scripts": {
"start": "NODE_ENV=development parcel src/index.html --open"
}
Finally, let’s go back to the command line and run yarn start
. The application should start and open up a fresh browser window pointing at http://localhost:1234/
.
Working with styles
Parcel ships with PostCSS out of the box but, if we wanted to work with something else, we can totally do that. For example, we can install node-sass to use Sass on the project:
yarn add --dev node-sass autoprefixer
We already have autoprefixer since it’s a PostCSS plugin, so we can configure that in the postcss
block of package.json
:
// ...
"postcss": {
"modules": false,
"plugins": {
"autoprefixer": {
"browsers": [">1%", "last 4 versions", "Firefox ESR", "not ie < 9"],
"flexbox": "no-2009"
}
}
}
Setting up a production environment
We’re going to want to make sure our code and assets are compiled for production use, so let’s make sure we tell our build process where those will go. Again, in package-json
:
"scripts": {
"start": "NODE_ENV=development parcel src/index.html --open",
"build": "NODE_ENV=production parcel build dist/index.html --public-url ./"
}
Running the yarn run build
will now build the application for production and output it in the dist
folder. There are some additional options we can add to refine things a little further if we’d like:
--out-dir directory-name
: This is for using another directory for the production files instead of the defaultdist
directory.--no-minify
: Minification is enabled by default, but we can disable with this command.--no-cache
: This allows us to disable filesystem cache.
💩 CRAP (Create React App Parcel)
Create React App Parcel (CRAP) is a package built by Shawn Swyz Wang to help quickly set up React applications for Parcel. According to the documentation, we can bootstrap any application by running this:
npx create-react-app-parcel my-app
That will create the files and directories we need to start working. Then, we can migrate over to the application folder and start the server.
cd my-app
yarn start
Parcel is all set up!
Parcel is worth exploring in your next React application. The fact that there’s no required configuration and that the bundle time is super optimized makes Parcel worth considering on a future project. And, with more than 30,000 stars on GitHub, it looks like something that’s getting some traction in the community.
Additional resources
- Parcel Examples: Parcel examples using various tools and frameworks.
- Awesome Parcel: A curated list of awesome Parcel resources, libraries, tools and boilerplates.
The source code for this tutorial is available on GitHub
Autoprefixer team does not recommend to specify target browsers in
browsers
option.Parcel even promote your to create Browserslist config (which is also the only official way to set target browsers for Autoprefixer).
Put this to
package.json
:This config will be used by Autoprefixer and Babel. As result, you will have the single place with target browsers for all your tools.
There is no need to specify
NODE_ENV=development
orNODE_ENV=production
since that is implied byserve
/watch
orbuild
respectively.Not sure if CRAP is still active, no commits in over 18 months