How to write a command line application in Node.js
blog.liangzan.net
blog.liangzan.net
You also get to bring node's parallel io-centric patterns to your scripting. Need to download a bunch of files from a remote host, process them, and write them to disk? Go for it.
But take it with a grain of salt: it's very much a use-what-you-know kind of thing.
cat urls.txt | while read -r url; do
base="$(basename "$url")"
wget "$url" -O - -o "$base.log" | process > "$base" &
done
wait
For ad-hoc scripting, I tend to prefer bash, with anything remotely corresponding to heavy lifting assigned to the language with the best library / performance / whatever critical factor for it. Fork-join parallelism in bash is very easy. [enlive "1.1.1"]
instead of <dependency>
<groupId>enlive</groupId>
<artifactId>enlive</artifactId>
<version>1.1.1</version>
</dependency>If you want to write in C for performance reasons, go ahead. But if your other alternatives are Python or Ruby and you already know JS, give node a go -- it's pretty fun.
However, today there is more diversity in the JavaScript developer community. For example, Yehuda Katz is both a server-side (Rails) team member and client-side (JQuery, Ember) developer. Also, system engineers have begun working in JS. The Meteor team is a good example of system engineers working on JS.
Node is best used managing parallel streams of stuff. Perhaps surprisingly, a command line application is a great example of that.
I would much rather build a nontrivial command line app in node than in anything else. Try it, you'll see.
If you need that, there are only a handful of choices and node is one of them.
I'm not really arguing against using JavaScript for command-line interfaces. I'd much rather see that than the same in PHP, and if the programmers don't know Perl, Python or Ruby, then why not? We're talking about an area where there are still way to many hacks that consist of badly written bash scripts with lots of inline sed and awk...
People don't use node for the Javascript. They use it for the modules, and node is the glue that coheres them (and does an admirable job at that).
When you're comparing writing a CLI app in node to writing it in something else, it's a world of difference, and that difference is npm. With good modules, writing a CLI app has little to do with Javascript -- you're more specifying config and flow by passing some options and streams around, and you're done.
CPAN modules must provide POD documentation, must provide a regression test, and must run on several dozen platforms before PAUSE accepts to publish it on CPAN.
Python or Ruby modules, or my favorite Lua, are a bunch of junk compared to CPAN.
If a person already knows JavaScript well, then it will be easier for them to write a CLI app/utility/script in JS than it would be to write a shell script.
Another reason to write in JS would be to gain code reuse. If the person has a web app that uses node, then they can share code between the web and CLI applications.
> Another reason to write in JS would be to gain code reuse.
> If the person has a web app that uses node, then they can
> share code between the web and CLI applications.
I often see this argument presented for just about any server side js. I often wonder about actual real world reuse though.I share code between the client and server. For example, I have data type checks where I reuse the same library and the same application specific code on both the client and server.
I expose substantial portions of my server-side code via the command line. I also frequently call shell scripts from node as there are certain things I find easier to write in a shell script.
That said, I don't know if this amount of reuse is typical. And, code reuse is clearly not the only consideration.
I wrote a database specifically for web browsers and someone case along and write a relatively small pull request and it now works in node / on the server / with a http api - http://pouchdb.com
For raw access to your MySQL database, the gem 'mysql2' is preferred (github with a simple tutorial: https://github.com/brianmario/mysql2).
mysql2 seems to have taken it's interface design from Perl's DBI, which is cool if you're used to that but might feel a little foreign.
If you'd like something that gives you a little more help, or there's substantial business logic in your script, take a look at ActiveRecord. This StackOverflow question (http://stackoverflow.com/questions/16683903/sinatra-mysql-an...) has a nice example of how you might set up your script to use AR.
My email's in my profile if you'd like any future help.
imho, node as command line makes even less sense then Smalltalk, Java or Mono. Those are heavy weight languages that have no place in interactive commandline scripting.
Better choices are the classical languages like Perl or Python, and Lua or awk has even less startup costs.
It's fast enough, and low-overhead enough, that I don't notice any overhead when running my Node.js build scripts. And really, that's all that matters.
Out of curiosity, I wrote a little script to test it:
#!/usr/local/bin/node
console.log(process.memoryUsage());
And here's the output (memory usage is in bytes): jshore$ time ./deleteme.js
{ rss: 12660736, heapTotal: 4083456, heapUsed: 2131864 }
real 0m0.055s
user 0m0.043s
sys 0m0.011sEDIT: Ok, just went through the nodejs api, they have cover a lot of ground now :)
can be as simple than that? the right tool for the job..
if i would create a library that everyone could use and embed i would use C for that..
if i would like to build a VM, a compiler, a browser or a OS i would use c++ (is almost c, fast and gives you easy composability and control)
i would use javascript.. but only in the browser and because and dont have nowhere to go or to runaway for.. (no transpiling either please)
this is just the general experience of my years of coding and deling with every lang in the earth.. rsrs
ruby is pretty, eyecandy, bu is like a virgen that cant be touched.. python looks just like perl.. is a complete mess, and is like the mafia,i prefer not to touch or to have any involvement with them.. java is the frankenstein child of c++.. you can create big software with it.. but to many keywords and excessive use of vtables..
and for ui and web, network, etc.. i would use something like dart for this job, any day.. the code can grow and you can still understand your code
so these days i would use c, c++, go or dart.. in the case i can choose of course.. :)
The diversity of programming languages is due in part to the fact that developers enjoy looking at old problems from new angles. Doing so lets us to make creative re-use of libraries and practices that were invented to solve disparate problems, and good things invariably result.
Node.js is a staggering example, but every language you mentioned has its strengths.
experimentation is good! it make us have more of the good ideas.. sure! go and create a command line application in node.. nobody will forbid you to do that, its not a sin..
i would do it.. but theres a difference between whats fun and what works.. one thing i take my hat of for all dinamic languages like ruby, javascript and even python, is that they want to make the experience of creating software fun, and more pleaseant.. this is cool
but the answer its in the balance, thats something i respect about go and dart.. the idea to mix fun and pragmatism so we can have both.. maybe better things can come in the future.. and we should all thank dinamic language for that..
javascript did not achieve the nirvana yet.. its like a duck.. it can walk? sure. it can fly? sure. it can swim? yes.. but can do it good any of those things? nop
A package manager with no concept of package versioning, unlike every other major languages' managers.
This is a complete deal breaker for some / many (choose as appropriate).
The idea of "Just track original master or make your own fork if you want a specific version" is insane when all the others seem to be able to do dependency resolution.
> ruby is pretty, eyecandy, bu is like a virgen that cant be touched
Which, even compared to the dismissals of the other languages, makes no sense.