En SASS, ¿es posible importar un archivo desde otro directorio? Por ejemplo, si tuviera una estructura como esta:
- root_directory
- sub_directory_a
- _common.scss
- template.scss
- sub_directory_b
- more_styles.scss
template.scss podría importar _common.scss usando, @import "common"
pero ¿es posible que more_styles.scss importe _common.scss? Probé algunas cosas diferentes, incluidas @import "../sub_directory_a/common"
y @import "../sub_directory_a/_common.scss"
pero nada parece funcionar.
-I
? Si ese nombre de ruta cambia, habrá muchas búsquedas y reemplazos; y requiere la misma estructura de carpetas locales de cualquiera que comparta el .scssPuede usar el
-I
interruptor de línea de comando o la:load_paths
opción del código Ruby para agregarlosub_directory_a
a la ruta de carga de Sass. Entonces, si está ejecutando Sass desderoot_directory
, haga algo como esto:Entonces simplemente puede usar
@import "common"
enmore_styles.scss
.fuente
-I
Banderas de cadena para incluir más de un directorio, por ejemplosass -I sub_directory_a -I sub_directory_c --watch sub_directory_b:sub_directory_b
Usando webpack con sass-loader puedo usar
~
para referirme a la ruta raíz del proyecto. Por ejemplo, asumiendo la estructura de carpetas de OP y que está en un archivo dentro de sub_directory_b:Documentación: https://github.com/webpack-contrib/sass-loader#resolving-import-at-rules
fuente
node_modules/
y no desde la raíz del proyecto."sub_directory_a"
a miincludePaths
y usar la@import "common";
sintaxis cuando usaba Angular CLI, que incluye sass-loader.~/
no parece referirse al directorio de inicio para mí. O cualquier directorio que haya intentado probar. ¿Hay alguna forma de intentar averiguar a dónde se refiere esto?Importar un
.scss
archivo que tiene una importación anidada con una posición relativa diferente no funcionará. La respuesta principal propuesta (usando mucho../
) es solo un truco sucio que funcionará siempre que agregue lo suficiente../
para llegar a la raíz del sistema operativo de implementación de su proyecto.fuente
meteor
, fue solo un ejemplo.La respuesta seleccionada no ofrece una solución viable.
La práctica de OP parece irregular. Un archivo compartido / común normalmente se encuentra debajo de
partials
un directorio repetitivo estándar. Luego debe agregar unpartials
directorio a sus rutas de importación de configuración para resolver parciales en cualquier lugar de su código.Cuando encontré este problema por primera vez, pensé que SASS probablemente le brinda una variable global similar a la de Node
__dirname
, que mantiene una ruta absoluta al directorio de trabajo actual (cwd
). Desafortunadamente, no es así y la razón es porque la interpolación en una@import
directiva no es posible, por lo tanto, no puede hacer una ruta de importación dinámica.Según los documentos de SASS .
Necesita establecer
:load_paths
su configuración de Sass. Dado que OP usa Compass, lo seguiré de acuerdo con la documentación aquí .Puede optar por la solución CLI según lo previsto, pero ¿por qué? es mucho más conveniente agregarlo
config.rb
. Tendría sentido usar CLI para anularconfig.rb
(por ejemplo, diferentes escenarios de compilación).Entonces, asumiendo que
config.rb
está bajo la raíz del proyecto, simplemente agregue la siguiente línea:add_import_path 'sub_directory_a'
Y ahora
@import 'common';
funcionará bien en cualquier lugar.Si bien esto responde a OP, hay más.
Apéndice
Es probable que se encuentre con casos en los que desee importar un archivo CSS de forma incrustada, es decir, no a través de la
@import
directiva básica que CSS proporciona de fábrica, sino una combinación real del contenido de un archivo CSS con su SASS. Hay otra pregunta , que no se responde de manera concluyente (la solución no funciona en varios entornos). Entonces, la solución es utilizar esta extensión SASS.Una vez instalado, agregue la siguiente línea a su configuración:
require 'sass-css-importer'
y luego, en algún lugar de su código:@import 'CSS:myCssFile';
Tenga en cuenta que la extensión debe omitirse para que esto funcione.
Sin embargo, nos encontraremos con el mismo problema al intentar importar un archivo CSS desde una ruta no predeterminada y
add_import_path
no respeta los archivos CSS. Entonces, para resolver eso, debe agregar otra línea en su configuración, que es naturalmente similar:add_import_path Sass::CssImporter::Importer.new('sub_directory_a')
Ahora todo funcionará bien.
PD: noté que la
sass-css-importer
documentación indicaCSS:
que se requiere un prefijo además de omitir la.css
extensión. Descubrí que funciona independientemente. Alguien inició un problema , que hasta ahora no ha recibido respuesta.fuente
Gulp hará el trabajo para ver sus archivos sass y también agregar rutas de otros archivos con includePaths. ejemplo:
fuente
-I
opción de la línea de comando, ¿verdad?node-sass
(el contenedor oficial de SASS paranode.js
) proporciona una opción de línea de comandos--include-path
para ayudar con dichos requisitos.Ejemplo:
En
package.json
:Ahora, si tiene un archivo
src/styles/common.scss
en su proyecto, puede importarlo en@import 'styles/common';
cualquier lugar de su proyecto.Consulte https://github.com/sass/node-sass#usage-1 para obtener más detalles.
fuente
Para definir el archivo a importar, es posible utilizar todas las definiciones comunes de carpetas. Solo debe tener en cuenta que es relativo al archivo que lo está definiendo. Puede consultar más sobre la opción de importación con ejemplos aquí .
fuente
Si usa Web Compiler en Visual Studio, puede agregar la ruta
includePath
en compilerconfig.json.defaults. Entonces no hay necesidad de algunos,../
ya que el compilador usará includePath como ubicación para buscar la importación.Por ejemplo:
fuente
Esta es una respuesta a medias.
Eche un vistazo a Compass , con él puede colocarlo
_common.scss
dentro de unapartials
carpeta y luego importarlo@import common
, pero funciona en todos los archivos.fuente
Tuve el mismo problema. De mi solución llegué a esto. Así que aquí está tu código:
Por lo que sé, si desea importar un scss a otro, debe ser parcial. Al importar de directorio diferente nombre su
more_styles.scss
a_more_styles.scss
. Luego impórtelo a sutemplate.scss
@import../sub_directory_b/_more_styles.scss
. Funcionó para mí. Pero como mencionaste../sub_directory_a/_common.scss
no funciona. Ese es el mismo directorio deltemplate.scss
. Por eso no funcionará.fuente
Considere el uso del parámetro includePaths ...
"El compilador SASS usa cada ruta en loadPaths al resolver SASS @imports".
https://stackoverflow.com/a/33588202/384884
fuente
La mejor manera es utilizar sass-loader. Está disponible como paquete npm. Resuelve todos los problemas relacionados con la ruta y lo hace muy fácil.
fuente
Tenía el mismo problema y encontré una solución agregando una ruta al archivo como:
@importar "C: / xampp / htdocs / Scss_addons / Bootstrap / bootstrap";
@importar "C: / xampp / htdocs / Scss_addons / Compass / compass";
fuente