Javascript Apps at Build Artifacts

29
CLAY SMITH Javascript apps as a build artifact [email protected] @smithclay May 6, 2014 at EmpireJS

description

Talk at EmpireJS 2014. May 6, 2014.

Transcript of Javascript Apps at Build Artifacts

Page 1: Javascript Apps at Build Artifacts

CLAY SMITH

Javascript apps as a build artifact

[email protected]

@smithclay

May 6, 2014 at EmpireJS

Page 2: Javascript Apps at Build Artifacts

This is my brain on Javascript.

Page 3: Javascript Apps at Build Artifacts

From the “Javascript Development Workflow” talk

Understanding it all (from @paulirish)

Page 4: Javascript Apps at Build Artifacts

Easy answer: We’re using Javascript written for the web more and in different places.

Why does it matter?

From 4/13 to 4/14, httparchive.org

Page 5: Javascript Apps at Build Artifacts

Now for a 5-minute Overview of the Raging Javascript Battles of Today

Page 6: Javascript Apps at Build Artifacts

Javascript Battlefield #1 (2010-present)“My framework is better than yours.”

http://en.wikipedia.org/wiki/Comparison_of_JavaScript_frameworks

Page 7: Javascript Apps at Build Artifacts

from https://gist.github.com/callumacrae/9231589

JakeBrunchsmooshanvil.jsGruntGear.js

buildrmimosamodjsautomatonjames.jsBudGulpsimplebuildBrocolliFez

Javascript Battlefield #2 (2011-present)“My build tool is better than yours.”

Page 8: Javascript Apps at Build Artifacts

“I prefer to write in _____(A)______, it makes creating _____(B)______ easier.”

(*)script Battlefield #3 (2010-present)

CoffeescriptClojureScriptDartTypeScriptasm.jsGWTdogescript

A Bweb appsmobile appsframeworksnodebotsarduinosmuch wow

Page 9: Javascript Apps at Build Artifacts

Javascript Battlefield #4 (2012-present)“My dependency management tool is better than yours.”

bower

component.js

favorite package: https://www.npmjs.org/package/debowerify

Page 10: Javascript Apps at Build Artifacts

The easiest way to have a 30-minute conversation at a Javascript conference.

We’ve all chosen sides.

• Many Javascript libraries for a web app.• Many dependency managers for libraries.• Build tools that use dependency managers

(written in JS or another language).• Many dependencies of the build tools (that might

use another dependency manager)• Many source languages.• Many different types of target platforms.

Page 11: Javascript Apps at Build Artifacts

“Just the essential libraries”

A single-page Javascript application c. 2014

PagerDuty Mobile, https://m.pagerduty.com

Page 12: Javascript Apps at Build Artifacts

Here’s the ones PagerDuty uses with gulp.

Plugin-ify your JS build tools (2012-present)

Page 13: Javascript Apps at Build Artifacts

When you realize you need to make it work in mobile web views.

Page 14: Javascript Apps at Build Artifacts

A JavaScript apps running in mobile web browsers or embedded in native apps.

The mobile (web) frontier (2007-present)

Page 15: Javascript Apps at Build Artifacts

Put all the things in git (or any VCS)

Attempt #1

• well understood workflow (just commit!)• “easy” mobile builds - git clone to see JS source

• git submodule purgatory (whoops, I forgot!)• merge conflict hell (Pull Requests broken)• compiled, concatenated, transformed code in VCS

(not good)

Good:

Bad:

Page 16: Javascript Apps at Build Artifacts

Some cool kids are doing it.

This is a popular approach for many JS libraries

Page 17: Javascript Apps at Build Artifacts

Well… how about using ?

Attempt #2

• well-understood workflow (npm install FTW)• represents an ideal of JS dependency

management• gives us a way to avoid git submodules and

get *.min.js files out of source control

Page 18: Javascript Apps at Build Artifacts

kudos: npm mentions it in the docs

“The advantage of doing [compilation, transformation, etc] at prepublish time instead of preinstall or install time is that they can be done once, in a single place, and thus greatly reduce complexity and variability. Additionally, this means that:

You can depend on coffee-script as a devDependency, and thus your users don't need to have it installed.”https://www.npmjs.org/doc/misc/npm-scripts.html

Warning! May not do what you expect! https://github.com/npm/npm/search?q=prepublish&ref=cmdform&type=Issues

Page 19: Javascript Apps at Build Artifacts

(Since we were working with private code)

npm module from private github repo

(we cheated and tried to use git)

^ package.json in our XCode project that pulls our JS app code

Page 20: Javascript Apps at Build Artifacts

npm that pulls a package from git didn’t get us all the way there

Sadly…

• we need to check in the transformed JS code

(and css, and HTML)

• we introduce lots of complexity into (native)

builds processes. XCode suddenly needs to

know how to gulp (or grunt).

If we want simple native application build….

If we don’t want to check in transformed code…

Page 21: Javascript Apps at Build Artifacts

Overly simplified misleading diagram.

Is there another way?

Page 22: Javascript Apps at Build Artifacts

build artifact (n) - one of many kinds of tangible by-products produced during the development of software.

Our production JavaScript app looks like a build artifact

Page 23: Javascript Apps at Build Artifacts

Build artifacts are happiest in build artifact repository managers.

The app needs a home

Page 24: Javascript Apps at Build Artifacts

Github Release API as a pseudo-artifact repository

Attempt #3 - success!

• A “release” in GitHub is just a tag and an

collection of binary blobs stored on S3.• API Access Only (need to generate a token).• simplifies native mobile builds (only curl and

unzip required).

Page 25: Javascript Apps at Build Artifacts

Uploading a ZIP archive with a single index.html to GitHub’s Release API

Page 26: Javascript Apps at Build Artifacts

No (gulp||grunt) plugin? Stream-ify it.The node.js streaming API is incredible.

Page 27: Javascript Apps at Build Artifacts

Then, add a build step in XCode/Android Studio that fetches build artifacts

^ Thanks to @alperkokmen

Page 28: Javascript Apps at Build Artifacts

Is there (or should there be) a better tool out there?

It’s a decent option for hybrid apps

* Sonatype Nexus -> NPM bridgehttps://issues.sonatype.org/browse/NEXUS-5852

* Private NPM/“CommonJS Repositories” that are optimized for build artifacts?

* [insert your solution here]

Page 29: Javascript Apps at Build Artifacts

https://pagerduty.com

Thank you.

Clay [email protected]

@smithclay

Don’t check-in *.min.js files please.

http://blog.pagerduty.com/2014/05/reliable-mobile-build/