How to Add Third-Party Library in Angular CLI

December 22, 2017 3 min read Angular

Today, we're going to figure out what are the ways to install and use third-party libraries in an Angular CLI project.

Using ES6 Modules

The easiest way to add third-party libraries is to use ES6 Modules. A library, which is exported declaratively, could be loaded in a few straightforward steps.

Let’s simulate this way by installing Lodash in our project:

npm install lodash

Yay, Lodash is installed! - now let’s use it:

Now that isEmpty is imported - we’re able to invoke that method. But what will happen when we import this method like that way in another file? Will it be loaded twice?

Basically, ES6 Modules are singletons. So, if a module is imported multiple times, we can be sure it will be evaluated and loaded into the bundle only once.

In practice, we “cherry-picked” the isEmpty method of Lodash specifically in order to reduce the bundle size.

Note: If you want to enable tree-shaking by Webpack - you should consider installing lodash-es and importing the methods out of it (for instance: import isEmpty from 'lodash-es/isEmpty').

Global Scripts & Styles

ES6 Modules are a superb way to use third-party libraries. However, not all the third-party libraries support it, such as jQuery, Bootstrap and more. Don’t be panic - Angular CLI provides a declarative way to handle these libraries through the .angular-cli.json file.

To explain - let’s install Bootstrap 4 which is based on jQuery and Popper.js:

npm install jquery
npm install popper.js
npm install bootstrap@next

Popper.js arrives with its typings file, thus we don’t have to install for it. Let’s install the other typings:

npm install @types/jquery --save-dev
npm install @types/bootstrap --save-dev

Note: We use typings modules for getting the desired autocomplete functionality in the IDE.

As an additional step, we open tsconfig.app.json. Then, we should add jQuery and Bootstrap to the types array so the TypeScript compiler will recognize those:

"types": [
  "jquery",
  "bootstrap"
]

All right, the libraries were installed - but now we’d like to figure out how to inject them. The first step will be to open to the .angular-cli.json file.

Now, we should look for the injected scripts array and add the relevant files of jQuery, Popper.js and Bootstrap:

In like manner, we’ll add the styles file of Bootstrap to the injected styles array:

Well, what we did here, is to load the third-party’s scripts before that the Angular application starts to initialize. In fact, that’s the equivalent of injecting these files as scripts tags of index.html, which means these scripts are on the global scope or in other words - on the Window object. Just like that, the styles are injected as link tags.

Here’s the result:

Retrieving jQuery from the global scope

Retrieving jQuery from the global scope

External Assets

So far we examined adding of third-party libraries using ES6 Modules and global sources. Our mission now is to add a third-party library that includes some additional resources.

Iconic is a perfect choice. Let’s install it:

npm install open-iconic

Like before, we should navigate to .angular-cli.json file and find the injected assets. But, suppose we want to inject all the SVGs which are provided by that third-party - by now, we injected each file specifically. So, how should we do that?

One option on the table is copying of the SVGs directory into our codebase manually. However, we don’t want to mingle with an external code. Against that - Angular CLI supports injecting of external assets using node-glob.

Here’s the way to inject the whole directory:

It means that all SVGs are available to be bundled and served as part of assets - we just have to access it.

Take an example that uses a specific SVG:

An example that uses a specific SVG

Using a specific SVG

Recap

We introduced three different use-cases for adding a third-party library into our Angular CLI project: ES6 Modules, scripts & styles on the global scope and importing of external assets.

The sample project is available here.