daemonl

In case you were wondering...

My Front End Toolchain

Large Scale Javascript application presents many problems, with many more solutions.

This post will introduce the tools I use to build applications, to build a rather complex but trivial hello world.

In this post:

  • Node.js
  • NPM
  • Bower
  • Less
  • CoffeeScript (update: CoffeeScript sucks. Use ECMA6)

Node.js

Node.js allows you to run JavaScript from the command line. You can even build a whole server in it, but more excitingly, it has allowed Front End developers to build CLI tools, creating a huge ecosystem of excellent build and compile tools which fix the shortfalls of JavaScript.

  • Install it
  • run 'node'
  • Type 1+1, or whatever other function you like

You are now in a JavaScript console similar to the one in Chrome Inspector. Note that 'window' and 'document' are undefined, they are part of the browser API.

Use Ctrl+c twice to exit

Create a test javascript file:

console.log("Hello, World");

And run it with

node hello.js

Note: If 'node' doesn't work, you probably have 'nodejs' instead, which is arguably a better name for it, but you will need to sim-link nodejs to node in your $PATH for NPM to work.

NPM

Similar to apt-get or the Ubuntu Software center (or whatever Windows and Mac people use), NPM is a package manager for Node.js. Packages are written by JavaScript developers, and uploaded to the NPM website, which can then be installed by name.

npm install -g less

Will give you a new command 'lessc', which compiles .less files into css

The -g flag means 'globally', meaning available everywhere. The alternative is a local install, which creates a folder called node_modules in the CWD and installs the project there, this is more useful for libraries you wish to use in projects, but does not install executables into your path. e.g. grunt

If you get a permissions issue with npm... well it's a long story. See the docs

Personally I'm not keen on the documented way, it creates a potential security hole, but that's an unsolved problem

For project dependencies, NPM's control file is a 'package.json' file, which belongs in the root of your project, usually a git or hg repo

Make sure you .gitignore the node_modules folder

npm init

creates a package.json file, after asking many questions

npm install bower --save-dev

appends bower to the dev depends section of the package.json file

NPM dependencies can be either production or development, since we are only using node.js to create a web FE project, the distinction doesn't really make sense, so it doesn't really matter which you use

Bower

Bower is similar to NPM, with more of a focus on Front End libraries like Bootstrap, jquery etc

Bower does not have a global install option, it is all about installing local dependencies into the bower_components folder

You will want to .gitignore your bower_components directory

To get bower:

npm install -g bower

Then you can install local bower components, just like NPM

bower install jquery

You now have a bower_components folder with jquery in it, which you could include using a script tag in your HTML (But later we will use require.js for that)

Bower's control file is bower.json

bower init

will ask you many questions, and create a bower.json file

bower install --save jquery

will append jquery as a dependency in the bower.json file (and install it).

bower install

Installs all dependencies mentioned in the bower.json file, useful after cloning a repo

Less

Less is a 'compiles to css' language, I love it because a valid CSS file is also a valid Less file, that is, less is an extension on css, not a re-write.

I wrote on Less previously /2012/09/tools-of-trade-1-less-css.html The Docs: http://lesscss.org/

Create a file called less/main.less

@bg-color: #f00;
body {
    background: @bg-color;
}
lessc less/main.less
body {
    background: #ff0000;
}

To save it as a CSS file, pipe the output to main.css

lessc less/main.less > main.css

CoffeeScript

CoffeeScript takes the 'good parts' of JavaScript, and wraps them in a funky syntax.

I'm not as keen on CoffeeScript as I am on ES6 (with Babel), as ES6 has the advantage of less: Valid JS is valid ES6 - but I have a huge codebase in coffee already

npm install -g coffeescript

Create a new file called 'hello2.coffee'

console.log "Hello, World"

And run it with

coffee hello2.coffee

The coffee command can run coffeescript files directly

coffee -c hello2.coffee

Then have a look at the new file hello2.js

// Generated by CoffeeScript 1.9.3
(function() {
  console.log("Hello, World");

}).call(this);