Comment pouvez-vous configurer un index.scss et importer des feuilles de style globales pour les variables, mixins, etc., dans une bibliothèque angular 6?
La CLI angulaire génère une bibliothèque avec un composant racine et un composant scss, mais les styles ajoutés ou importés au composant racine ne sont pas disponibles pour les composants enfants. Ce qui est logique par défaut pour encapsuler les styles, mais je ne trouve pas encore d'informations ou d'exemples sur la façon de configurer cela.
Le angular.json "styles": [...]
chemins pouvant être utilisés pour cela avec "projectType": "application"
, ne semble pas fonctionner avec "projectType": "library"
non plus.
Merci d'avance pour votre aide!
MISE À JOUR: Mon projet a été lancé en utilisant angular cli v6.0.5, en suivant ce guide: https://medium.com/@tomsu/how-to-build-a-library -for-angular-apps-4f9b38b0ed11
TL; DR pour le guide:
ng new my-app --style=scss
ng generate library my-library --prefix ml
C'est la structure du fichier angular 6 génère:
my-app
projects/
my-library/
src/
lib/
shared/..
widgets/..
my-library.component.ts
my-library.module.ts
sass/
_variables.scss
styles.scss // <<< This is where I want to `@import 'variables';`, and for it to be available in all the components of the "my-library" project.
public_api.ts
src/
app/
app.module.ts // << imports projects/my-library/lib/my-library.module as "my-library".
main.ts
index.scss
index.html
README.md
Versions du package:
Angular CLI: 6.0.5
Node: 10.2.1
OS: darwin x64
Angular: 6.0.3
... animations, common, compiler, compiler-cli, core, forms
... http, language-service, platform-browser
... platform-browser-dynamic, router
Package Version
------------------------------------------------------------
@angular-devkit/architect 0.6.5
@angular-devkit/build-angular 0.6.5
@angular-devkit/build-ng-packagr 0.6.5
@angular-devkit/build-optimizer 0.6.5
@angular-devkit/core 0.6.5
@angular-devkit/schematics 0.6.5
@angular/cli 6.0.5
@ngtools/json-schema 1.1.0
@ngtools/webpack 6.0.5
@schematics/angular 0.6.5
@schematics/update 0.6.5
ng-packagr 3.0.0
rxjs 6.2.0
TypeScript 2.7.2
webpack 4.8.3
Pour les styles globaux, j'ai répondu en cette question .
Pour les mixins et les variables, il existe également une solution de contournement.
index.scss
fichier dans le dossier racine de votre bibliothèque. Si vous suivez ce guide de Angular , alors votre chemin sera my-project/projects/my-library/index.scss
. C'est également le dossier où votre package.json
est.Alors, index.scss
sera le fichier avec vos variables et mixins
$grey: #222;
@mixin mymixin {
background: #222;
}
import
@import '../../index.scss';
ou quel que soit le chemin relatif de votre fichier scss de composant.
package.json
fichier (PAS LA BIBLIOTHEQUE).{
"name": "my-project",
"version": "1.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build && npm run copyScss",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e",
"copyScss": "xcopy \"projects\my-library\index.scss\" \"dist\\my-library\\\""
},
...
}
Maintenant, très important, N'utilisez PAS ng build
pour construire votre bibliothèque, utilisez plutôt npm run build
. Cela exécutera automatiquement la commande de copie. Maintenant le index.scss
le fichier est exporté avec votre bibliothèque dans le my-project/dist
dossier.
Inclure le index.scss
dans les fichiers scss de votre projet d'application
// ~ stands for the node_modules folder
@import '~my-library/index.scss';
Maintenant, vous avez tous vos mixins de bibliothèque dans tous les projets que vous avez installés dans votre bibliothèque.
À votre santé!
[~ # ~] ps [~ # ~] Les solutions de contournement ne sont pas les solutions les plus élégantes, mais quand rien d'autre ne fonctionne, elles fonctionnent!
Avez-vous essayé de définir le niveau d'encapsulation du composant sur aucun dans le cadre des métadonnées du composant? Comme ça:
@Component({
selector: 'app-component',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
encapsulation: ViewEncapsulation.None
})
Les niveaux de ViewEncapsulation sont:
Consultez le Angular Docs sur ViewEncapsulation et j'ai écrit un blog sur elle .
Courir ng init
sur le projet, afin qu'il initialise le projet en tant que projet CLI Angular CLI.
Edit: Mon mauvais, il semble qu'ils ont supprimé init
de la CLI. Tu peux essayer ng new --src
Cela pourrait écraser certains fichiers, essayez donc ceci sur une copie du projet.
Je pense que les gens peuvent manquer le fait que, bien qu'il existe des options d'encapsulation, les styles globaux sont générés dans des balises de style et peuvent se répercuter tout au long de votre projet.
Voici ma configuration:
Mes styles globaux: styles.scss est affiché dans les balises de style. Les règles ciblent toutes les classes et tous les éléments correspondants comme prévu. Même à l'intérieur des composants.
Les styles de composants sont encapsulés. C'est leur valeur ajoutée. Ils écrasent les globaux et conservent les styles spécifiques aux composants avec la famille de composants.
@includes
tels que variables.scss, mixins.scss etc. sont inclus explicitement en haut des fichiers .scss des composants si nécessaire.
@import '../../../../scss/includes/variables';
De quoi d'autre aurions-nous besoin?