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.

4voto

adi518 Points 416

La réponse choisie ne propose pas de solution viable.

La pratique de l'OP semble irrégulière. Un fichier partagé/commun se trouve normalement sous partials un répertoire standard pour le modèle de base. Vous devez ensuite ajouter partials à vos chemins d'importation de configuration afin de résoudre les partiels n'importe où dans votre code.

Lorsque j'ai rencontré ce problème pour la première fois, j'ai pensé que SASS vous donnait probablement une variable globale similaire à celle de Node. __dirname qui conserve un chemin absolu vers le répertoire de travail actuel ( cwd ). Malheureusement, ce n'est pas le cas et la raison en est que l'interpolation sur un @import n'est pas possible, donc vous ne pouvez pas faire un chemin d'importation dynamique.

Según Documentation SASS .

Vous devez définir :load_paths dans votre configuration Sass. Puisque l'OP utilise Compass, je vais le suivre en accord avec la documentation. aquí .

Vous pouvez opter pour la solution CLI telle qu'elle est prévue, mais pourquoi ? Il est bien plus pratique de l'ajouter à config.rb . Il serait logique d'utiliser le CLI pour remplacer config.rb (par exemple, différents scénarios de construction).

Donc, en supposant que votre config.rb est sous le projet Root, il suffit d'ajouter la ligne suivante : add_import_path 'sub_directory_a'

Et maintenant @import 'common'; fonctionnera très bien partout.

Bien que cela réponde à l'OP, il y a plus.

Annexe

Il est probable que vous rencontriez des cas où vous souhaitez importer un fichier CSS de manière intégrée, c'est-à-dire sans passer par l'intermédiaire de l'application vanilla @import que CSS fournit d'emblée, mais une directive réel fusion du contenu d'un fichier CSS avec votre SASS. Il existe un autre question La réponse à cette question n'est pas concluante (la solution ne fonctionne pas dans tous les environnements). La solution consiste donc à utiliser ce Extension SASS.

Une fois installé, ajoutez la ligne suivante à votre configuration : require 'sass-css-importer' et ensuite, quelque part dans votre code : @import 'CSS:myCssFile';

Notez que l'extension doit être omise pour que cela fonctionne.

Cependant, nous rencontrerons le même problème lorsque nous essaierons d'importer un fichier CSS à partir d'un chemin d'accès autre que celui par défaut et add_import_path ne respecte pas les fichiers CSS. Pour résoudre ce problème, vous devez donc ajouter une autre ligne dans votre configuration, qui est naturellement similaire :

add_import_path Sass::CssImporter::Importer.new('sub_directory_a')

Maintenant, tout va bien fonctionner.

P.S., J'ai remarqué sass-css-importer La documentation indique un CSS: est requis en plus de l'omission du préfixe .css extension. J'ai découvert qu'elle fonctionne malgré tout. Quelqu'un a lancé un numéro qui sont restées sans réponse jusqu'à présent.

3voto

Vijay Aggarwal Points 73

node-sass (l'enveloppe officielle de SASS pour node.js ) fournit une option de ligne de commande --include-path pour répondre à ces exigences.

Exemple :

En package.json :

"scripts": {
    "build-css": "node-sass src/ -o src/ --include-path src/",
}

Maintenant, si vous avez un fichier src/styles/common.scss dans votre projet, vous pouvez l'importer avec @import 'styles/common'; n'importe où dans votre projet.

Consultez le site https://github.com/sass/node-sass#usage-1 pour plus de détails.

1voto

Nebojsa Zoric Points 41

Pour définir le fichier à importer, il est possible d'utiliser les définitions communes à tous les dossiers. Il faut juste être conscient que c'est relatif au fichier que vous définissez. Pour en savoir plus sur l'option d'importation avec des exemples, consultez aquí .

1voto

Deejers Points 164

Essayez d'utiliser le paramètre includePaths...

"Le compilateur SASS utilise chaque chemin dans loadPaths lors de la résolution des @imports SASS."

https://stackoverflow.com/a/33588202/384884

1voto

DavGarcia Points 9322

Si vous utilisez Compilateur Web dans Visual Studio, vous pouvez ajouter le chemin d'accès à includePath dans compilerconfig.json.defaults. Il n'y a donc pas besoin d'un certain nombre de ../ puisque le compilateur utilisera includePath comme emplacement pour rechercher l'importation.

Par exemple :

"includePath": "node_modules/foundation-sites/scss",

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