Parcel allows us to bundle frontend applications with no configuration and GitHub pages affords us a way to deploy them for free.
Here’s how to use these two tools together to deploy a JavaScript application.
Full example of a repo deployed like this: https://github.com/HugoDF/js-graphql-client-example, and see https://codewithhugo.com/js-graphql-client-example/.
Or the repo with the demos: https://github.com/HugoDF/parcel-gh-pages-deploy and see https://codewithhugo.com/parcel-gh-pages-deploy/.
This was sent out on the Code with Hugo newsletter last Monday.
Subscribe to get the latest posts right in your inbox (before anyone else).
Setting up parcel 📦
npm install --save-dev parcel
Say you have an index.html
and client.js
in your root:index.html
:
<!doctype html>
<html class="no-js" lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Your site title</title>
<meta name="description" content="Your site meta description">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
</head>
<body>
<div id="app">
<script src="./client.js"></script>
</body>
</html>
client.js
:
const $app = document.querySelector('#app');
$app.innerText = 'Hello world';
Granted you don’t need to bundle this, but let’s say we do.
With npm 5+ you can run: npx parcel index.html
(on old npm, ./node_modules/.bin/parcel index.html
).
Go to http://localhost:1234 or run the command with --open
option (npx parcel index.html --open
), you should see the following:
Note the
./client.js
path that is relative to where theindex.html
is.
React and Vue single file components etc also work with simple .babelrc
include and npm install of respectively babel-preset-react
or babel-preset-vue
.
We can put the script in package.json
:
{
"scripts": {
"start": "parcel index.html"
},
"devDependencies": {
"parcel": "^1.9.7"
}
}
And run it with npm start
which will do the same as we did with npx
earlier.
Deploying for free 💸
npm install --save-dev gh-pages
In package.json
:If you’re building a repo that is not USERNAME.github.io
:
{
"scripts": {
"start": "parcel index.html",
"predeploy": "rm -rf dist && parcel build index.html --public-url YOUR_REPO_NAME",
"deploy": "gh-pages -d dist"
},
"devDependencies": {
"gh-pages": "^1.2.0",
"parcel": "^1.9.7"
}
}
For our example that means:
{
"name": "parcel-gh-pages-deploy",
"description": "Deploy a parcel app to GitHub pages",
"scripts": {
"start": "parcel index.html",
"predeploy": "rm -rf dist && parcel build index.html --public--url /parcel-gh-pages-deploy",
"deploy": "gh-pages -d dist"
},
"devDependencies": {
"gh-pages": "^1.2.0",
"parcel": "^1.9.7"
}
}
If you are building USERNAME.github.io
, use the following "
predeploy
"
instead:
"predeploy": "rm -rf dist && parcel build index.html",
❤ GitHub Pages and Parcel.
For any questions let me know on Twitter @hugo__df.
Top comments (0)