使用react + webpack时,如何使用绝对路径导入自定义scss?

uqzxnwby  于 2023-01-21  发布在  Webpack
关注(0)|答案(7)|浏览(172)

在一个scss文件中,我尝试导入定制的、广泛使用的scss块(在React/SASS/Webpack堆栈中)。
这样我就可以使用一个共享的mixin。
假设我正在创建一个MyAdminButton,我想导入一个涉及项目所有按钮的scss文件(这是自定义的scss,不是供应商/外部的)。
它看起来像这样:

//this actually works but it is a code smell : what if the current file moves ?
@import "../../stylesheets/_common-btn-styles.scss";

.my-admin-btn {
    // here I can use a shared mixin defined in _common-btn-styles.scss
}

这听起来不太好,因为如果我的scss文件移动,那么一切都是坏的。
谢谢你的帮忙

pgccezyw

pgccezyw1#

找到了。实际上您可以在webpack.config.json中配置sass-loader,如下所述:https://github.com/jtangelder/sass-loader
以下是相关部分:

sassLoader: {
   includePaths: [path.resolve(__dirname, "./some-folder")]
}
soat7uwm

soat7uwm2#

如果您使用Create React App v3(allows absolute imports),则可以使用代字号

@import "~theme/colors";
kfgdxczn

kfgdxczn3#

您可以使用resolve.modules向Webpack模块添加 * 样式表

// webpack.config.js
const path = require('path')

module.exports = {
  // ...
  resolve: {
    modules: [
      'node_modules',
      path.join(__dirname, 'path/to/stylesheets'),
    ],
  },
}

sass-loader允许您从模块导入 _common-btn-styles.scsshttps://webpack.js.org/loaders/sass-loader/#resolving-import-at-rules

@import "~_common-btn-styles.scss";

.my-admin-btn {
  // Use the shared mixins
}
093gszye

093gszye4#

在react-scripts最新版本中,您可以在项目根目录下添加一个**.env文件,变量为SASS_PATH=node_modules:src
要指定更多目录,可以将它们添加到SASS_PATH中,并以
:分隔,例如path1:path2:path3**
official doc

7ajki6be

7ajki6be5#

网络包5

Webpack 5的配置有所不同,因为includePaths应在选项sassOptions中指定:

// Webpack config
{
  test: /\.scss$/,
  loader: 'sass-loader',
  options: {
    sassOptions: {
      includePaths: [path.resolve(__dirname, '<path to styles>')],
    },
  },
},

网络包4

我不得不做更多的研究,以解决这个问题使用其他答案,所以这里是我的工作解决方案:

// Webpack config
{
  test: /\.scss$/,
  loader: 'sass-loader',
  options: {
    includePaths: [path.resolve(__dirname, '<path to styles>')],
  },
},

然后在scss文件中:

@import 'filename.scss'; // Imported from <path to styles> folder.

.style {
  //...
}
hpxqektj

hpxqektj6#

如果将Dart Sass实现与sass-loader一起使用,则选项略有不同。
The options for sassOptions are here

sassOptions: {
...
  loadPaths: [path.resolve(__dirname, '../src/')],
}
nkoocmlb

nkoocmlb7#

如果你使用的是NextJS,这里有一个简单的实现,你可以在这里阅读文档。
在我的例子中,我使用Tailwindcss和SASS,下面是配置文件和sass文件。

// next.config.js

const path = require('path');

/** @type {import('next').NextConfig} */
module.exports = {
  experimental: {
    appDir: true,
  },
  sassOptions: {
    // define the absolute path...
    includePaths: [path.join(__dirname, 'styles')],
  },
};
// styles/_components.sass

@import 'tailwindcss/components'

@layer components
  .flex-center
    @apply flex items-center justify-center
  .container
    @apply mx-auto px-3 max-w-xl sm:max-w-lg md:px-6 md:max-w-3xl

// styles/global.sass

@import 'tailwindcss/base'
@import 'tailwindcss/utilities'
@import 'components' // absolute import

// app/styles.module.sass

@import 'components' // absolute import

.header
  @apply container flex h-16 items-center justify-between sticky top-0

相关问题