A project template and a generator to:
- Learn how Elm, Parcel, Cypress and Netlify work together ๐
- Get started with Elm css, navigation, routes, remote data and JSON decoder
- Local web server and optional serverless functions
- Hot code and style reloading, keeping app state
- CSS transformations with postcss (
autoprefixer
,purgecss
...) - Front-end testing
- Optimized and minified production build
- Preview and production deployments
npm init elm-batteries ./my-elm-app
- or
yarn create elm-batteries ./my-elm-app
- or generate from Github
The generated Elm app. Started with Parcel
behind Netlify Dev and tested with Cypress:
Test file source: demo.spec.js
- Demo: elm-batteries.netlify.com/demo
- Twitter: @CedricSoulas
- Newsletter: concat.dev/elm
- Chat: Slack (ping @CedricSoulas)
- Forum: Discourse thread
- Setup
- Local development
- Testing
- Production build and deployment
- Designing
- See also
The CLI lets you pick the batteries to include in your app:
npm init elm-batteries ./my-elm-app
cd my-elm-app && npm run dev
yarn create elm-batteries ./my-elm-app
cd my-elm-app && yarn dev
Click Use this template to generate a new public or private project from elm-batteries.
Install the dependencies with npm install
or yarn install
and run npm run dev
or yarn dev
.
๐ก In the following documentation, if you use yarn, run yarn <command-name>
(instead of npm run <command-name>
). Alternatively, you can define short aliases in your terminal to run these commands.
To run serverless functions along your Elm app, run
npm run dev
or
yarn dev
Then open localhost:8888
โ development build with Parcel
โ web server with Parcel behind Netlify Dev
โ serverless functions on your local machine
โ hot code swapping with elm-hot
1234
default Parcel port. Make sure this port isn't used by another application.
Read Elm + Parcel to use this project template without Netlify Dev and serverless functions.
To share your development session with a coworker, run:
npm run dev:live
โ development build with Parcel
โ live sharing with Netlify Dev
These tests are in cypress/integration/*
. Start your Elm app then launch the Cypress runner app:
npm run cypress:open
If you open one test from the list of spec files (for example demo.spec.js) then you should see your application loaded:
Alternatively, to run Cypress tests from the CLI without the GUI:
npm run cypress
The Elm app uses data-*
attributes to provide context to the selectors and insulate them from CSS or JS changes. Learn more โบ
To learn more about Cypress and play with it, install and start it in a fresh new project folder: it will initialize a cypress
folder with several examples.
Install elm-test.
These tests are in tests/*
. To start the runner in watch mode:
npm run test:watch
Alternatively, run it just once:
npm run test
npm run deploy
or
yarn deploy
โ production build with Parcel
โ compilation with the Elmoptimize
flag
โ minification withterser
โ deployment to a Netlify Live Draft URL
๐ก If you are using Netlify for the first time, run netlify login
to authenticate (learn more about Netlify CLI).
๐ก The JS code from Elm is minified with special flags that work for Elm apps because they have no side-effects (otherwise it would be unreliable to use such flags).
If this preview looks good, deploy to production.
npm run deploy:prod
โ deployment to production with Netlify
deploy
commands are great when rapidly iterating. Consider also setting up continuous deployment with Netlify ยป.
Tailwind CSS, an utility-first CSS framework, is included along with:
postcss
(readpostcss.config.js
),autoprefixer
to add vendor prefixes,purgecss
to remove unused selectors,- and
cssnano
to compress the css (by default with Parcel).
purgecss
and cssnano
are used on production mode to minify the css. They are ignored on development mode.
index.html
has meta tags included, like Twitter Card tags and Open Graph tags. Make sure to update their values and the content preview image (img/content_preview.jpg
).
- All links in an application create a
UrlRequest
(read Browser.application). - A navigation
Key
is needed to create navigation commands that change the URL: it is stored in theModel
. Nav.pushUrl
changes the address bar without starting a page load.
- Demo: elm-batteries.netlify.com/demo
- Documentation: Table of contents
- Twitter: @CedricSoulas
- Newsletter: concat.dev/elm
- Chat: Slack (ping @CedricSoulas)
- Forum: Discourse thread
- Project template: github.com/cedricss/elm-batteries
- Built with elm-batteries:
Authored by Cรฉdric Soulas, released under the MIT License. Read LICENSE.