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

Ric*_*ard 70 sass node.js npm font-awesome webpack

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

@import "../../node_modules/font-awesome/scss/font-awesome.scss";
Run Code Online (Sandbox Code Playgroud)

但是,告诉我,Webpack捆绑编译失败了

Error: Cannot resolve 'file' or 'directory' ../fonts/fontawesome-webfont.eot 
Run Code Online (Sandbox Code Playgroud)

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

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

小智 125

使用

$fa-font-path: "~font-awesome/fonts";
@import "~font-awesome/scss/font-awesome";
Run Code Online (Sandbox Code Playgroud)

$fa-font-path看到变量的地方font-awesome/scss/_variables.scss

$fa-font-path: "../fonts" !default;
Run Code Online (Sandbox Code Playgroud)

如上所述:http: //fontawesome.io/get-started/

  • 不适合我,它编译,但我只是在我的网站得到矩形......:/ (8认同)
  • 你能更准确地解释一下你在哪里编辑什么吗?我不明白这个答案 (3认同)

Ric*_*ard 27

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

所以我设法让这个工作:

  • 在我的.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"},
        ]
    }

  • 搞定了.我更改了加载程序的路径,现在它从指定的路径加载字体. (2认同)

Yog*_*wal 18

以下为我工作:

$fa-font-path: "~font-awesome/fonts";
@import "~font-awesome/scss/font-awesome";
Run Code Online (Sandbox Code Playgroud)

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

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


Muh*_*mad 13

这就是它对我的工作方式,诀窍是设置$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';
Run Code Online (Sandbox Code Playgroud)

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


Wil*_*ilk 12

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

@import '~font-awesome/scss/_variables.scss';
$fa-font-path: "~font-awesome/fonts";
@import '~font-awesome/scss/font-awesome.scss';
Run Code Online (Sandbox Code Playgroud)

这种方式对于保持外部依赖关系不变和无版本非常有用.

  • 您可以避免第1行并在第2行结束时使用`!default`. (2认同)

ram*_*n22 6

我只是在我的主scss文件中设置路径,它的工作原理:

$fa-font-path: "../node_modules/font-awesome/fonts";
@import '~font-awesome/scss/font-awesome.scss';
Run Code Online (Sandbox Code Playgroud)


Exc*_*nmi 5

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

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

@import "~font-awesome/scss/font-awesome";
...
Run Code Online (Sandbox Code Playgroud)

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

import './scss/main.scss';
...
Run Code Online (Sandbox Code Playgroud)

然后我的最终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]', },
  }
  ...
Run Code Online (Sandbox Code Playgroud)

注意:

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

new MiniCssExtractPlugin({
    filename: 'css/main.css',
    chunkFilename: '[id].[hash]',
}),
Run Code Online (Sandbox Code Playgroud)

url-loader需要file-loader安装,因此如果出现类似的错误cannot find module file-loader,则只需安装:

npm i -D file-loader
Run Code Online (Sandbox Code Playgroud)

有用的链接

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