DEV Community

Cover image for Why we migrated our CLI from NodeJS to GoLang 💻

Why we migrated our CLI from NodeJS to GoLang 💻

Eugene Cheah on March 15, 2019

"Why we" articles are meant share about our engineering considerations and decisions, but it does not mean our decision would be the best for your...
Collapse
 
gijovarghese profile image
Gijo Varghese • Edited

You could use ncc from Zeit to compile NodeJS to a single file

Collapse
 
picocreator profile image
Eugene Cheah

Hmm, ur right should have gave it a try did honestly miss this one 😅

Collapse
 
nickytonline profile image
Nick Taylor • Edited

There's even Zeit's pkg which I believe builds on the work of ncc. It generates a binary so you don't even need node installed.

GitHub logo zeit / pkg

Package your Node.js project into an executable

Disclaimer: pkg was created for use within containers and is not intended for use in serverless environments. For those using ZEIT Now, this means that there is no requirement to use pkg in your projects as the benefits it provides are not applicable to the platform.


Build Status Coverage Status Dependency Status devDependency Status Join the community on Spectrum

This command line interface enables you to package your Node.js project into an executable that can be run even on devices without Node.js installed.

Use Cases

  • Make a commercial version of your application without sources
  • Make a demo/evaluation/trial version of your app without sources
  • Instantly make executables for other platforms (cross-compilation)
  • Make some kind of self-extracting archive or installer
  • No need to install Node.js and npm to run the packaged application
  • No need to download hundreds of files via npm install to deploy your application. Deploy it as a single file
  • Put your assets inside the executable to make it even more portable
  • Test…
Collapse
 
Sloan, the sloth mascot
Comment deleted
Collapse
 
nektro profile image
Meghan (she/her)

Rust seems interesting from an engineering and programming language design point of view, but the syntax is so ugly. I tried, but I can't program in it for longer than a snippet.

Collapse
 
Sloan, the sloth mascot
Comment deleted
 
bobhenkel profile image
Bob Henkel

Rust clicked with me as well, much easier than go. Before that I would say python clicked better with me than Ruby. Just to give some context.

I'm happy to have all of them s an option overall.

Thread Thread
 
nektro profile image
Meghan (she/her)

I share greatly your ending sentiment. While I dislike python and ruby also I’m glad they have enabled so many others.

Collapse
 
jeikabu profile image
jeikabu

I love Rust, and write about it here frequently.
But I would never insinuate its learning curve is anywhere near as forgiving as go's. =)

Collapse
 
qm3ster profile image
Mihail Malo

Came here to say this.
Structured parsing of JSON in Rust is wonderful.

Foiled by golang once again.

Collapse
 
picocreator profile image
Eugene Cheah

Gosh, thats a good idea : worth giving it a spin next time 👍

Collapse
 
rhymes profile image
rhymes

It would be interesting to see a comparison :D

Collapse
 
therealkevinard profile image
Kevin Ard • Edited

The ooooooone point I might argue is zero-dep. I build go for scratch base images all the time. Scratch is literally zero bytes, and only provides /.

As for learning curve... Yes. It's a bit of a beast lol. gofmt helps a lot - intellij, with its auto gofmt helps more.

Dealing with json - especially uncertain json - is... I don't talk about that.

For me, the draw was true cross-compile, and it's sheer perf. If you need quicker than Go, you need C.

I don't need C 😂

Collapse
 
picocreator profile image
Eugene Cheah

😂 and I have met folks who thinks my alpine approach is "hardcore" haha.

And yes I so want go to have a better way to handle uncertain json data.

Collapse
 
pojntfx profile image
Felicitas Pojtinger

BTW of course you can create single binaries with node. Just use pkg or nexe!

Collapse
 
picocreator profile image
Eugene Cheah

Didn't try pkg (should have honestly), nexe did sadly create a large package for us - which is a known issue on their part : they are working on it 😄

Collapse
 
pojntfx profile image
Felicitas Pojtinger

Yeah ... Anyways, Golang is very awesome, although I recently switched back to Node simply for it's simplicity.

Collapse
 
abdurrahmaanj profile image
Abdur-Rahmaan Janhangeer

needs to be saved. btw you did not consider awesome python ...

Collapse
 
picocreator profile image
Eugene Cheah

We actually did, python, ruby, and a few others... they been removed in the article due to the repetition of the reason - which is the end user needing to install an external language library as a dependency before using the CLI (which is mentioned in java and js). Someone in the team even joked about considering PHP (its possible btw)

On another topic : we even considered c and c++, but that might be a bit too difficult for the team to do well without bugs (or overflow vulnerabilities)

One of our benchmarks for example is the ability to run in vanilla alpine.

Collapse
 
abdurrahmaanj profile image
Abdur-Rahmaan Janhangeer

na na you need to study py engineering particularly distribution. XD for distribution you just install your program. companies using py for production, include libs needed etc so that you install it like any other software.

e.g. if flask is needed, they choose a version for in-office use and that lib is shipped across products, they don't pip install or anything online in target env or even in dev

Collapse
 
faizan profile image
Faizan Akram Dar

Why is PHP always a joke

Thread Thread
 
maciek134 profile image
Maciej Sopyło

PHP is by definition a joke :)

Collapse
 
nektro profile image
Meghan (she/her)

python is (unless you're doing ML, which you shouldn't be) not awesome

Collapse
 
abdurrahmaanj profile image
Abdur-Rahmaan Janhangeer • Edited

why? like give more details

Thread Thread
 
nektro profile image
Meghan (she/her)

I personally really dislike the syntax, and the code is inconsistent to what I think it should do. Also, going off your points, does not create a single distributable, has tons of dependencies, version conflicts, and the syntax is compiler enforced.

Thread Thread
 
abdurrahmaanj profile image
Abdur-Rahmaan Janhangeer

version conflicts and dependencies is solved by py companies, not an issue if you use your own version. single exec, pyinstaller has been killing lately but even without single exec, py companies have no problem.

for syntax dislike and enforcement, that is a matter of choice.

industrial-level python is different from casual coding.

Collapse
 
ntrp profile image
Ivan Gregurić Ortolan

What about Java with graalvm native image? Or even node with graalvm native image..

Collapse
 
picocreator profile image
Eugene Cheah • Edited

Never heard of it, but just took a look into.... and holy batman!

While not so comfortable with the way it does things internally. I am impressed, in the crazy sense that they are pushing the idea of compiling programs, not just to exe's but to run within Oracle / My SQL.

Shameless self plug here : its like GPU.JS style of crazy rewrites (of JS to WebGL).... Dun ask why we compile from one language to another which makes no sense... just know it has been done.

Collapse
 
ntrp profile image
Ivan Gregurić Ortolan

The interesting part is that the node execution performance is almost 85% for V8 and GraalVM is still in beta. Hopefully they will manage to reach the same performance and then you could compile you node app into a native one and have no drawbacks. Currently a JAX-RS rest endpoint compiled into native boots in ~5ms and uses 20mb of ram.

Thread Thread
 
qm3ster profile image
Mihail Malo

I like that GraalR runs an order of magnitude faster than the reference R runtime :D

Thread Thread
 
ntrp profile image
Ivan Gregurić Ortolan

I guess R is a scripting language so it makes sense, I expect python to run faster too

Thread Thread
 
qm3ster profile image
Mihail Malo

There's MicroPython :v

Collapse
 
nektro profile image
Meghan (she/her)

public knowledge of what or how to use graal is very low unfortunately..

Collapse
 
jeikabu profile image
jeikabu

The icons at the end could be a winning argument for just about anything.

Collapse
 
sdwarwick profile image
sdwarwick

Java has made major improvements in both language constructs and deployment models in the last few years (9 and 11 in particular). Although go is fun for small projects, and wins the too cool for school award, single file lightweight deployment of java is now an off-the-shelf supported option. See steveperkins.com/using-java-9-modu... for more information.

Note that all single file deployment solutions are still os dependent, go, java, etc. So you still have to maintain multiple build chains.

Interestingly, with the embedded jvm approach, you also enable development in multiple languages, such as kotlin , scala and groovy and still have a single file deployment.

There may be other reasons to reject java, just not so sure it is such an easy call.

Collapse
 
mzedeler profile image
Michael Zedeler

Thanks for a nice article, but I will need to report you to The Society Against Inhumane or Cruel Abuse of Colons

Collapse
 
picocreator profile image
Eugene Cheah • Edited

Gosh you are right : Im guilty as charged : gonna try make some edits to improve that : 😂

Collapse
 
tonymet profile image
Tony Metzidis

How was this sold to your PM?

Collapse
 
lhmzhou profile image
Linda Zhou

Nice reference to physics! My post-read nerd stokedness level: maximally high.