I’m neck deep in learning ES6, React, Typescript, Node and all the billions of pieces that are a part of this “ecosystem”. I think I’m going to post some of the things that I learn along the way here.
Most of it will probably be obvious if you’ve been working with these technologies for a while, though I assumed a lot of what I was trying to do would be easily discoverable online. Maybe I just need to take some Google lessons.
I’m not sure how most of the JavaScript world is building, packaging, and deploying their applications. We’re using Yarn instead of npm, but neither tool provides a simple way to zip up and version your app (unless you’re publishing to npm, that is).
Here’s what worked for me (based on Yarn 1.15.2). As with everything I post, If there are better ways, please tell me.
Install cross-var to support consistent variable usage in package.json across Windows and Mac.
yarn add cross-var
Install bestzip to support cross-platform packaging.
yarn add bestzip
Install copyfiles to support cross-platform, configurable file copying.
yarn add copyfiles
Create a script in package.json for compiling TypeScript to JavaScript
"build:ts": "tsc"
Create a script in package.json for copying the compiled files to a /dist directory
"copy": "copyfiles -a -e \"**/*.ts\" -u 1 \"src/**/*.*\" dist"
Create a script in package.json for packing up the source and dependent node_modules
Notice the $npm_* variables? Apparently you can use any variable defined in package.json within package.json. You just need cross-var to consistently access them.
That ended up being it. Here is a redacted package.json that I’m using:
{ "name": "Nick Korbel Demo", "version": "0.1.0", "description": "The demo for packaging", "private": true, "main": "dist/index.js", "scripts": { "build:ts": "tsc", "copy": "copyfiles -a -e \"/.ts\" -e \"/.spec.js\" -e \"/.log\" -u 1 \"src//.\" dist", "start": "node ./dist/index.js", "package": "cross-var bestzip $npm_package_name-$npm_package_version.zip dist/ node_modules/* package.json" }, … more stuff here like dependencies
This post is part of a series I’m writing to share what I’m learning