Angular2 / Webpack:如何加载在css文件中导入的字体?

时间:2016-04-22 01:56:26

标签: angular webpack webpack-style-loader

我正在使用Angular2 beta.15和webpack 1.12.14。

我在app.component.ts中有一个.css和一个.scss文件,就像这样的全局模式。

  @Component({
    selector: 'my-app',
    templateUrl: 'app/app.component.html',
    styles: [
      require('../stylesheets/css/main.min.css'),
      require('../sass/example.scss')
    ],
    encapsulation: ViewEncapsulation.None,
  })

而且,在.css文件中,某些字体的输入方式如下,

@font-face {
    font-family: 'Helvetica Neue';
    src: url(fonts/light/helvetica-neue-light.eot) format("eot"), 
         url(fonts/light/helvetica-neue-light.woff2) format("woff2"),   
         url(fonts/light/helvetica-neue-light.woff) format("woff"), 
         url(fonts/light/helvetica-neue-light.ttf) format("truetype");
    font-weight: 300;
    font-style: normal
}

webpack.config.js中,我有.css.scss的加载器和下面的字体

  {
    test: /\.scss$/,
    exclude: /node_modules/,
    loaders: ['raw-loader', 'sass-loader'] // sass-loader not scss-loader
  },
  {
       test: /.(png|woff(2)?|eot|ttf|svg)(\?[a-z0-9=\.]+)?$/,
       loader: 'url-loader'
  },
  {
    test: /\.css$/,
    loaders: ['style', 'css']
  },

当我运行webpack -display-error-details时,根本没有错误,但是当我启动服务器来运行我的应用时,我收到如下错误

EXCEPTION: Error during instantiation of Token Promise<ComponentRef>!.
ORIGINAL EXCEPTION: Expected 'styles' to be an array of string

如果我将css加载程序更改为

  {
    test: /\.css$/,
    loader: 'url-loader'  //or use 'raw-loader'
  },

这些异常消失了,应用程序启动了,但是我在浏览器的控制台中为这些字体收到了404请求错误,它们根本没有加载。 那么,你能给我一些指示吗?我怀疑装载机设置有问题。

3 个答案:

答案 0 :(得分:1)

当您将多个加载器链接在一起时,其操作顺序将从右向左完成。

然后,加载器生成的代码将传递给下一个代码。在这种情况下,您希望将raw-loaderurl-loader链接起来,以获得所需的结果:

loaders: ['raw-loader', 'url-loader']

由于您需要首先获得字体网址,并自动转换为样式中的base64编码,因此您必须首先在链中调用url-loader。然后,由于您要将此文件作为module.exports导入,因此请调用raw-loader

所以在链中会发生以下情况:

  1. url-loader:将您对静态资源的所有网址引用转换为base64:data
  2. raw-loader:获取您的文件,并使用字符串包装其整个代码,然后通过添加module.exports='string'
  3. 使其可导入

答案 1 :(得分:0)

        Just Try once to keep under one dir both font and css

        // and give the reference onces in webpack.config.rb

         # Set this to the root of your project when deployed:
         http_path = "/"
         css_dir = "app/assets/css"
         sass_dir = "app/assets/sass"

答案 2 :(得分:0)

试试这个:

@Component({
selector: 'my-app',
templateUrl: 'app/app.component.html',
styles: [
  require('../stylesheets/css/main.min.css').toString(),
  require('!style-loader!css-loader!less-loader!../less/example.less').toString()
]})

我用较少的命令来表示scss

的类似命令