node.js 如何使用相对路径在 Webpack 中使用 SCSS (SASS) 加载 font-awesome?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/33649761/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 19:31:26  来源:igfitidea点击:

How do I load font-awesome using SCSS (SASS) in Webpack using relative paths?

node.jssassnpmfont-awesomewebpack

提问by Richard

I have font-awesome in my node_modules folder so I try to import it in my main .scss file like so:

我的 node_modules 文件夹中有 font-awesome,所以我尝试将它导入到我的主 .scss 文件中,如下所示:

@import "../../node_modules/font-awesome/scss/font-awesome.scss";

But Webpack bundling compilation fails, telling me

但是Webpack打包编译失败,告诉我

Error: Cannot resolve 'file' or 'directory' ../fonts/fontawesome-webfont.eot 

because the font-awesome.scss file refers to a relative path, '../fonts/'.

因为 font-awesome.scss 文件引用了一个相对路径,'../fonts/'。

How can I tell scss \ webpack to @import another file, and use that file's folder as the home folder so that its relative paths work as it expects?

我如何告诉 scss \ webpack @import 另一个文件,并使用该文件的文件夹作为主文件夹,以便其相对路径按预期工作?

采纳答案by Richard

There doesn't appear to be any way to @import files that have their own relative paths in SCSS \ SASS.

似乎没有任何方法可以 @import 文件在 SCSS \ SASS 中有自己的相对路径。

So instead I managed to get thisto work:

所以不是我设法得到这个工作:

  • Import the scss \ css font-awesome file in my .js or .jsx files, notmy stylesheet files:

    import 'font-awesome/scss/font-awesome.scss';    
  • Add this to my webpack.config file:

  • 在我的 .js 或 .jsx 文件中导入 scss \ css font-awesome 文件,而不是我的样式表文件:

    import 'font-awesome/scss/font-awesome.scss';    
  • 将此添加到我的 webpack.config 文件中:

    module:
    {
        loaders:
        [
            {test: /\.js?$/, loader: 'babel-loader?cacheDirectory', exclude: /(node_modules|bower_components)/ },
            {test: /\.jsx?$/, loader: 'babel-loader?cacheDirectory', exclude: /(node_modules|bower_components)/ },
            {test: /\.scss?$/, loaders: ['style-loader', 'css-loader', 'sass-loader']},         
            {test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: 'file-loader?mimetype=image/svg+xml'},
            {test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, loader: "file-loader?mimetype=application/font-woff"},
            {test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, loader: "file-loader?mimetype=application/font-woff"},
            {test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: "file-loader?mimetype=application/octet-stream"},
            {test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: "file-loader"},
        ]
    }

回答by user137794

Use

$fa-font-path: "~font-awesome/fonts";
@import "~font-awesome/scss/font-awesome";

where the $fa-font-pathvariable is seen in font-awesome/scss/_variables.scss

在哪里$fa-font-path可以看到变量font-awesome/scss/_variables.scss

$fa-font-path: "../fonts" !default;

The tilde "~" is interpolated by sass-loader using the webpack mecanism.

波浪号“~”由 sass-loader 使用webpack mecanism 插入

回答by Yogesh Agrawal

Following worked for me:

以下对我来说有效:

$fa-font-path: "~font-awesome/fonts";
@import "~font-awesome/scss/font-awesome";

This is to import the font-awesome& required fonts in the project. Other change is in webpackconfigurations, to load required fonts using file-loader.

这是font-awesome在项目中导入& 所需的字体。其他更改是在webpack配置中,使用file-loader.

{
  test: /\.scss$/,
  loaders: ['style', 'css?sourceMap', 'sass'
  ],
}, {
  test: /\.(png|jpg|jpeg|gif|svg|woff|woff2|ttf|eot)(\?.*$|$)/,
  loader: 'file'
}

回答by Wilk

Resolved by changing my app.scss:

通过更改我的解决方案app.scss

@import '~font-awesome/scss/_variables.scss';
$fa-font-path: "~font-awesome/fonts";
@import '~font-awesome/scss/font-awesome.scss';

This way is useful to keep external dependencies unchanged and unversioned.

这种方式对于保持外部依赖项不变和无版本很有用。

回答by ramon22

I just set the path in my main scss file and it works :

我只是在我的主 scss 文件中设置了路径,它可以工作:

$fa-font-path: "../node_modules/font-awesome/fonts";
@import '~font-awesome/scss/font-awesome.scss';

回答by Excellence Ilesanmi

What worked for me was to add resolve-url-loaderand enable sourceMaps

对我有用的是添加resolve-url-loader和启用sourceMaps

I already imported font-awesome in my root .scssfile:

我已经在我的根.scss文件中导入了 font-awesome :

@import "~font-awesome/scss/font-awesome";
...

This root file is imported in my main.jsfile defined as Webpack's entrypoint:

这个根文件被导入到我main.js定义为 Webpack 入口点的文件中:

import './scss/main.scss';
...

Then my final webpack module rules look like so:

然后我最终的 webpack 模块规则如下所示:

 ...
 {
    test: /\.(sa|sc|c)ss$/,
    use: [
      MiniCssExtractPlugin.loader,
      'css-loader',
      { loader: 'postcss-loader', options: { sourceMap: true }, },
      'resolve-url-loader',
      { loader: 'sass-loader', options: { sourceMap: true }, },
    ],
  }, {
    test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
    loader: 'url-loader',
    options: { limit: 1000, name: 'fonts/[name].[ext]', },
  }
  ...

Note:

笔记:

I used mini-css-extract-plugin, which can be registered like this:

我用过mini-css-extract-plugin,可以这样注册:

new MiniCssExtractPlugin({
    filename: 'css/main.css',
    chunkFilename: '[id].[hash]',
}),


url-loaderrequires file-loaderto be installed, so if you get an error like: cannot find module file-loader, then just install it:

url-loader需要file-loader安装,所以如果你收到类似的错误:cannot find module file-loader,然后安装它:

npm i -D file-loader


Useful Links:

有用的链接

https://github.com/webpack/webpack/issues/2771#issuecomment-277514138https://github.com/rails/webpacker/issues/384#issuecomment-301318904

https://github.com/webpack/webpack/issues/2771#issuecomment-277514138 https://github.com/rails/webpacker/issues/384#issuecomment-301318904

回答by Muhammad

This is how it worked for me, the trick is to set $fa-font-pathto the path of the fonts as following.

这就是它对我的工作方式,诀窍是设置$fa-font-path字体的路径如下。

$fa-font-path: "~@fortawesome/fontawesome-free/webfonts/";
@import '~@fortawesome/fontawesome-free/scss/fontawesome.scss';
@import '~@fortawesome/fontawesome-free/scss/solid.scss';
@import '~@fortawesome/fontawesome-free/scss/brands.scss';

Note: Please check your fonts folder in node_modulesin my case it is @fortawesome/fontawesome-free

注意node_modules在我的情况下,请检查您的字体文件夹@fortawesome/fontawesome-free

回答by Koudi

v.4 (symofony 4 + webpack)

v.4 (symofony 4 + webpack)

$fa-font-path: "~components-font-awesome/webfonts";
@import '~components-font-awesome/scss/fa-brands';
@import '~components-font-awesome/scss/fa-regular';
@import '~components-font-awesome/scss/fa-solid';
@import '~components-font-awesome/scss/fontawesome';

回答by Vitaliy Markitanov

See angular site for instructions Include Font Awesome

有关说明,请参阅 angular 站点 包括 Font Awesome