Project Structure
Learn how we structured the code of Angular Site Template
If you are new to Angular development I suggest you read our article Angular Tutorial: Learn Angular from scratch step by step.
In the root of the project we have some important files and folders:
File/Folder
Purpose
node_modules/
The npm packages installed in the project with the npm install command.
e2e/
This folder is where our end to end tests will live. This template doesn't include e2e tests, just the default configuration that is included in a new angular project.
src/
The most important folder. Here we have all the files that make our Angular app and is the location where we will spend most of our time coding.
angular.json
It provides workspace-wide and project-specific configuration defaults for build and development tools provided by the Angular CLI. Learn more about this file.
.gitignore
Specifies intentionally untracked files that Git should ignore.
package.json
As every modern web application, we need a package system and package manager to handle all the third-party libraries and modules used by our app. Inside this file you will find all the dependencies and some other handy stuff like the npm scripts that will help us a lot to orchestrate the development (bundling/compiling) workflow.
package-lock.json
Provides version information for all packages installed into node_modules
by the npm client.
server.ts
A super simple yet complete Node.js Express server to serve your Angular app with server side rendering support. Learn more about ssr in this project.
tsconfig.json
Default Typescript configuration file. It needs to be in the root path as it’s where the typescript compiler will look for it.
webpack.server.config.js
Default webpack config used by the Angular CLI build/bundling workflow.
Now let's dive in the details of the /src
folder.
/src
/src
Inside of the /src
directory we find our raw, uncompiled code. This is where most of the work for your Angular app will take place.
When we start the scripts that handle the bundling/compilation workflow, our code inside of /src
gets bundled and transpiled into the correct Javascript version that the browser understands (currently, ES5). That means we can work at a higher level using TypeScript, but compile down to the older form of Javascript the browser needs.
Under this folder you will find the following important folders and files:
/app
Has all the components, modules, pages, services and styles you will use to build your app.
/assets
In this folder you will find images, sample-data json’s, and any other asset you may require in your app.
/environments
Under this folder are configuration files used by the Angular CLI to manage the different environment variables.
For example we could have a local database for our development environment and a product database for production environment.
When we run
ng serve
it will use by default the dev environment.
/main
Has the files needed to bootstrap the app.
index.html
You won’t be modifying this file often, as in our case it only serves as a placeholder. All the scripts and styles needed to make the app work are gonna be injected automatically by the webpack bundling process, so you don’t have to do this manually.
The only thing that comes to my mind now that you may include in this file are some meta tags (but you can also handle these through Angular as well).
tsconfig.app.json
This file extends
tsconfig.json
main file and adds some specific configuration for the app. It’s then used inangular.json
tsconfig.server.json
This file extends
tsconfig.json
main file and adds some specific configuration for the server. It’s then used inangular.json
/src/app
/src/app
This is the core of the project. Let’s have a look at the structure of this folder so you get an idea where to find things and where to add your own modules to adapt this project to your particular needs.
We designed this project with a modular approach.
We strive to showcase an advanced app module architecture so you get a better idea on how to structure and scale your project. Again, modules are great to achieve scalability.
The proposed architecture is based on two fundamental modules that are used across the app (CoreModule
and SharedModule
), three main folders that group different features, pages, and modules (/auth
, /store
and /user
), and one auxiliar folder (/misc
) to group miscellaneous pages and stuff.
If your project has a different set of functionalities (say for example a blog section), then you should add a new folder /blog which will include different pages and sub-modules for that set of features.
Inside the /app
folder there are also some important files:
app.component.html
This serves as the skeleton of the app. Typically has a
<router-outlet>
to render the routes and their content. It can also be wrapped with content that you want to be in every page (for example a footer).
app.component.ts
It’s the Angular component that provides functionality to the html file I just mentioned about.
app.module.ts
This is the main module of the project.
app.routes.ts
Here we define the main routes. Child routes of other lazy modules are defined inside those modules. These routes are registered to the Angular
RouterModule
in theAppModule
.
app.server.module.ts
Similar to the previous one, this one wraps the main
AppModule
with stuff you only want in the server side rendered version of your app.
/src/app/core
/src/app/core
This folder contains the CoreModule
. Unlike the SharedModule
, this module gather all single-use classes and components hiding their details inside a CoreModule
that you import once when the app starts and never import anywhere else.
A simplified root AppModule
imports CoreModule
in its capacity as orchestrator of the application as a whole.
Under this module you should for example place singleton services like an AuthenticationService or other single-use components (such as 404, navbars. etc) that appear only in the AppComponent
template. You don't import them elsewhere so they're not shared in that sense.
Following Angular best practices, only the root AppModule should import the CoreModule. Bad things happen if a lazy-loaded module imports it.
/src/app/shared
/src/app/shared
The SharedModule
that lives in this folder exists to hold the common components, directives, and pipes and share them with the modules that need them.
It imports the Angular CommonModule
because the components inside this folder use common Angular directives. You will notice that it also re-exports other modules.
If you review the application structure, you may notice that many components requiring SharedModule
directives also use NgIf
and NgFor
from Angular'sCommonModule
and bind to component properties with [(ngModel)]
, a directive in the Angular's FormsModule
. Modules that declare these components would have to import CommonModule
, FormsModule
, and SharedModule
.
You can reduce the repetition by having SharedModule
re-export CommonModule
and FormsModule
so that importers of SharedModule
get CommonModule
and FormsModule
for free.
Notice that SharedModule
can still export FormsModule
without listing it among its imports.
In the /shared
folder of this Angular Template you will find these components and directives:
Background Image
A component that enables you to set background images with a loading indicator in an easy way.
Preload Image
This component enables you to have responsive images that maintain the aspect ratio you define.
Fill Container
This component enables you to define content containers that maintain it's aspect ratio across all the different screen sizes.
Breadcrumbs
Add breadcrumbs in an easy and extensible way. You can add this component at the root
app.component.html
and it will be displayed in every page or you can add it in the specific pages and gain flexibility.
Color Radio Buttons
A beautiful yet simple directive that extends
ngx-bootstrap
radio buttons and adds the capability to have actionable colored buttons instead of the typical radio button.
Percentage Bar Rating
A component to visualize disaggregated ratings.
Search Bar
A search bar input component.
Star Rating
Visualize the overall rating of a product in a beautiful way.
Stylish Carousel
A component that customize and extends the UI of the
ngx-bootstrap
carousel component.
/src/app/styles
/src/app/styles
Here you will find all the variables, mixins, shared styles, etc, that will make your app customizable and extendable.
Here is where you will change the main colors of the app to match your styles.
Maybe you don’t know Sass? Briefly, it is a superset of css that will ease and speed your development cycles incredibly.
Other folders (/auth
, /store
, /user
, /misc
)
/auth
, /store
, /user
, /misc
)To gain code modularity, and get the benefits of lazy loading modules, we’ve created a lazy module for each major section of the app.
Within those module folders you will find every related file for the pages included in that module. This includes the html for the layout, sass for the styles and the main page component.
Last updated