【问题标题】:Angular2/Webpack: how to load fonts that are imported inside css files?Angular2/Webpack:如何加载在 css 文件中导入的字体?
【发布时间】:2016-08-15 11:20:44
【问题描述】:

我正在使用 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 请求错误,它们根本没有加载。 那么,你能给我一些指点吗?我怀疑我的加载程序设置有问题。

【问题讨论】:

  • 您可以尝试将 url-loader 链接到 CSS 的 raw-loader 吗? ['raw-loader', 'url-loader']
  • @SeanLarkin 它有效!那太棒了!你能解释一下raw-loader的用法吗?我找不到它的文档。
  • 是的,我会创建一个带有一些解释的答案。

标签: angular webpack webpack-style-loader


【解决方案1】:

当您将多个加载器链接在一起时,它们的操作顺序是从右到左完成的。

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

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

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

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

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

【讨论】:

    【解决方案2】:
            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"
    

    【讨论】:

      【解决方案3】:

      试试这个:

      @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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-27
        • 1970-01-01
        • 1970-01-01
        • 2019-03-19
        • 2016-06-16
        • 1970-01-01
        • 1970-01-01
        • 2017-11-12
        相关资源
        最近更新 更多