105 votes

Lorsque j'utilise SASS, comment puis-je importer un fichier depuis un autre répertoire ?

Dans SASS, est-il possible d'importer un fichier depuis un autre répertoire ? Par exemple, si j'avais une structure comme celle-ci :

- root_directory
    - sub_directory_a
        - _common.scss
        - template.scss
    - sub_directory_b
        - more_styles.scss

template.scss pourrait importer _common.scss à l'aide de @import "common" mais est-il possible que more_styles.scss importe _common.scss ? J'ai essayé plusieurs choses différentes, notamment @import "../sub_directory_a/common" y @import "../sub_directory_a/_common.scss" mais rien ne semble fonctionner.

85voto

Oliver Points 1863

UPDATE : Veuillez considérer La réponse de Mikka d'abord - cela devrait fonctionner sans problème si vous souhaitez uniquement inclure les éléments suivants sous-répertoires . Ma réponse est spécifique à l'inclusion de répertoires autre que les sous-répertoires, mais fonctionne pour ceux-ci aussi. Mais : Ce n'est pas la façon idiomatique de le faire.


Il semble que certaines modifications apportées à SASS aient rendu possible ce que vous avez essayé de faire initialement :

@import "../subdir/common";

Nous avons même réussi à faire fonctionner ce système pour un dossier sans aucun rapport avec le sujet, situé dans le dossier de l'utilisateur. c:\projects\sass :

@import "../../../../../../../../../../projects/sass/common";

Ajoutez juste assez ../ pour être sûr que tu arriveras au drive Root et tu es prêt à partir.

Bien sûr, cette solution est loin d'être jolie, mais je n'ai pas réussi à faire fonctionner l'importation à partir d'un dossier totalement différent, ni en utilisant l'option I c:\projects\sass ni la définition de la variable d'environnement SASS_PATH (de : :load_paths référence ) à cette même valeur.

38voto

Miikka Points 1839

Vous pourriez utiliser le -I ou le commutateur de ligne de commande :load_paths du code Ruby pour ajouter sub_directory_a au chemin de chargement de Sass. Ainsi, si vous exécutez Sass à partir de root_directory faites quelque chose comme ça :

sass -I sub_directory_a --watch sub_directory_b:sub_directory_b

Vous pouvez alors simplement utiliser @import "common" sur more_styles.scss .

4 votes

Chaîne -I pour inclure plus d'un répertoire, par ex. sass -I sub_directory_a -I sub_directory_c --watch sub_directory_b:sub_directory_b

31voto

Sammi Points 1

En utilisant webpack avec sass-loader je peux utiliser ~ pour faire référence au chemin racine du projet. Par exemple, en supposant que la structure des dossiers du PO et que vous êtes dans un fichier à l'intérieur du sous-répertoire_b :

@import "~sub_directory_a/_common";

Documentation : https://github.com/webpack-contrib/sass-loader#resolving-import-at-rules

2021 Modifier : utiliser ~ est maintenant déprécié et le lien ci-dessus indique :

L'utilisation de ~ est dépréciée et peut être retirée de votre code (nous recommandons nous le recommandons), mais nous le supportons toujours pour des raisons historiques. Pourquoi pouvez-vous le supprimer ? Le chargeur essaie d'abord de résoudre @import comme un chemin d'accès relatif. relatif. S'il ne peut pas le faire, le chargeur essaiera alors de résoudre @import à l'intérieur de node_modules.

12 votes

Cela semble provenir de node_modules/ et non de la Racine du projet.

0 votes

J'ai dû ajouter "sub_directory_a" à mon includePaths et utiliser le @import "common"; lorsque vous utilisez l'interface CLI d'Angular qui inclut sass-loader.

4 votes

D'accord avec Splaktar. Extrait de la documentation de sass-loader : webpack fournit un mécanisme avancé pour résoudre les fichiers. Le sass-loader utilise la fonction d'importateur personnalisé de Sass pour passer toutes les requêtes au moteur de résolution de webpack. Vous pouvez donc importer vos modules Sass depuis node_modules. Il suffit de les faire précéder d'un ~ pour indiquer à webpack qu'il ne s'agit pas d'une importation relative... Il est important de ne les faire précéder que de ~, car ~/ correspond au répertoire personnel.

10voto

helcode Points 635

Importation d'un .scss qui comporte une importation imbriquée avec une position relative différente ne fonctionnera pas. La réponse proposée en haut de la page (utiliser beaucoup de fichiers ../ ) n'est qu'une simple astuce qui fonctionnera tant que vous aurez ajouté suffisamment de ../ pour atteindre la racine de l'OS de déploiement de votre projet.

  1. Ajouter le chemin SCSS cible comme cible de recherche pour le compilateur SCSS. Ceci peut être réalisé en ajoutant le dossier stylesheets dans le fichier de configuration scss, ceci est fonction du framework que vous utilisez,

utiliser :load_paths à l'adresse config.rd pour les cadres basés sur le compas (Ex. rails)

utilisez le code suivant à scss-config.json para fourseven/meteor-scss

{
  "includePaths": [
    "{}/node_modules/ionicons/dist/scss/"
  ]
}
  1. Utilisez des chemins absolus (plutôt que des chemins relatifs).

Exemple, avec fourseven/meteor-scss vous pouvez utiliser {} pour mettre en évidence le niveau supérieur de votre projet comme dans l'exemple suivant

@import "{}/node_modules/module-name/stylesheet";

4voto

oshry levy Points 49

Gulp se chargera de surveiller vos fichiers sass et d'ajouter les chemins des autres fichiers avec includePaths. exemple :

gulp.task('sass', function() {
  return gulp.src('scss/app.scss')
    .pipe($.sass({
      includePaths: sassPaths
    })
    .pipe(gulp.dest('css'));
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X