The right tools for the job
Web applications can be compared to buildings; without tools, neither would be a pleasure to build. This makes tools an indispensable factor in both development and construction. When tools are combined, they form a workflow that can be repeated across any project built with the same stack, facilitating the practices of design, development, and deployment. The argument can be made that it is just as paramount to document workflow as an application's source code or API.
Along with grouping tools into categories based on the phases of building applications, it is also useful to group tools based on the opinions of a respective project—in our case, Angular, Ionic, and Firebase. I call tools grouped into opinionated workflows tool stacks. For example, the remainder of this chapter discusses the tool stack used to build the application that we will deploy across environments in this book. In contrast, if you were to build a Ruby on Rails application, the tool stack would be completely different because the project's opinions are different. Our app is called krakn, and it functions as a real-time chat application built on top of the opinions of Angular, the Ionic Framework, and Firebase.
Tip
You can find all of krakn's source code at github.com/zachmoreno/krakn.
Version control with Git and GitHub
Git is a command-line interface (CLI) developed by Linus Torvalds, to use on the famed Linux kernel. Git is mostly popular due to its distributed architecture making it nearly impossible for corruption to occur. Git's distributed architecture means that any remote repository has all of the same information as your local repository. It is useful to think of Git as a free insurance policy for my code.
You will need to install Git using the instructions provided at www.git-scm.com/book/en/Getting-Started-Installing-Git for your development workstation's operating system.
www.GitHub.com has played a notable role in Git's popularization, turning its functionality into a social network focused on open source code contributions. With a pricing model that incentivizes Open Source contributions and licensing for private, GitHub elevated the use of Git to heights never seen before.
If you don't already have an account on GitHub, now is the perfect time to visit www.github.com to provision a free account. I mentioned earlier that krakn's code is available for forking at www.github.com/zachmoreno/krakn. This means that any person with a GitHub account has the ability to view my version of krakn, and clone a copy of their own for further modifications or contributions. In GitHub's web application, forking manifests itself as a button located to the right of the repository's title, which in this case is ZachMoreno/krakn
. When you click on the button, you will see an animation that simulates the hardcore forking action. This results in a cloned repository under your account that will have a title to the tune of YourName/krakn
.
Node.js
Node.js, commonly known as Node, is a community-driven server environment built on Google Chrome's V8 JavaScript runtime that is entirely event driven and facilitates a nonblocking I/O model. According to www.nodejs.org, it is best suited for:
"Data-intensive real-time applications that run across distributed devices."
So what does all this boil down to? Node empowers web developers to write JavaScript both on the client and server with bidirectional real-time I/O. The advent of Node has empowered developers to take their skills from the client to the server, evolving from frontend to full stack (like a caterpillar evolving into a butterfly). Not only do these skills facilitate a pay increase, they also advance the Web towards the same functionality as the traditional desktop or native application.
For our purposes, we use Node as a tool; a tool to build real-time applications in the fewest number of keystrokes, videos watched, and words read as possible. Node is, in fact, a modular tool through its extensible package interface, called Node Package Manager (NPM). You will use NPM as a means to install the remainder of our tool stack.
NPM
The NPM is a means to install Node packages on your local or remote server. NPM is how we will install the majority of the tools and software used in this book. This is achieved by running the $ npm install –g [PackageName]
command in your command line or terminal. To search the full list of Node packages, visit www.npmjs.org or run $ npm search [Search Term]
in your command line or terminal as shown in the following screenshot:
Yeoman's workflow
Yeoman is a CLI that is the glue that holds your tools into your opinionated workflow. Although the term opinionated might sound off-putting, you must first consider the wisdom and experience of the developers and community before you who maintain Yeoman. In this context, opinionated means a little more than a collection of the best practices that are all aimed at improving your developer's experience of building static websites, single page applications, and everything in between. Opinionated does not mean that you are locked into what someone else feels is best for you, nor does it mean that you must strictly adhere to the opinions or best practices included. Yeoman is general enough to help you build nearly anything for the Web as well as improving your workflow while developing it. The tools that make up Yeoman's workflow are Yo, Grunt.js, Bower, and a few others that are more-or-less optional, but are probably worth your time.
Yo
Apart from having one of the hippest namespaces, Yo is a powerful code generator that is intelligent enough to scaffold most sites and applications. By default, instantiating a yo
command assumes that you mean to scaffold something at a project level, but yo
can also be scoped more granularly by means of sub-generators. For example, the command for instantiating a new vanilla Angular project is as follows:
$ yo angular radicalApp
Yo will not finish your request until you provide some further information about your desired Angular project. This is achieved by asking you a series of relevant questions, and based on your answers, yo
will scaffold a familiar application folder/file structure, along with all the boilerplate code. Note that if you have worked with the angular-seed project, then the Angular application that yo
generates will look very familiar to you. Once you have an Angular app scaffolded, you can begin using sub-generator commands. The following command scaffolds a new route, radicalRoute
, within radicalApp
:
$ yo angular:route radicalRoute
The :route
sub-generator is a very powerful command, as it automates all of the following key tasks:
- It creates a new file,
radicalApp/scripts/controllers/radicalRoute.js
, that contains the controller logic for theradicalRoute
view - It creates another new file,
radicalApp/views/radicalRoute.html
, that contains the associated view markup and directives - Lastly, it adds an additional route within,
radicalApp/scripts/app.js
, that connects the view to the controller
Additionally, the sub-generators for yo angular
include the following:
:controller :directive :filter :service :provider :factory :value :constant :decorator :view
All the sub-generators allow you to execute finer detailed commands for scaffolding smaller components when compared to :route
, which executes a combination of sub-generators.
Installing Yo
Within your workstation's terminal or command-line application type, insert the following command, followed by a return:
$ npm install -g yo
Tip
If you are a Linux or Mac user, you might want to prefix the command with sudo
, as follows:
$ sudo npm install –g yo
Grunt
Grunt.js is a task runner that enhances your existing and/or Yeoman's workflow by automating repetitive tasks. Each time you generate a new project with yo
, it creates a /Gruntfile.js
file that wires up all of the curated tasks. You might have noticed that installing Yo also installs all of Yo's dependencies. Reading through /Gruntfile.js
should incite a fair amount of awe, as it gives you a snapshot of what is going on under the hood of Yeoman's curated Grunt tasks and its dependencies.
Generating a vanilla Angular app produces a /Gruntfile.js
file, as it is responsible for performing the following tasks:
- It defines where Yo places Bower packages, which is covered in the next section
- It defines the path where the
grunt build
command places the production-ready code - It initializes the watch task to run:
- JSHint when JavaScript files are saved
- Karma's test runner when JavaScript files are saved
- Compass when SCSS or SASS files are saved
- The saved
/Gruntfile.js
file
- It initializes LiveReload when any HTML or CSS files are saved
- It configures the
grunt server
command to run a Node.js server onlocalhost:9000
, or to show test results onlocalhost:9001
- It autoprefixes CSS rules on LiveReload and
grunt build
- It renames files for optimizing browser caching
- It configures the
grunt build
command to minify images, SVG, HTML, and CSS files or to safely minify Angular files
Let us pause for a moment to reflect on the amount of time it would take to find, learn, and implement each dependency into our existing workflow for each project we undertake. Ok, we should now have a greater appreciation for Yeoman and its community.
For the vast majority of the time, you will likely only use a few Grunt commands, which include the following:
$ grunt server $ grunt test $ grunt build
Bower
If Yo scaffolds our application's structure and files, and Grunt automates repetitive tasks for us, then what does Bower bring to the party? Bower is web development's missing package manager. Its functionality parallels that of Ruby Gems for the Ruby on Rails MVC framework, but is not limited to any single framework or technology stack. The explicit use of Bower is not required by the Yeoman workflow, but as I mentioned previously, the use of Bower is configured automatically for you in your project's /Gruntfile.js
file.
How does managing packages improve our development workflow? With all of the time we've been spending in our command lines and terminals, it is handy to have the ability to automate the management of third-party dependencies within our application. This ability manifests itself in a few simple commands, the most ubiquitous being the following command:
$ bower install [PackageName] --save
With this command, Bower will automate the following steps:
- First, search its packages for the specified package name
- Download the latest stable version of the package if found
- Move the package to the location defined in your project's
/Gruntfile.js
file, typically a folder named/bower_components
- Insert dependencies in the form of
<link>
elements for CSS files in the document's<head>
element, and<script>
elements for JavaScript files right above the document's closing</body>
tag, to the package's files within your project's/index.html
file
This process is one that web developers are more than familiar with because adding a JavaScript library or new dependency happens multiple times within every project. Bower speeds up our existing manual process through automation and improves it by providing the latest stable version of a package and then notifying us of an update if one is available. This last part, "notifying us of an update if … available", is important because as a web developer advances from one project to the next, it is easy to overlook keeping dependencies as up to date as possible. This is achieved by running the following command:
$ bower update
This command returns all the available updates, if available, and will go through the same process of inserting new references where applicable.
Bower.io includes all of the documentation on how to use Bower to its fullest potential along with the ability to search through all of the available Bower packages.
Tip
Searching for available Bower packages can also be achieved by running the following command:
$ bower search [SearchTerm]
If you cannot find the specific dependency for which you search, and the project is on GitHub, consider contributing a bower.json
file to the project's root and inviting the owner to register it by running the following command:
$ bower register [ThePackageName] [GitEndpoint]
Registration allows you to install your dependency by running the next command:
$ bower install [ThePackageName]
The Ionic framework
The Ionic framework is a truly remarkable advancement in bridging the gap between web applications and native mobile applications. In some ways, Ionic parallels Yeoman where it assembles tools that were already available to developers into a neat package, and structures a workflow around them, inherently improving our experience as developers.
If Ionic is analogous to Yeoman, then what are the tools that make up Ionic's workflow? The tools that, when combined, make Ionic noteworthy are Apache Cordova, Angular, Ionic's suite of Angular directives, and Ionic's mobile UI framework.
Batarang
An invaluable piece to our Angular tool stack is the Google Chrome Developer Tools extension, Batarang, by Brian Ford. Batarang adds a third-party panel (on the right-hand side of Console) to DevTools that facilitates Angular's specific inspection in the event of debugging. We can view data in the scopes of each model, analyze each expression's performance, and view a beautiful visualization of service dependencies all from within Batarang. Because Angular augments the DOM with ng-
attributes, it also provides a Properties pane within the Elements panel, to inspect the models attached to a given element's scope. The extension is easy to install from either the Chrome Web Store or the project's GitHub repository and inspection can be enabled by performing the following steps:
- Firstly, open the Chrome Developer Tools.
- You should then navigate to the AngularJS panel.
- Finally, select the Enable checkbox on the far right tab.
Your active Chrome tab will then be reloaded automatically, and the AngularJS panel will begin populating the inspection data. In addition, you can leverage the Angular pane with the Elements panel to view Angular-specific properties at an elemental level, and observe the $scope
variable from within the Console panel.
Sublime Text and Editor integration
While developing any Angular app, it is helpful to augment our workflow further with Angular-specific syntax completion, snippets, go to definition, and quick panel search in the form of a Sublime Text package. Perform the following steps:
- If you haven't installed Sublime Text already, you need to first install Package Control. Otherwise, continue with the next step.
- Once installed, press command + Shift + P in Sublime.
- Then, you need to select the Package Control: Install Package option.
- Finally, type
angularjs
and press Enter on your keyboard.
In addition to support within Sublime, Angular enhancements exist for lots of popular editors, including WebStorm, Coda, and TextMate.