2016-02-06 02:27:06 -05:00
|
|
|
include _util-fns
|
2016-02-12 20:54:22 -05:00
|
|
|
|
2015-11-10 13:31:46 -05:00
|
|
|
:marked
|
2016-02-12 20:54:22 -05:00
|
|
|
Our QuickStart goal is to build and run a super-simple Angular 2 application in TypeScript.
|
2015-10-14 23:25:19 -04:00
|
|
|
|
2016-03-13 15:50:50 -04:00
|
|
|
# Download the code
|
2016-03-30 11:50:02 -04:00
|
|
|
In a hurry?
|
2016-03-14 17:52:07 -04:00
|
|
|
[Download the QuickStart source](https://github.com/angular/quickstart/blob/master/README.md)
|
2016-03-13 15:50:50 -04:00
|
|
|
and start coding.
|
|
|
|
|
|
|
|
# See it run
|
2015-10-14 23:25:19 -04:00
|
|
|
|
2016-02-12 20:54:22 -05:00
|
|
|
Try this <a href="/resources/live-examples/quickstart/ts/plnkr.html" target="_blank">live example</a>
|
|
|
|
which loads the sample app in <a href="http://plnkr.co/" title="Plunker" target="_blank">plunker</a>
|
2015-12-10 21:29:14 -05:00
|
|
|
and displays a simple message:
|
2015-10-14 23:25:19 -04:00
|
|
|
|
2015-12-10 21:29:14 -05:00
|
|
|
figure.image-display
|
2016-02-12 20:54:22 -05:00
|
|
|
img(src='/resources/images/devguide/quickstart/my-first-app.png' alt="Output of QuickStart app")
|
2016-03-13 15:50:50 -04:00
|
|
|
|
2015-12-10 21:29:14 -05:00
|
|
|
:marked
|
2016-03-13 15:50:50 -04:00
|
|
|
# Learn
|
2016-02-12 20:54:22 -05:00
|
|
|
Of course we don't build apps to run in plunker.
|
|
|
|
The following steps establish a development environment for the documentation samples
|
|
|
|
that also can be the foundation for our real world applications. At a high level, we will
|
2015-12-10 21:29:14 -05:00
|
|
|
|
2016-02-12 20:54:22 -05:00
|
|
|
- set up the [development environment](#devenv)
|
|
|
|
- write the app's Angular [root component](#component)
|
|
|
|
- write [main.ts](#main) which tells Angular to display the root component
|
|
|
|
- write the [host web page](#index) (`index.html`)
|
|
|
|
|
2015-12-10 21:29:14 -05:00
|
|
|
.l-sub-section
|
|
|
|
:marked
|
2016-02-12 20:54:22 -05:00
|
|
|
We'll see many code blocks as we pursue this agenda. They're all easy to copy and paste:
|
|
|
|
code-example(format='.', language='html').
|
|
|
|
Click the glyph on the right to copy code snippets to the clipboard ⇨⇨⇨⇨⇨⇨⇨⇨⇨⇨
|
2015-12-10 21:29:14 -05:00
|
|
|
|
2016-02-12 20:54:22 -05:00
|
|
|
button(class="verbose off md-primary md-button md-ink-ripple", type="button", onclick="verbose(false)").
|
|
|
|
Hide explanations
|
|
|
|
button(class="verbose on md-primary md-button md-ink-ripple", type="button", onclick="verbose(true)").
|
|
|
|
View explanations
|
|
|
|
.l-verbose-section
|
|
|
|
:marked
|
|
|
|
*Explanations* describe the concepts and reasons behind the instructions.
|
|
|
|
Explanations have a thin border on the left like *this* block of text.
|
|
|
|
|
|
|
|
Click *Hide Explanations* to show only the instructions.
|
|
|
|
Click it again to see everything again.
|
2015-10-14 23:25:19 -04:00
|
|
|
|
2016-02-12 20:54:22 -05:00
|
|
|
a(id="devenv")
|
2015-10-16 00:51:13 -04:00
|
|
|
.l-main-section
|
2015-12-10 21:29:14 -05:00
|
|
|
:marked
|
|
|
|
## Development Environment
|
|
|
|
|
2016-02-17 22:31:42 -05:00
|
|
|
We need to set up our development environment:
|
|
|
|
* install node and npm
|
|
|
|
* create an [application project folder](#app-folder)
|
|
|
|
* add a [tsconfig.json](#tsconfig) to guide the TypeScript compiler
|
|
|
|
* add a [typings.json](#typings) that identifies missing TypeScript definition files
|
|
|
|
* add a [package.json](#package-json) that defines the packages and scripts we need
|
2016-05-03 11:43:03 -04:00
|
|
|
* add a [systemjs.config.js](#systemjs) that configures system.js
|
2016-02-17 22:31:42 -05:00
|
|
|
* install the npm packages and typings files
|
|
|
|
|
|
|
|
a(id="install-npm")
|
|
|
|
:marked
|
|
|
|
**Install [node and npm](https://nodejs.org/en/download/)** if not already on your machine.
|
|
|
|
|
2016-02-12 20:54:22 -05:00
|
|
|
a(id="app-folder")
|
|
|
|
:marked
|
|
|
|
Create a **new project folder**
|
2015-12-10 21:29:14 -05:00
|
|
|
code-example(format="").
|
|
|
|
mkdir angular2-quickstart
|
|
|
|
cd angular2-quickstart
|
2016-02-17 22:31:42 -05:00
|
|
|
|
2016-02-12 20:54:22 -05:00
|
|
|
a(id="tsconfig")
|
|
|
|
:marked
|
2016-02-11 18:08:06 -05:00
|
|
|
Add a **tsconfig.json** file to the project folder and copy/paste the following:
|
|
|
|
+makeJson('quickstart/ts/tsconfig.1.json', null, 'tsconfig.json')(format=".")
|
2016-02-12 20:54:22 -05:00
|
|
|
|
2016-02-11 18:08:06 -05:00
|
|
|
:marked
|
2016-02-12 20:54:22 -05:00
|
|
|
This `tsconfig.json` file guides the TypeScript compiler.
|
|
|
|
Learn more about it in the
|
|
|
|
<a href="guide/typescript-configuration.html#tsconfig" target="_blank">TypeScript Configuration</a> chapter.
|
2016-02-11 18:08:06 -05:00
|
|
|
|
2016-02-12 20:54:22 -05:00
|
|
|
a(id="typings")
|
|
|
|
:marked
|
2016-02-11 18:08:06 -05:00
|
|
|
Add a **typings.json** file to the project folder and copy/paste the following:
|
|
|
|
+makeJson('quickstart/ts/typings.1.json', null, 'typings.json')(format=".")
|
2016-04-13 13:20:51 -04:00
|
|
|
|
2016-02-12 20:54:22 -05:00
|
|
|
.l-verbose-section
|
2015-11-10 13:31:46 -05:00
|
|
|
:marked
|
2016-02-12 20:54:22 -05:00
|
|
|
Many JavaScript libraries extend the JavaScript environment with features and syntax
|
|
|
|
that the TypeScript compiler doesn't recognize natively. We teach it about these capabilities with
|
2016-05-03 04:02:37 -04:00
|
|
|
<a href="http://www.typescriptlang.org/docs/handbook/writing-declaration-files.html" target="_blank">TypeScript type definition files</a>
|
2016-02-12 20:54:22 -05:00
|
|
|
— *d.ts files* — which we identify in a `typings.json` file.
|
|
|
|
|
|
|
|
We go a little deeper into *typings* in the
|
|
|
|
<a href="guide/typescript-configuration.html#typings" target="_blank">TypeScript Configuration</a> chapter.
|
|
|
|
|
|
|
|
a(id="package-json")
|
2015-12-10 21:29:14 -05:00
|
|
|
:marked
|
|
|
|
Add a **package.json** file to the project folder and copy/paste the following:
|
2016-02-12 20:54:22 -05:00
|
|
|
+makeJson('quickstart/ts/package.1.json', null, 'package.json')(format=".")
|
|
|
|
|
|
|
|
.l-verbose-section
|
|
|
|
:marked
|
|
|
|
### Adding the libraries we need with *npm*
|
|
|
|
Angular application developers rely on the <a href="https://docs.npmjs.com/" target="_blank"><i>npm</i></a>
|
2016-02-17 22:31:42 -05:00
|
|
|
package manager to install the libraries their apps require.
|
2016-02-12 20:54:22 -05:00
|
|
|
The Angular team recommends the starter-set of packages specified in the `dependencies` and `devDependencies`
|
2016-02-17 22:31:42 -05:00
|
|
|
sections.
|
|
|
|
See the [npm packages](guide/npm-packages.html) chapter for details.
|
|
|
|
|
|
|
|
### Helpful scripts
|
|
|
|
We've included a number of npm scripts in our suggested `package.json` to handle common development tasks:
|
2016-02-12 20:54:22 -05:00
|
|
|
+makeJson('quickstart/ts/package.1.json',{ paths: 'scripts'}, 'package.json (scripts)')(format=".")
|
|
|
|
|
|
|
|
:marked
|
|
|
|
We execute most npm scripts in the following way: `npm run` + *script-name*.
|
2016-05-03 17:54:54 -04:00
|
|
|
Some commands (such as `start`) don't require the `run` keyword.
|
2016-02-12 20:54:22 -05:00
|
|
|
|
|
|
|
Here's what these scripts do:
|
|
|
|
|
2016-03-12 14:46:47 -05:00
|
|
|
* `npm start` - runs the compiler and a server at the same time, both in "watch mode"
|
2016-02-12 20:54:22 -05:00
|
|
|
|
2016-03-12 14:46:47 -05:00
|
|
|
* `npm run tsc` - runs the TypeScript compiler once
|
2016-02-12 20:54:22 -05:00
|
|
|
|
2016-03-12 14:46:47 -05:00
|
|
|
* `npm run tsc:w` - runs the TypeScript compiler in watch mode;
|
|
|
|
the process keeps running, awaiting changes to TypeScript files and re-compiling when it sees them
|
2016-02-12 20:54:22 -05:00
|
|
|
|
2016-03-12 14:46:47 -05:00
|
|
|
* `npm run lite` - runs the <a href="https://www.npmjs.com/package/lite-server" target="_blank">lite-server</a>,
|
|
|
|
a light-weight, static file server with excellent support for Angular apps that use routing
|
2016-02-12 20:54:22 -05:00
|
|
|
|
2016-05-11 01:15:51 -04:00
|
|
|
* `npm run typings` - runs the [*typings* tool](#typings) separately
|
2016-02-12 20:54:22 -05:00
|
|
|
|
2016-03-12 14:46:47 -05:00
|
|
|
* `npm run postinstall` - called by *npm* automatically *after* it successfully completes package installation.
|
|
|
|
This script installs the [TypeScript definition files](#typings) defined in `typings.json`
|
2016-02-12 20:54:22 -05:00
|
|
|
|
2016-02-17 22:31:42 -05:00
|
|
|
:marked
|
|
|
|
**Install these packages** by entering the following *npm* command in a terminal window (command window in Windows):
|
|
|
|
code-example(format="").
|
|
|
|
npm install
|
|
|
|
|
|
|
|
.alert.is-important
|
|
|
|
:marked
|
|
|
|
Scary <span style="color:red; font-weight: bold">error messages in red</span> may appear **during** install.
|
|
|
|
The install typically recovers from these errors and finishes successfully.
|
|
|
|
.l-verbose-section(class="l-verbose-inherit")
|
|
|
|
:marked
|
|
|
|
#### npm errors and warnings
|
|
|
|
|
|
|
|
All is well if there are no console messages starting with `npm ERR!` *at the end* of **npm install**.
|
|
|
|
There might be a few `npm WARN` messages along the way — and that is perfectly fine.
|
|
|
|
|
|
|
|
We often see an `npm WARN` message after a series of `gyp ERR!` messages.
|
|
|
|
Ignore them. A package may try to re-compile itself using `node-gyp`.
|
|
|
|
If the re-compile fails, the package recovers (typically with a pre-built version)
|
|
|
|
and everything works.
|
|
|
|
|
|
|
|
Just make sure there are no `npm ERR!` messages at the end of `npm install`.
|
|
|
|
|
2015-12-10 21:29:14 -05:00
|
|
|
:marked
|
|
|
|
**We're all set.** Let's write some code.
|
2015-08-08 16:55:53 -04:00
|
|
|
|
2016-02-12 20:54:22 -05:00
|
|
|
|
|
|
|
a(id="component")
|
2015-10-14 23:25:19 -04:00
|
|
|
.l-main-section
|
2015-12-10 21:29:14 -05:00
|
|
|
:marked
|
|
|
|
## Our First Angular Component
|
2016-02-12 20:54:22 -05:00
|
|
|
Let's create a folder to hold our application and add a super-simple Angular component.
|
|
|
|
|
|
|
|
**Create an *app* sub-folder** off the root directory and make it the current directory
|
2015-12-10 21:29:14 -05:00
|
|
|
code-example(format="").
|
|
|
|
mkdir app
|
|
|
|
cd app
|
2016-02-12 20:54:22 -05:00
|
|
|
|
|
|
|
a(id="app-component")
|
2015-12-10 21:29:14 -05:00
|
|
|
:marked
|
2016-02-12 20:54:22 -05:00
|
|
|
**Add a component file** named *app.component.ts* and paste the following lines:
|
2015-12-10 21:29:14 -05:00
|
|
|
+makeExample('quickstart/ts/app/app.component.ts', null, 'app/app.component.ts')(format=".")
|
|
|
|
|
2016-02-12 20:54:22 -05:00
|
|
|
.l-verbose-section
|
|
|
|
:marked
|
|
|
|
### AppComponent is the root of the application
|
|
|
|
|
|
|
|
Every Angular app has at least one root component, conventionally named `AppComponent`,
|
|
|
|
that hosts the client user experience.
|
|
|
|
|
|
|
|
Components are the basic building blocks of Angular applications.
|
|
|
|
A component controls a portion of the screen — a *view* — through its associated template.
|
2015-12-14 18:44:50 -05:00
|
|
|
|
2016-02-12 20:54:22 -05:00
|
|
|
This QuickStart has only one, extremely simple component.
|
|
|
|
But it has the essential structure of every component we'll ever write:
|
|
|
|
|
|
|
|
* One or more <a href="javascript: why('component-import')">import</a>
|
|
|
|
statements to reference the things we need.
|
|
|
|
|
|
|
|
* A <a href="javascript: why('decorator')">@Component decorator</a>
|
|
|
|
that tells Angular what template to use and how to create the component.
|
|
|
|
|
|
|
|
* A <a href="javascript: why('class')">component class</a>
|
|
|
|
that controls the appearance and behavior of a view through its template.
|
|
|
|
|
|
|
|
a(id="component-import")
|
|
|
|
:marked
|
|
|
|
### Import
|
2015-10-14 23:25:19 -04:00
|
|
|
|
2016-02-12 20:54:22 -05:00
|
|
|
Angular apps are modular. They consist of many files each dedicated to a purpose.
|
|
|
|
|
|
|
|
Angular itself is modular. It is a collection of library modules
|
|
|
|
each made up of several, related features that we'll use to build our application.
|
|
|
|
|
|
|
|
When we need something from a module, we import it.
|
2016-04-27 14:28:22 -04:00
|
|
|
Here we import the Angular `Component` decorator function from
|
|
|
|
`@angular/core` because we need it to define our component.
|
2016-02-12 20:54:22 -05:00
|
|
|
+makeExample('quickstart/ts/app/app.component.ts', 'import', 'app/app.component.ts (import)')(format=".")
|
|
|
|
|
|
|
|
a(id="component-decorator")
|
2015-11-10 13:31:46 -05:00
|
|
|
:marked
|
2016-02-12 20:54:22 -05:00
|
|
|
### @Component decorator
|
|
|
|
|
|
|
|
`Component` is a **decorator** function that takes a *metadata* object.
|
|
|
|
The metadata tell Angular how to create and use this component.
|
|
|
|
|
|
|
|
We apply this function to the component class
|
2016-03-07 22:38:52 -05:00
|
|
|
by prefixing the function with the **@** symbol and invoking it with the metadata object
|
2016-02-12 20:54:22 -05:00
|
|
|
just above the class:
|
|
|
|
+makeExample('quickstart/ts/app/app.component.ts', 'metadata', 'app/app.component.ts (metadata)')(format=".")
|
|
|
|
:marked
|
|
|
|
This particular metadata object has two fields, a `selector` and a `template`.
|
|
|
|
|
|
|
|
The **selector** specifies a simple CSS selector for an HTML element that represents the component.
|
|
|
|
|
|
|
|
>The element for this component is named `my-app`.
|
|
|
|
Angular creates and displays an instance of our `AppComponent`
|
|
|
|
wherever it encounters a `my-app` element in the host HTML.
|
2015-12-10 21:29:14 -05:00
|
|
|
|
2016-02-12 20:54:22 -05:00
|
|
|
The **template** specifies the component's companion template,
|
|
|
|
written in an enhanced form of HTML that tells Angular how to render this component's view.
|
|
|
|
|
|
|
|
>Our template is a single line of HTML announcing "*My First Angular App*".
|
|
|
|
|
|
|
|
>A more advanced template could contain data bindings to component properties
|
|
|
|
and might identify other application components which have their own templates.
|
|
|
|
These templates might identify yet other components.
|
|
|
|
In this way an Angular application becomes a tree of components.
|
|
|
|
|
|
|
|
a(id="component-class")
|
|
|
|
:marked
|
|
|
|
### Component class
|
|
|
|
At the bottom of the file is an empty, do-nothing class named `AppComponent`.
|
|
|
|
+makeExample('quickstart/ts/app/app.component.ts', 'export', 'app/app.component.ts (class)')(format=".")
|
|
|
|
:marked
|
|
|
|
When we're ready to build a substantive application,
|
|
|
|
we can expand this class with properties and application logic.
|
|
|
|
Our `AppComponent` class is empty because we don't need it to do anything in this QuickStart.
|
|
|
|
|
|
|
|
We **export** `AppComponent` so that we can **import** it elsewhere in our application,
|
|
|
|
as we'll see when we create `main.ts`.
|
|
|
|
|
|
|
|
a(id="main")
|
|
|
|
.l-main-section
|
|
|
|
:marked
|
|
|
|
## Show it with *main.ts*
|
|
|
|
Now we need something to tell Angular to load the root component
|
2015-12-10 21:29:14 -05:00
|
|
|
|
2016-01-28 19:15:26 -05:00
|
|
|
Add a new file , `main.ts`, to the `app/` folder as follows:
|
|
|
|
+makeExample('quickstart/ts/app/main.ts', null, 'app/main.ts')(format=".")
|
2016-02-10 17:58:05 -05:00
|
|
|
|
2016-02-12 20:54:22 -05:00
|
|
|
.l-verbose-section
|
2015-12-10 21:29:14 -05:00
|
|
|
:marked
|
2016-02-12 20:54:22 -05:00
|
|
|
We import the two things we need to launch the application:
|
2015-08-08 16:55:53 -04:00
|
|
|
|
2016-02-12 20:54:22 -05:00
|
|
|
1. Angular's browser `bootstrap` function
|
|
|
|
1. The application root component, `AppComponent`.
|
|
|
|
|
|
|
|
Then we call `bootstrap` with `AppComponent`.
|
|
|
|
|
|
|
|
### Bootstrapping is platform-specific
|
2016-04-27 14:28:22 -04:00
|
|
|
Notice that we import the `bootstrap` function from `@angular/platform-browser-dynamic`,
|
|
|
|
not `@angular/core`.
|
2016-02-12 20:54:22 -05:00
|
|
|
|
|
|
|
Bootstrapping isn't core because there isn't a single way to bootstrap the app.
|
|
|
|
True, most applications that run in a browser call the bootstrap function from
|
|
|
|
this library.
|
|
|
|
|
|
|
|
But it is possible to load a component in a different environment.
|
|
|
|
We might load it on a mobile device with [Apache Cordova](https://cordova.apache.org/) or [NativeScript](https://www.nativescript.org/).
|
|
|
|
We might wish to render the first page of our application on the server
|
|
|
|
to improve launch performance or facilitate
|
2016-03-16 23:04:42 -04:00
|
|
|
[SEO](http://www.google.com/webmasters/docs/search-engine-optimization-starter-guide.pdf).
|
2016-02-12 20:54:22 -05:00
|
|
|
|
|
|
|
These targets require a different kind of bootstrap function that we'd import from a different library.
|
|
|
|
|
|
|
|
### Why create a separate ***main.ts*** file?
|
|
|
|
|
|
|
|
The *main.ts* file is tiny. This is just a QuickStart.
|
|
|
|
We could have folded its few lines into the `app.component` file
|
|
|
|
and spared ourselves some complexity.
|
|
|
|
|
|
|
|
We'd rather demonstrate the proper way to structure an Angular application.
|
|
|
|
App bootstrapping is a separate concern from presenting a view.
|
|
|
|
Mixing concerns creates difficulties down the road.
|
|
|
|
We might launch the `AppComponent` in multiple environments with different bootstrappers.
|
|
|
|
Testing the component is much easier if it doesn't also try to run the entire application.
|
|
|
|
Let's make the small extra effort to do it *the right way*.
|
|
|
|
|
|
|
|
a(id="index")
|
2015-08-08 16:55:53 -04:00
|
|
|
.l-main-section
|
2015-12-10 21:29:14 -05:00
|
|
|
:marked
|
|
|
|
## Add the `index.html`
|
2016-02-12 20:54:22 -05:00
|
|
|
The `index.html` is the web page that hosts the application
|
2015-12-10 21:29:14 -05:00
|
|
|
|
2016-02-12 20:54:22 -05:00
|
|
|
Navigate to the **project root folder**.
|
2015-12-10 21:29:14 -05:00
|
|
|
|
|
|
|
code-example(format="").
|
|
|
|
cd ..
|
|
|
|
:marked
|
2016-02-12 20:54:22 -05:00
|
|
|
Create an`index.html` file in this root folder and paste the following lines:
|
2015-12-14 18:44:50 -05:00
|
|
|
+makeExample('quickstart/ts/index.html', null, 'index.html')(format=".")
|
2016-02-12 20:54:22 -05:00
|
|
|
.l-verbose-section
|
|
|
|
:marked
|
2016-05-03 11:43:03 -04:00
|
|
|
There are four noteworthy sections of HTML
|
2015-08-08 16:55:53 -04:00
|
|
|
|
2016-02-12 20:54:22 -05:00
|
|
|
1. The JavaScript [libraries](#libraries)
|
|
|
|
|
2016-05-03 11:43:03 -04:00
|
|
|
2. Configuration file for [SystemJS](#systemjs).
|
|
|
|
|
|
|
|
3. Where we import and run the `main` file that we just wrote.
|
2016-02-12 20:54:22 -05:00
|
|
|
|
2016-05-04 07:12:19 -04:00
|
|
|
4. The [<my-app>](#my-app) tag in the `<body>` which is *where our app lives!*
|
2016-02-12 20:54:22 -05:00
|
|
|
|
|
|
|
a(id="libraries")
|
|
|
|
:marked
|
|
|
|
### Libraries
|
|
|
|
We loaded the following scripts
|
|
|
|
+makeExample('quickstart/ts/index.html', 'libraries', 'index.html')(format=".")
|
|
|
|
:marked
|
2016-05-03 11:43:03 -04:00
|
|
|
We began with es6-shim which monkey patches the global context (window) with essential features of ES2015 (ES6).
|
2015-08-08 16:55:53 -04:00
|
|
|
|
2016-04-27 14:28:22 -04:00
|
|
|
Next are the polyfills for Angular2, `zone.js` and `reflect-metadata`.
|
2016-02-12 20:54:22 -05:00
|
|
|
|
2016-04-27 14:28:22 -04:00
|
|
|
Then the [SystemJS](#systemjs) library for module loading.
|
2016-02-12 20:54:22 -05:00
|
|
|
:marked
|
|
|
|
We'll make different choices as we gain experience and
|
|
|
|
become more concerned about production qualities such as
|
|
|
|
load times and memory footprint.
|
|
|
|
|
2016-05-05 17:26:31 -04:00
|
|
|
a(id="systemjs")
|
|
|
|
.l-main-section
|
|
|
|
:marked
|
|
|
|
### SystemJS Configuration
|
2016-02-12 20:54:22 -05:00
|
|
|
|
2016-05-05 17:26:31 -04:00
|
|
|
The QuickStart uses <a href="https://github.com/systemjs/systemjs" target="_blank">SystemJS</a>
|
|
|
|
to load application and library modules.
|
|
|
|
|
|
|
|
Add this `systemjs.config.js` file to the project root.
|
|
|
|
+makeExample('quickstart/ts/systemjs.config.1.js', null, 'systemjs.config.js')(format=".")
|
|
|
|
|
|
|
|
.l-verbose-section
|
|
|
|
:marked
|
2016-02-12 20:54:22 -05:00
|
|
|
There are alternatives that work just fine including the well-regarded
|
|
|
|
<a href="https://webpack.github.io/" target="_blank">webpack</a>.
|
2016-05-05 17:26:31 -04:00
|
|
|
SystemJS happens to be a good choice.
|
|
|
|
But we want to be clear that it was a *choice* and not a *preference*.
|
2016-02-12 20:54:22 -05:00
|
|
|
|
|
|
|
All module loaders require configuration and all loader configuration
|
|
|
|
becomes complicated rather quickly as soon as the file structure diversifies and
|
|
|
|
we start thinking about building for production and performance.
|
|
|
|
|
|
|
|
We suggest becoming well-versed in the loader of your choice.
|
|
|
|
Learn more about SystemJS configuration
|
|
|
|
<a href="https://github.com/systemjs/systemjs/blob/master/docs/config-api.md" target="_blank">here</a>.
|
|
|
|
|
|
|
|
With those cautions in mind, what are we doing in this QuickStart configuration?
|
2016-05-05 17:26:31 -04:00
|
|
|
|
2016-05-03 11:43:03 -04:00
|
|
|
First, we create a map to tell SystemJS where to look when we import some module.
|
2016-05-05 17:26:31 -04:00
|
|
|
Then, we register all our packages to SystemJS:
|
|
|
|
all the project dependencies and our application package, `app`.
|
2016-05-03 11:43:03 -04:00
|
|
|
|
|
|
|
.l-sub-section
|
|
|
|
:marked
|
2016-05-05 17:26:31 -04:00
|
|
|
Our QuickStart doesn't use all of the listed packages
|
|
|
|
but any substantial application will want many of them
|
|
|
|
and all of the listed packages are required by at least one of the documentation samples.
|
2016-05-03 11:43:03 -04:00
|
|
|
|
2016-05-05 17:26:31 -04:00
|
|
|
There is no runtime harm in listing packages that we don't need as they will only be loaded when requested.
|
2016-05-03 11:43:03 -04:00
|
|
|
:marked
|
|
|
|
The `app` package tells SystemJS what to do when it sees a request for a
|
|
|
|
module from the `app/` folder.
|
|
|
|
|
2016-02-12 20:54:22 -05:00
|
|
|
Our QuickStart makes such requests when one of its
|
|
|
|
application TypeScript files has an import statement like this:
|
|
|
|
+makeExample('quickstart/ts/app/main.ts', 'app-component', 'main.ts (excerpt)')(format=".")
|
|
|
|
:marked
|
|
|
|
Notice that the module name (after `from`) does not mention a filename extension.
|
2016-05-03 11:43:03 -04:00
|
|
|
In the configuration we tell SystemJS to default the extension to 'js', a JavaScript file.
|
2016-02-12 20:54:22 -05:00
|
|
|
|
|
|
|
That makes sense because we transpile TypeScript to JavaScript
|
|
|
|
<i>before</i> running the application</a>.
|
2016-05-05 17:26:31 -04:00
|
|
|
|
2016-02-12 20:54:22 -05:00
|
|
|
.l-sub-section
|
|
|
|
:marked
|
|
|
|
#### Transpiling in the browser
|
|
|
|
In the live example on plunker we transpile (AKA compile) to JavaScript in the browser
|
|
|
|
on the fly. That's fine for a demo. That's not our preference for development or production.
|
|
|
|
|
|
|
|
We recommend transpiling (AKA compiling) to JavaScript during a build phase
|
|
|
|
before running the application for several reasons including:
|
|
|
|
|
|
|
|
* We see compiler warnings and errors that are hidden from us in the browser.
|
|
|
|
|
|
|
|
* Pre-compilation simpifies the module loading process and
|
2016-03-07 22:38:52 -05:00
|
|
|
it's much easier to diagnose problems when this is a separate, external step.
|
2016-02-12 20:54:22 -05:00
|
|
|
|
|
|
|
* Pre-compilation means a faster user experience because the browser doesn't waste time compiling.
|
|
|
|
|
|
|
|
* We iterate development faster because we only re-compile changed files.
|
|
|
|
We notice the difference as soon as the app grows beyond a handful of files.
|
|
|
|
|
|
|
|
* Pre-compilation fits into a continuous integration process of build, test, deploy.
|
|
|
|
|
|
|
|
:marked
|
|
|
|
The `System.import` call tells SystemJS to import the `main` file
|
|
|
|
(`main.js` ... after transpiling `main.ts`, remember?).
|
|
|
|
`main` is where we tell Angular to launch the application.
|
|
|
|
We also catch and log launch errors to the console.
|
|
|
|
|
|
|
|
All other modules are loaded upon request
|
|
|
|
either by an import statement or by Angular itself.
|
|
|
|
|
|
|
|
a(id="my-app")
|
|
|
|
:marked
|
|
|
|
### *<my-app>*
|
|
|
|
When Angular calls the `bootstrap` function in `main.ts`, it reads the `AppComponent`
|
|
|
|
metadata, finds the `my-app` selector, locates an element tag named `my-app`,
|
|
|
|
and loads our application between those tags.
|
2015-08-08 16:55:53 -04:00
|
|
|
|
2016-03-13 15:50:50 -04:00
|
|
|
.l-main-section
|
|
|
|
:marked
|
|
|
|
## Add some style
|
|
|
|
Styles aren't essential but they're nice and the `index.html` assumes we have
|
|
|
|
a stylesheet called `styles.css`.
|
|
|
|
|
|
|
|
Create a `styles.css` in the root folder and start styling, perhaps with this set:
|
|
|
|
+makeExample('quickstart/ts/styles.1.css', null, 'styles.css (excerpt)')(format=".")
|
|
|
|
|
2015-10-14 23:25:19 -04:00
|
|
|
.l-main-section
|
2015-12-10 21:29:14 -05:00
|
|
|
:marked
|
|
|
|
## Compile and run!
|
|
|
|
|
|
|
|
Open a terminal window and enter this command:
|
|
|
|
code-example(format="").
|
2015-12-16 11:16:16 -05:00
|
|
|
npm start
|
2015-12-10 21:29:14 -05:00
|
|
|
:marked
|
|
|
|
That command runs two parallel node processes
|
|
|
|
1. The TypeScript compiler in watch mode
|
|
|
|
1. A static server called **lite-server** that loads `index.html` in a browser
|
|
|
|
and refreshes the browser when application files change
|
2015-10-14 23:25:19 -04:00
|
|
|
|
2015-12-10 21:29:14 -05:00
|
|
|
In a few moments, a browser tab should open and display
|
2015-10-14 23:25:19 -04:00
|
|
|
|
2015-12-10 21:29:14 -05:00
|
|
|
figure.image-display
|
|
|
|
img(src='/resources/images/devguide/quickstart/my-first-app.png' alt="Output of quickstart app")
|
2015-10-14 23:25:19 -04:00
|
|
|
|
2015-12-10 21:29:14 -05:00
|
|
|
:marked
|
|
|
|
Congratulations! We are in business.
|
2015-08-08 16:55:53 -04:00
|
|
|
|
2015-12-10 21:29:14 -05:00
|
|
|
### Make some changes
|
|
|
|
|
|
|
|
Try changing the message to "My SECOND Angular 2 app".
|
|
|
|
|
|
|
|
The TypeScript compiler and `lite-server` are watching.
|
|
|
|
They should detect the change, recompile the TypeScript into JavaScript,
|
|
|
|
refresh the browser, and display the revised message.
|
|
|
|
|
|
|
|
It's a nifty way to develop an application!
|
|
|
|
|
|
|
|
We close the terminal window when we're done to terminate both the compiler and the server.
|
2015-08-08 16:55:53 -04:00
|
|
|
|
2015-10-14 23:25:19 -04:00
|
|
|
.l-main-section
|
2015-12-10 21:29:14 -05:00
|
|
|
:marked
|
|
|
|
## Final structure
|
|
|
|
Our final project folder structure looks like this:
|
2015-12-15 17:45:45 -05:00
|
|
|
.filetree
|
|
|
|
.file angular2-quickstart
|
|
|
|
.children
|
|
|
|
.file app
|
|
|
|
.children
|
|
|
|
.file app.component.ts
|
2016-01-28 19:15:26 -05:00
|
|
|
.file main.ts
|
2016-02-11 18:08:06 -05:00
|
|
|
.file node_modules ...
|
2016-04-13 13:20:51 -04:00
|
|
|
.file typings ...
|
2015-12-15 17:45:45 -05:00
|
|
|
.file index.html
|
|
|
|
.file package.json
|
2016-03-13 15:50:50 -04:00
|
|
|
.file styles.css
|
2016-05-05 17:26:31 -04:00
|
|
|
.file systemjs.config.js
|
2015-12-15 17:45:45 -05:00
|
|
|
.file tsconfig.json
|
2016-02-11 18:08:06 -05:00
|
|
|
.file typings.json
|
2015-12-10 21:29:14 -05:00
|
|
|
:marked
|
2016-05-05 17:26:31 -04:00
|
|
|
And here are the files:
|
|
|
|
|
2015-12-10 21:29:14 -05:00
|
|
|
+makeTabs(`
|
|
|
|
quickstart/ts/app/app.component.ts,
|
2016-01-28 19:15:26 -05:00
|
|
|
quickstart/ts/app/main.ts,
|
2015-12-10 21:29:14 -05:00
|
|
|
quickstart/ts/index.html,
|
|
|
|
quickstart/ts/package.1.json,
|
2016-02-11 18:08:06 -05:00
|
|
|
quickstart/ts/tsconfig.1.json,
|
2016-03-13 15:50:50 -04:00
|
|
|
quickstart/ts/typings.1.json,
|
2016-05-03 01:09:54 -04:00
|
|
|
quickstart/ts/styles.1.css,
|
2016-05-05 17:26:31 -04:00
|
|
|
quickstart/ts/systemjs.config.1.js`
|
2016-05-03 01:09:54 -04:00
|
|
|
,null,
|
2016-03-13 15:50:50 -04:00
|
|
|
`app/app.component.ts,
|
|
|
|
app/main.ts,
|
2016-05-03 01:09:54 -04:00
|
|
|
index.html,
|
|
|
|
package.json,
|
2016-03-13 15:50:50 -04:00
|
|
|
tsconfig.json,
|
|
|
|
typings.json,
|
2016-05-03 01:09:54 -04:00
|
|
|
styles.css,
|
2016-05-05 17:26:31 -04:00
|
|
|
systemjs.config.js`)
|
2015-12-10 21:29:14 -05:00
|
|
|
:marked
|
2015-08-08 16:55:53 -04:00
|
|
|
|
|
|
|
.l-main-section
|
2015-12-10 21:29:14 -05:00
|
|
|
:marked
|
|
|
|
## Wrap Up
|
|
|
|
Our first application doesn't do much. It's basically "Hello, World" for Angular 2.
|
2015-10-14 23:25:19 -04:00
|
|
|
|
2015-12-10 21:29:14 -05:00
|
|
|
We kept it simple in our first pass: we wrote a little Angular component,
|
|
|
|
we added some JavaScript libraries to `index.html`, and launched with a
|
|
|
|
static file server. That's about all we'd expect to do for a "Hello, World" app.
|
2015-08-08 16:55:53 -04:00
|
|
|
|
2015-12-10 21:29:14 -05:00
|
|
|
**We have greater ambitions.**
|
2015-08-08 16:55:53 -04:00
|
|
|
|
2015-12-10 21:29:14 -05:00
|
|
|
The good news is that the overhead of setup is (mostly) behind us.
|
|
|
|
We'll probably only touch the `package.json` to update libraries.
|
|
|
|
We'll likely open `index.html` only if we need to add a library or some css stylesheets.
|
2015-08-08 16:55:53 -04:00
|
|
|
|
2015-12-10 21:29:14 -05:00
|
|
|
We're about to take the next step and build a small application that
|
|
|
|
demonstrates the great things we can build with Angular 2.
|
2015-08-08 16:55:53 -04:00
|
|
|
|
2015-12-10 21:29:14 -05:00
|
|
|
Join us on the [Tour of Heroes Tutorial](./tutorial)!
|