Skip to content

SekibOmazic/angular2-store-example

Repository files navigation

WIP: @ngrx/store Best Practices

  • Normalizr & ImmutableJS
  • "Smart" & "Dumb" Components
  • AsyncPipe to handle subscription to Observables
  • Store is never exposed and only used privately inside services to dispatch Actions
  • Splice up the store using RxJS Operators (i.e. Users.users$, Users.loading$, Users.adding$) for easier consumption in Smart Components

Quick start

# clone the repo
git clone [email protected]:meenie/angular2-store-example.git

# change directory to our repo
cd angular2-store-example

# install the repo with npm
npm install

# start the server
npm start

go to http://0.0.0.0:3000 in your browser

Table of Contents

File Structure

We use the component approach in our starter. This is the new standard for developing Angular apps and a great way to ensure maintainable code by encapsulation of our behavior logic. A component is basically a self contained app usually in a single file or a folder with each concern as a file: style, template, specs, e2e, and component class. Here's how it looks:

angular2-webpack-starter/
 ├──src/                       * our source files that will be compiled to javascript
 |   ├──main.ts                * our entry file for our browser environment
 │   │
 |   ├──index.html             * Index.html: where we generate our index page
 │   │
 |   ├──vendor.ts              * our vendor file
 │   │
 │   ├──app/                   * WebApp: folder
 │   │   ├──app.spec.ts        * a simple test of components in app.ts
 │   │   └──app.ts             * App.ts: a simple version of our App component components
 │   │
 │   └──assets/                * static assets are served here
 │       ├──icon/              * our list of icons from www.favicon-generator.org
 │       ├──service-worker.js  * ignore this. Web App service worker that's not complete yet
 │       ├──robots.txt         * for search engines to crawl your website
 │       └──human.txt          * for humans to know who the developers are
 │
 ├──test/                      * this is our global unit tests and end-to-end tests
 │
 ├──spec-bundle.js             * ignore this magic that sets up our angular 2 testing environment
 ├──karma.config.js            * karma config for our unit tests
 ├──protractor.config.js       * protractor config for our end-to-end tests
 │
 ├──tsconfig.json              * config that webpack uses for typescript
 ├──typings.json               * our typings manager
 ├──package.json               * what npm uses to manage it's dependencies
 │
 ├──webpack.config.js          * our development webpack config
 ├──webpack.test.config.js     * our testing webpack config
 └──webpack.prod.config.js     * our production webpack config

Getting Started

Backend

This project uses json-server as an API to help with CRUD operations on the front-end. Please read the documentation in the provided link to learn more on how you can use it. After running npm install, there is a postinstall script which will generate the file called db.json with some seeded data. Change this all you like, it has been .gitignored.

Dependencies

What you need to run this app:

  • node and npm (brew install node)
  • Ensure you're running the latest versions Node v4.1.x+ and NPM 2.14.x+

Once you have those, you should install these globals with npm install --global:

  • webpack (npm install --global webpack)
  • webpack-dev-server (npm install --global webpack-dev-server)
  • karma (npm install --global karma-cli)
  • protractor (npm install --global protractor)
  • typings (npm install --global typings)
  • typescript (npm install --global typescript)

Installing

  • fork this repo
  • clone your fork
  • npm install to install all dependencies
  • typings install to install necessary typings
  • npm start to start the dev server in another tab

Running the app

After you have installed all dependencies you can now run the app. Run npm start to start a local server using webpack-dev-server which will watch, build (in-memory), and reload for you. The port will be displayed to you as http://0.0.0.0:3000.

There are a couple of environment variables you can set to change some of the server settings:

  • PORT: Port to run the server on. Default is: 3000
  • JSON_SERVER_DB: File to use for json-server. Default is: db.json
  • JSON_SERVER_PORT: Port to run json-server on. Default is: 3100
  • JSON_SERVER_DELAY: How much delay each json-server API call has. Default is: 100

server

# development
npm start
# production
npm run build:prod
npm run server:prod

Other commands

build files

# development
npm run build:dev
# production
npm run build:prod

watch and build files

npm run watch

run tests

npm run test

run webdriver (for end-to-end)

npm run webdriver:update
npm run webdriver:start

run end-to-end tests

# make sure you have webdriver running and a sever for the client app
npm run e2e

Contributing

Please do :).

TypeScript

To take full advantage of TypeScript with autocomplete you would have to install it globally and use an editor with the correct TypeScript plugins.

Use latest TypeScript compiler

TypeScript 1.7.x includes everything you need. Make sure to upgrade, even if you installed TypeScript previously.

npm install --global typescript

Use a TypeScript-aware editor

We have good experience using these editors:

Frequently asked questions

  • What's the current browser support for Angular 2 Beta?
  • Why is my service, aka provider, is not injecting parameter correctly?
    • Please use @Injectable() for your service for typescript to correctly attach the metadata (this is a TypeScript problem)
  • How do I run protractor with node 0.12.x?
    • please check out this repo to use the old version of protractor #146
  • Where do I write my tests?
  • How do I start the app when I get EACCES and EADDRINUSE errors?
    • The EADDRINUSE error means the port 3000 is currently being used and EACCES is lack of permission for webpack to build files to ./dist/
  • How to use sass for css?
  • loaders: ['raw-loader','sass-loader'] and @Component({ styles: [ require('./filename.scss') ] }) see issue #136
  • How do I test a Service?
  • See issue #130
  • How fo I add vscode-chrome-debug support?
  • The VS Code chrome debug extension support can be done via launch.json see issue #144

Project seeded by angular2-webpack-starter

License

MIT

About

WIP: @ngrx/store Best Practices

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published