如何使用相对路径在Webpack中使用SCSS(SASS)加载超棒的字体?


84

我的node_modules文件夹中的字体很棒,因此我尝试将其导入到主.scss文件中,如下所示:

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

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

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

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

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


我不知道webpack,但是您可以放入.eot../../node_modules/font-awesome/fonts/fontawesome-webfont.eot吗?
BrTkCa 2015年

我可以通过更改字体棒的文件来做到这一点,但是每当更新npm时,我都会丢失所做的更改,因此这不是一种选择。
理查德(Richard)

webpack一起表达@Richard吗?
BrTkCa 2015年

不,不使用快递
理查德(Richard)

我正在将npm用于字体超赞的sass loader。您使用其他人了吗?
Winnemucca

Answers:


139

使用

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

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

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

波浪号“〜”由sass-loader使用webpack机制进行插值


11
不适用于我,它可以编译,但我只是在我的网站中得到一个矩形...:/
Donovan Charpin '16

1
我不得不将我的设置为$fa-font-path: "font-awesome/fonts"-即没有波浪号。
ctrlplusb '16

2
您能否更准确地说明在哪里编辑内容?我不明白这个答案
理查德

@Richard您能为您工作吗?另外,请将此标记为答案!
Ascherer '16

不,我当时使用以下答案。
理查德

29

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

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

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

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

    模块:
    {
        装载机:
        [
            {test:/ \。js?$ /,加载器:“ babel-loader?cacheDirectory”,排除:/(node_modules | bower_components)/},
            {test:/ \。jsx?$ /,加载器:“ babel-loader?cacheDirectory”,排除:/(node_modules | bower_components)/},
            {test:/ \。scss?$ /,加载器:['style-loader','css-loader','sass-loader']},         
            {test:/\.svg(\?v=\d+\.\d+\.\d+)?$/,加载程序:“ file-loader?mimetype = image / svg + xml'},
            {test:/ \。woff(\?v = \ d + \。\ d + \。\ d +)?$ /,加载程序:“ file-loader?mimetype = application / font-woff”},
            {test:/ \。woff2(\?v = \ d + \。\ d + \。\ d +)?$ /,加载程序:“ file-loader?mimetype = application / font-woff”},
            {test:/ \。ttf(\?v = \ d + \。\ d + \。\ d +)?$ /,加载器:“文件加载器?mimetype = application / octet-stream”}},
            {test:/ \。eot(\?v = \ d + \。\ d + \。\ d +)?$ /,加载程序:“文件加载程序”},
        ]
    }

您如何处理不同的字体路径?我的意思是您将scss导入到那里,但是您无法更改字体文件的路径,例如,如果您需要为生产而更改它,并且字体位于其他文件夹中。有任何想法吗?那就是我需要做的。
LordTribual 2015年

我还没有改变生产的东西。我想我只是复制本地构建中的所有内容,而忽略路径。否则,请查看webpack.config.js输出部分,看看是否可以更改路径。或者只是在package.json脚本部分中添加构建后的步骤。
理查德

2
得到它的工作。我更改了加载程序的路径,现在从指定的路径加载字体。
LordTribual 2015年

您无需在javascript中包含真棒字体的scss文件。只要您按照user137794的建议设置字体路径,就仍可以将其包含在scss中,然后更新webpack.config文件以根据您的建议考虑字体类型。
Dave Lancea

您使用哪个npm?我正在使用sass字体超棒的加载程序,但未成功。
Winnemucca'3

20

以下对我有用:

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

这是font-awesome在项目中导入&必需的字体。其他变化是webpack配置,以使用加载所需的字体file-loader

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

12

通过更改我的决议app.scss

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

这种方法对于保持外部依赖关系不变和未版本化很有用。


2
您可以避免使用第1行,而在第2行的末尾使用`!default`。
Nighto

可惜我无法使用此方法,因为这意味着我不必在_variables.scss每次重新编译项目时都更改文件。它不会覆盖此内容$fa-font-path或其他任何变量。.所以不确定是否能做到这一点
耶稣g_force哈里斯

7

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

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

7

这就是它的工作方式,技巧是$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';

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


1
@Muhammed实际上,加载这样的webfonts有点棘手。当您将sass编译为CSS时,根据您的编译方式,可能不会编译您的字体。您可以将webfonts文件夹直接复制到css文件夹旁边的public /文件夹中。这样,字体真棒的CSS代码将找到这些字体,您将处于安全状态。
Mycodingproject

6

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

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

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

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

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

然后我的最终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]', },
  }
  ...

注意:

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

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

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

npm i -D file-loader

有用的链接

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


1

对于5.14版,以下内容适用于我:

$fa-font-path : '../node_modules/@fortawesome/fontawesome-free/webfonts';

@import "../node_modules/@fortawesome/fontawesome-free/scss/solid";

@import "../node_modules/@fortawesome/fontawesome-free/scss/brands";

@import "../node_modules/@fortawesome/fontawesome-free/scss/fontawesome";

0

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 using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.