Let's say that we start with the following starter pack: https://github.com/angularclass/angular2-webpack-starter
After npm install
and npm run start
everything works fine.
I want to add an external css module, for example bootstrap 4's css (and only the css). (I know that bootstrap has a bootstrap-loader, but now I'm asking for general solution, so please think about bootstrap 4 here as it could be any other css module that is available via npm).
I install bootstrap via npm: npm install bootstrap@4.0.0-alpha.4 --save
First I thought that it is enough to add import 'bootstrap/dist/css/bootstrap.css';
to the vendor.browser.ts file.
But it isn't.
What should I do to have a proper solution?
Solutions I'm NOT asking for:
- "Copy the external css module to the assets folder, and use it from there"
- I'm looking for a solution that works together with npm package.
- "Use bootstrap-loader for webpack"
- As I described above, I'm looking for a general solution, bootstrap is only an example here.
- "Use another stack"
- I'm looking for a solution in the exact starter pack that I've mentioned above.
You won't be able to import any css to your vendors file using that stack, without making some changes.
Why? Well because this line:
It's only importing your css as string, when in reality what you want is your vendor css in a style tag. If you check
config/webpack.commons.js
you will find this rule:This rule allows your components to import the css files, basically this:
In the AppComponent there's no encapsulation, because of this line
encapsulation: ViewEncapsulation.None,
which means any css rules will be applied globally to your app. So you can import the bootstrap styles in your app component:But if you insist in importing to your
vendor.ts
then you will need to install a new loader,npm i style-loader --save-dev
this will allow webpack to inject css to your page. Then you need to create a specific rule, on your webpack.common.js and change the existing one:The firs rule will be only applied when you try to import css, from any package inside
node_modules
the second rule will be applied to any css that you import from outside thenode_modules
It is possible by using
@import '~bootstrap/dist/css/bootstrap.css';
on the styles.css file. (Note the ~)Edit: How it works - The '~' is an alias set on the webpack config pointing to the assets folder... simple as that..
Edit 2: Example on how to configure webpack with the '~' alias... this should go on the webpack config file (usually
webpack.config.js
)...So here is a way to import various
CSS
files using theangular-cli
which I find the most convenient.Basically, you can refer to the
CSS
files (order is important if you will be overriding them) in the config andangular-cli
will take care of the rest. For instance, you might want to include a couple of styles from node-modules, which can be done as follows:A sample full-config might look like this:
.angular-cli.json