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 en utilisant @import "common"
mais est-il possible pour more_styles.scss d'importer _common.scss? J'ai essayé différentes choses, y compris @import "../sub_directory_a/common"
et @import "../sub_directory_a/_common.scss"
, mais rien ne semble fonctionner.
Il semble que certains changements apportés à SASS ont rendu possible ce que vous aviez initialement essayé de faire:
@import "../subdir/common";
Nous avons même réussi à ce que cela fonctionne pour un dossier totalement indépendant situé dans c:\projects\sass
:
@import "../../../../../../../../../../projects/sass/common";
Il suffit d’ajouter suffisamment de ../
pour être sûr que vous vous retrouverez à la racine du lecteur et que vous êtes prêt à partir.
Bien sûr, cette solution est loin d'être jolie, mais je ne pouvais pas faire fonctionner une importation depuis un dossier totalement différent, sans utiliser I c:\projects\sass
ni définir la variable d'environnement SASS_PATH
(from: : load_paths reference ) sur cette même valeur. .
Vous pouvez utiliser le commutateur de ligne de commande -I
ou l'option :load_paths
du code Ruby pour ajouter sub_directory_a
au chemin de chargement de Sass. Donc, si vous utilisez Sass depuis root_directory
, procédez comme suit:
sass -I sub_directory_a --watch sub_directory_b:sub_directory_b
Ensuite, vous pouvez simplement utiliser @import "common"
dans more_styles.scss
.
En utilisant webpack avec sass-loader, je peux utiliser ~ pour faire référence au chemin racine du projet. E.g en supposant que la structure du dossier OPs et que vous êtes dans un fichier dans sub_directory_b:
@import "~sub_directory_a/_common";
Voir sous Utilisation/Importations dans le fichier lisez-moi sass-loader: https://github.com/webpack-contrib/sass-loader
L'importation d'un fichier .scss
comportant une importation imbriquée avec une position relative différente ne fonctionnera pas. La réponse proposée en haut (en utilisant beaucoup de ../
) est simplement un bidouillage sale qui fonctionnera tant que vous aurez ajouté suffisamment de ../
pour atteindre la racine du système d'exploitation de déploiement de votre projet.
utilisez
:load_paths
àconfig.rd
pour les frameworks basés sur Compass (Ex. Rails)utilisez le code suivant à
scss-config.json
pourfourseven/meteor-scss
{
"includePaths": [
"{}/node_modules/ionicons/dist/scss/"
]
}
Exemple, avec
fourseven/meteor-scss
, vous pouvez utiliser{}
pour mettre en surbrillance niveau supérieur de votre projet selon l’exemple suivant
@import "{}/node_modules/module-name/stylesheet";
Gulp fera le travail pour regarder vos fichiers sass et aussi pour 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'));
});
Pour définir le fichier à importer, il est possible d'utiliser toutes les définitions communes des dossiers. Vous devez juste savoir qu'il est relatif au fichier que vous définissez. Pour en savoir plus sur l'option d'importation avec des exemples, vous pouvez vérifier ici .
Examinez l'utilisation du paramètre includePaths ...
"Le compilateur SASS utilise chaque chemin dans loadPaths lors de la résolution des @imports SASS."
Ceci est une demi-réponse.
Check out Compass , vous pouvez y placer votre _common.scss
dans un dossier partials
, puis l’importer avec @import common
, mais cela fonctionne dans tous les fichiers.
Si vous utilisez compilateur Web dans Visual Studio, vous pouvez ajouter le chemin d'accès à includePath
dans compilerconfig.json.defaults. Il n’est alors 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",
J'ai rencontré le même problème. De ma solution je suis entré dans ceci. Alors voici votre code:
- root_directory
- sub_directory_a
- _common.scss
- template.scss
- sub_directory_b
- more_styles.scss
Pour autant que je sache, si vous voulez importer un scss dans un autre, il doit être partiel. Lorsque vous importez depuis un autre répertoire, nommez votre more_styles.scss
à _more_styles.scss
. Puis importez-le dans votre template.scss
comme ceci @import ../sub_directory_b/_more_styles.scss
. Cela a fonctionné pour moi. Mais comme vous l'avez mentionné, ../sub_directory_a/_common.scss
ne fonctionne pas. C'est le même répertoire du template.scss
. C'est pourquoi cela ne fonctionnera pas.
Le meilleur moyen est d'utiliser sass-loader. Il est disponible sous forme de package npm. Il résout tous les problèmes liés au chemin d'accès et le rend super facile.