From f01dc81fa184c4ec956303fd5e307d21520e1612 Mon Sep 17 00:00:00 2001 From: Ward Bell Date: Wed, 17 Feb 2016 19:31:42 -0800 Subject: [PATCH] docs(npm packages): added chapter per angular issue #6659 --- .../docs/dart/latest/guide/npm-packages.jade | 8 + public/docs/js/latest/guide/_data.json | 5 + public/docs/js/latest/guide/npm-packages.jade | 1 + public/docs/ts/latest/guide/_data.json | 5 + public/docs/ts/latest/guide/npm-packages.jade | 189 ++++++++++++++++++ public/docs/ts/latest/quickstart.jade | 89 ++++----- 6 files changed, 250 insertions(+), 47 deletions(-) create mode 100644 public/docs/dart/latest/guide/npm-packages.jade create mode 100644 public/docs/js/latest/guide/npm-packages.jade create mode 100644 public/docs/ts/latest/guide/npm-packages.jade diff --git a/public/docs/dart/latest/guide/npm-packages.jade b/public/docs/dart/latest/guide/npm-packages.jade new file mode 100644 index 0000000000..bef6020244 --- /dev/null +++ b/public/docs/dart/latest/guide/npm-packages.jade @@ -0,0 +1,8 @@ +:marked + ## NPM and NPM packages + + TypeScript and JavaScript developers rely on the Node Package Manager (*npm*) to install + angular and other libraries. + + Dart applications do not use *npm* to load 3rd party modules so + the chapter describing that process is irrelevant to Dart developers. \ No newline at end of file diff --git a/public/docs/js/latest/guide/_data.json b/public/docs/js/latest/guide/_data.json index 0b8baf2d68..4557e0cfe7 100644 --- a/public/docs/js/latest/guide/_data.json +++ b/public/docs/js/latest/guide/_data.json @@ -73,6 +73,11 @@ "intro": "Angular's hierarchical dependency injection system supports nested injectors in parallel with the component tree." }, + "npm-packages": { + "title": "npm packages", + "intro": "Details of the recommended npm packages and the different kinds of package dependencies" + }, + "upgrade": { "title": "Upgrading from 1.x", "intro": "Angular 1 applications can be incrementally upgraded to Angular 2." diff --git a/public/docs/js/latest/guide/npm-packages.jade b/public/docs/js/latest/guide/npm-packages.jade new file mode 100644 index 0000000000..6778b6af28 --- /dev/null +++ b/public/docs/js/latest/guide/npm-packages.jade @@ -0,0 +1 @@ +!= partial("../../../_includes/_ts-temp") diff --git a/public/docs/ts/latest/guide/_data.json b/public/docs/ts/latest/guide/_data.json index 8eb6c3eabc..580fbed748 100644 --- a/public/docs/ts/latest/guide/_data.json +++ b/public/docs/ts/latest/guide/_data.json @@ -73,6 +73,11 @@ "intro": "Angular's hierarchical dependency injection system supports nested injectors in parallel with the component tree." }, + "npm-packages": { + "title": "npm packages", + "intro": "Details of the recommended npm packages and the different kinds of package dependencies" + }, + "upgrade": { "title": "Upgrading from 1.x", "intro": "Angular 1 applications can be incrementally upgraded to Angular 2." diff --git a/public/docs/ts/latest/guide/npm-packages.jade b/public/docs/ts/latest/guide/npm-packages.jade new file mode 100644 index 0000000000..942f9eee10 --- /dev/null +++ b/public/docs/ts/latest/guide/npm-packages.jade @@ -0,0 +1,189 @@ +include ../../../../_includes/_util-fns + +:marked + Angular applications and Angular itself depend upon features and functionality provided by a variety of third-party packages + maintained and installed with the Node Package Manager (npm). +.l-sub-section + :marked + Don't have npm? + Get it now + because we're going to use it now and repeatedly throughout this documentation. +:marked + The Angular team recommends the starter-set of packages specified in the `dependencies` and `devDependencies` + sections of the QuickStart + package.json file: ++makeJson('quickstart/ts/package.1.json',{ paths: 'dependencies, devDependencies'}, 'package.json (dependencies)')(format=".") +:marked + There are other possible package choices. + We're recommending this particular set that we know work well together. + + In this chapter we explain what each package does and why we include it. + Feel free to make substitutions later to suit your tastes and experience. + +.l-main-section +:marked + ## *dependencies* and *devDependencies* + The `package.json` distinguishes between two sets of packages, + [dependencies](#dependencies) and [devDependencies](#dev-dependencies). + + The packages listed under *dependencies* are essential to *running* the application. + The *devDependencies* are only necessary to *develop* the application. + They can be excluded from production installations as in this example: +code-example(format="." language="bash"). + npm install my-application --production + +a(id="dependencies") +.l-main-section +:marked + ## *dependencies* + There are two package categories in the `dependencies` section of the application `package.json`: + + * ***Features*** - Feature packages provide our application with framework and utility capabilites. + + * ***Polyfills*** - Polyfills plug gaps in the browser's JavaScript implementation. + +.l-main-section +:marked + ### Feature Packages + + ***angular2*** - The framework we know and love; the reason we're all here. + + ***[system.js](https://github.com/systemjs/systemjs)*** - A dynamic module loader compatible with the + [ES2015 module](http://www.2ality.com/2014/09/es6-modules-final.html) specification. + There are other viable choices including the well-regarded [webpack](https://webpack.github.io/). + SystemJS happens to be the one we use in the documentation samples. It works. + + Our applications are likely to require additional packages that provide + HTML controls, themes, data access, and various utilities. + + +a(id="polyfills") +.l-main-section +:marked + ### Polyfill Packages + + Angular requires certain [polyfills](https://en.wikipedia.org/wiki/Polyfill) in the application environment. + We install these polyfills with very specific npm packages that Angular lists in the *peerDependencies* section of its `package.json`. + + We must list these packages in the `dependencies` section of our own `package.json`. + +.l-sub-section + :marked + See "[Why peerDependencies?](#why-peer-dependencies)" below for background on this requirement. +:marked + ***es6-promise*** - Angular applications require ES2015 promise support. + Although some browsers provide a native implementation of ES2015 promises many do not. + We still need this library even for the browsers that do support promises + in order to integrate with the current version of *zone.js* (see below). + This integration dependency goes away in the next version of *zone.js* + The need for *es6-promise* should disappear entirely once promises are implemented by all supported ever-green browsers. + + ***es6-shim*** - monkey patches the global context (window) with essential features of ES2016 (ES6). + Developers may substitute an alternative polyfill that provides the same core APIs. + This dependency should go away once these APIs are implemented by all supported ever-green browsers. + + ***reflect-metadata*** - a dependency shared between Angular and the ***TypeScript compiler***. + Developers should be able to update a TypeScript package without upgrading Angular, + which is why this is a dependency of the application and not a dependency of Angular. + + ***rxjs*** - a polyfill for the [Observables specification](https://github.com/zenparsing/es-observable) currently before the + [TC39](http://www.ecma-international.org/memento/TC39.htm) committee that determines standards for the JavaScript language. + Developers should be able to pick a preferred version of *rxjs* (within a compatible version range) + without waiting for Angular updates. + + ***zone.js*** - a polyfill for the [Zone specification](https://gist.github.com/mhevery/63fdcdf7c65886051d55) currently before the + [TC39](http://www.ecma-international.org/memento/TC39.htm) committee that determines standards for the JavaScript language. + Developers should be able to pick a preferred version of *zone.js* to use (within a compatible version range) + without waiting for Angular updates. + +a(id="dev-dependencies") +.l-main-section +:marked + ## *devDependencies* + The packages listed in the *devDependencies* section of the `package.json` help us develop the application. + They do not have to be deployed with the production application although there is rarely harm in doing so. + + ***[concurrently](https://www.npmjs.com/package/concurrently)*** - + a utility to run multiple *npm* commands concurrently on OS/X, Windows, and Linux operating systems. + + ***[lite-server](https://www.npmjs.com/package/lite-server)*** - + a light-weight, static file server, written and maintained by [John Papa](http://johnpapa.net/) + with excellent support for Angular apps that use routing. + + ***[typescript](https://www.npmjs.com/package/typescript)*** - + the TypeScript language server including the *tsc* TypeScript compiler. + + ***[typings](https://www.npmjs.com/package/typings)*** - a manager for TypeScript definition files. + Learn more about it in the [TypeScript Configuration](typescript-configuration.html#typings) chapter. + + This section likely grows as we add more tools, testing, and build support. + The QuickStart set is sufficient for developing the documentation sample applications. + +.l-main-section +a(id="why-peer-dependencies") +:marked + ## Why *peerDependencies*? + + We don't have a *peerDependencies* section in the QuickStart `package.json`. + But Angular itself has a *peerDependencies* section in + [*its* package.json](https://github.com/angular/angular/blob/master/modules/angular2/package.json) + and that has important consequences for our application. + + It explains why we load the [polyfill](#polyfills) *dependency* packages in the QuickStart `package.json`, + and why we'll need those packages in our own applications. + + Let's briefly explain what [peer dependencies](https://nodejs.org/en/blog/npm/peer-dependencies/) are about. + + As we know, packages depend on other packages. For example, our application depends upon the Angular package. + + Two packages, 'A' and 'B', could depend on the same third package 'C'. + 'A' and 'B' might both list 'C' among their *dependencies*. + + What if 'A' and 'B' depend on different versions of 'C' ('C1' and 'C2'). The npm package system supports that! + It installs 'C1' in the `node_modules` folder for 'A' and 'C2' in the `node_modules` folder for 'B'. + Now 'A' and 'B' have their own copies of 'C' and they run without interferring. This is great. + + But there is a problem. Package 'A' may require the presence of 'C1' without actually calling upon it directly. + 'A' may only work if *everyone is using 'C1'*. It falls down if any part of the application relies on 'C2'. + + The solution is for 'A' to declare that 'C1' is a *peer dependency*. + + The difference between a `dependency` and a `peerDependency` is roughly this: + + >A **dependency** says, "I need this thing directly available to *me*." + > + >A **peerDependency** says, "if you want to use me, you need this thing available to *you*." + + Angular finds itself in this situation. + Accordingly, the Angular `package.json` specifies several *peer dependency* packages, + each pinned to a particular version of a third-party package. + + ### We must install Angular's *peerDependencies* ourselves + + When *npm* installs packages listed in *our* `dependencies` section, + it also installs the packages listed within *their* packages `dependencies` sections. + The process is recursive. + + But as of version 3, *npm* does *not* install packages listed in *peerDependencies* sections. + + That means when our application installs Angular, ***npm* will not automatically install + the packages listed in Angular's *peerDependencies* section**. + + Fortunately, *npm* warns us (a) when any *peer dependencies* are missing or (b) + when the application or any its other dependencies + installs a different version of a *peer dependency*. + + These warnings are a critical guard against accidental failures due to version mismatches. + They leave us in control of package and version resolution. + + It is our responsibility to list all *peer dependency* packages **among our own *devDependencies***. + +.l-sub-section + :marked + #### The future of *peerDependencies* + + The Angular polyfill dependencies should be just a suggestion or a hint to developers so that they know what Angular expects. + They should not be hard requirements as they are today. We don't have a way to make them optional today. + + There is a npm feature request for "optional peerDependencies" which would allow us to model this relationship better. + Once implemented, Angular will switch from *peerDependencies* to *optionalPeerDependencies* for all polyfills. diff --git a/public/docs/ts/latest/quickstart.jade b/public/docs/ts/latest/quickstart.jade index 1df1ea4dbd..210fd4202f 100644 --- a/public/docs/ts/latest/quickstart.jade +++ b/public/docs/ts/latest/quickstart.jade @@ -44,19 +44,25 @@ a(id="devenv") :marked ## Development Environment - We need to set up our development environment with - * an [application project folder](#app-folder) - * a [tsconfig.json](#tsconfig) to guide the TypeScript compiler - * a [typings.json](#typings) to install TypeScript definition files - * a [package.json](#package-json) to install *npm* packages with scripts and other assets our app will need. - + 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 + * 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. + a(id="app-folder") :marked Create a **new project folder** code-example(format=""). mkdir angular2-quickstart cd angular2-quickstart - + a(id="tsconfig") :marked Add a **tsconfig.json** file to the project folder and copy/paste the following: @@ -86,52 +92,18 @@ a(id="package-json") :marked Add a **package.json** file to the project folder and copy/paste the following: +makeJson('quickstart/ts/package.1.json', null, 'package.json')(format=".") - -: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 error messages in red 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`. .l-verbose-section :marked ### Adding the libraries we need with *npm* Angular application developers rely on the npm - package manager to acquire the libraries their apps require. - - Don't have npm? - Get it now - because we're going to use it now and repeatedly throughout this documentation. - + package manager to install the libraries their apps require. The Angular team recommends the starter-set of packages specified in the `dependencies` and `devDependencies` - sections of this QuickStart - package.json file. - - +makeJson('quickstart/ts/package.1.json',{ paths: 'dependencies, devDependencies'}, 'package.json (dependencies)')(format=".") - :marked - There are other possible package choices. - We're recommending this particular set that we know work well together. - Feel free to make substitutions later to suit your tastes and experience. - - A `package.json` has an optional **scripts** section where we can define helpful - commands for development and build tasks. - We've included a number of such scripts in our suggested `package.json`: + 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: +makeJson('quickstart/ts/package.1.json',{ paths: 'scripts'}, 'package.json (scripts)')(format=".") :marked @@ -157,6 +129,29 @@ code-example(format=""). * `npm postinstall` - called by *npm* automatically *after* it successfully completes package installation. This script installs the [TypeScript definition files](#typings) this app requires. +: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 error messages in red 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`. + :marked **We're all set.** Let's write some code.