component - Cómo importar CSS desde node_modules en la aplicación webpack angular2
import styles angular (3)
Digamos que comenzamos con el siguiente paquete de inicio: https://github.com/angularclass/angular2-webpack-starter
Después de
npm install
y
npm run start
todo funciona bien.
Quiero agregar un módulo css externo, por ejemplo, el css de bootstrap 4 (y solo el css). (Sé que bootstrap tiene un cargador de bootstrap, pero ahora estoy pidiendo una solución general, así que piense en bootstrap 4 aquí, ya que podría ser cualquier otro módulo css que esté disponible a través de npm).
Instalo bootstrap a través de npm:
npm install [email protected] --save
Primero pensé que era suficiente agregar la
import ''bootstrap/dist/css/bootstrap.css'';
al archivo vendor.browser.ts.
Pero no lo es.
¿Qué debo hacer para tener una solución adecuada?
Soluciones que NO estoy pidiendo:
-
"Copie el módulo css externo a la carpeta de activos y utilícelo desde allí"
- Estoy buscando una solución que funcione junto con el paquete npm.
-
"Usar el cargador de arranque para el paquete web"
- Como describí anteriormente, estoy buscando una solución general, bootstrap es solo un ejemplo aquí.
-
"Usa otra pila"
- Estoy buscando una solución en el paquete de inicio exacto que he mencionado anteriormente.
Así que aquí hay una manera de importar varios archivos
CSS
utilizando el
angular-cli
que me parece más conveniente.
Básicamente, puede referirse a los archivos
CSS
(el orden es importante si los anulará) en la configuración y
angular-cli
se encargará del resto.
Por ejemplo, es posible que desee incluir un par de estilos de módulos de nodo, que se pueden hacer de la siguiente manera:
"styles": [
"../node_modules/font-awesome/css/font-awesome.min.css",
"../node_modules/primeng/resources/primeng.min.css",
"styles.css"
]
Un ejemplo de configuración completa podría verse así:
.angular-cli.json
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"project": {
"name": "my-angular-app"
},
"apps": [
{
"root": "src",
"outDir": "dist",
"assets": [
"assets",
"favicon.ico"
],
"index": "index.html",
"main": "main.ts",
"polyfills": "polyfills.ts",
"test": "test.ts",
"tsconfig": "tsconfig.app.json",
"testTsconfig": "tsconfig.spec.json",
"prefix": "app",
"styles": [
"../node_modules/font-awesome/css/font-awesome.min.css",
"../node_modules/primeng/resources/primeng.min.css",
"styles.css"
],
"scripts": [],
"environmentSource": "environments/environment.ts",
"environments": {
"dev": "environments/environment.ts",
"prod": "environments/environment.prod.ts"
}
}
],
"e2e": {
"protractor": {
"config": "./protractor.conf.js"
}
},
"lint": [
{
"project": "src/tsconfig.app.json",
"exclude": "**/node_modules/**"
},
{
"project": "src/tsconfig.spec.json",
"exclude": "**/node_modules/**"
},
{
"project": "e2e/tsconfig.e2e.json",
"exclude": "**/node_modules/**"
}
],
"test": {
"karma": {
"config": "./karma.conf.js"
}
},
"defaults": {
"styleExt": "scss",
"component": {}
}
}
Es posible usando
@import ''~bootstrap/dist/css/bootstrap.css'';
en el archivo styles.css.
(Tenga en cuenta el
~
)
Editar: cómo funciona: el ''~'' es un alias establecido en la configuración del paquete web que apunta a la carpeta de activos ... así de simple ...
Edición 2: Ejemplo sobre cómo configurar el paquete web con el alias ''~'' ... esto debería ir en el archivo de configuración del paquete web (generalmente
webpack.config.js
) ...
// look for the "resolve" property and add the following...
// you might need to require the asset like ''~/bootsrap/...''
resolve: {
alias: {
''~'': path.resolve(''./node_modules'')
}
}
No podrá importar ningún CSS a su archivo de proveedores utilizando esa pila, sin realizar algunos cambios.
¿Por qué? Bueno porque esta línea:
import ''bootstrap/dist/css/bootstrap.css'';
Solo importa tu CSS como cadena, cuando en realidad lo que quieres es tu CSS de proveedor en una etiqueta de estilo.
Si
config/webpack.commons.js
, encontrará esta regla:
{
test: //.css$/,
loaders: [''to-string-loader'', ''css-loader'']
},
Esta regla permite que sus componentes importen los archivos css, básicamente esto:
@Component({
selector: ''app'',
encapsulation: ViewEncapsulation.None,
styleUrls: [
''./app.component.css'' // this why you import css as string
],
En AppComponent no hay encapsulación, debido a esta
encapsulation: ViewEncapsulation.None,
línea
encapsulation: ViewEncapsulation.None,
que significa que cualquier regla CSS se aplicará globalmente a su aplicación.
Para que pueda importar los estilos de arranque en el componente de su aplicación:
@Component({
selector: ''app'',
encapsulation: ViewEncapsulation.None,
styleUrls: [
''./app.component.css'',
''../../node_modules/bootstrap/dist/css/bootstrap.css''
],
Pero si insiste en importar a su
vendor.ts
entonces necesitará instalar un nuevo cargador,
npm i style-loader --save-dev
esto permitirá que webpack inyecte css en su página.
Luego debe crear una regla específica, en su webpack.common.js y cambiar la existente:
{ //this rule will only be used for any vendors
test: //.css$/,
loaders: [''style-loader'', ''css-loader''],
include: [/node_modules/]
},
{
test: //.css$/,
loaders: [''to-string-loader'', ''css-loader''],
exclude: [/node_modules/] //add this line so we ignore css coming from node_modules
},
La primera regla solo se aplicará cuando intente importar css, desde cualquier paquete dentro de
node_modules
la segunda regla se aplicará a cualquier css que importe desde fuera de
node_modules