首页 文章

使用webpack和postcss-loader导入字体很棒

提问于
浏览
2

我正在尝试更新我的webpack构建以利用postcss和postcss-loader . 但是我在加载字体,图像等时遇到问题 .

例如,试图让字体真棒导入 .

这是我在postcss工作之前的设置:

CSS:

@import "~font-awesome/css/font-awesome.min.css";

webpack.config:

...
  module: {
    rules: [{
      test: /\.css$/,
      use: ExtractTextPlugin.extract({
        fallback: 'style-loader',
        use: 'css-loader'
      })
    },{
      test: /\.(eot|svg|ttf|woff|woff2)$/,
      loader: 'file-loader?name=fonts/[name].[ext]'
    },{
      test: /\.(png|jpg)$/,
      loader: 'file-loader?name=images/[name].[ext]'
    },{
      test: /\.html$/, loader: 'raw-loader'
    }]
  }
  ...

试图转向:

@import 'font-awesome'

webpack w / postcss:

...
  module: {
    rules: [{
      test: /\.css$/,
      use: ExtractTextPlugin.extract({
        fallback: 'style-loader',
        use: [{
          loader: 'css-loader',
          options: {
            importLoaders: 1
          }
        },{
          loader: 'postcss-loader',
          options: {
            ident: 'postcss',
            sourceMap: true,
            plugins: [require('postcss-import')()]
          }
        }]
      })
    },{
      test: /\.(eot|svg|ttf|woff|woff2)$/,
      loader: 'file-loader?name=fonts/[name].[ext]'
    },{
      test: /\.(png|jpg)$/,
      loader: 'file-loader?name=images/[name].[ext]'
    },{
      test: /\.html$/, loader: 'raw-loader'
    }]
  }
  ...

但是,当我这样做时,我得到这样的错误:

./style.css中的错误模块构建失败:ModuleNotFoundError:找不到模块:错误:无法解析'/ test-project / public'中的'../fonts/fontawesome-webfont.eot'

我也尝试过其他一些库(即bootstrap,leaflet),并遇到了同样的问题 .

2 回答

  • 0

    看来 css-loader 无法解析 font-awesome/fonts 目录的相对url路径 .

    你需要在 css-loader 选项中使用alias .

    use: [{
      loader: 'css-loader',
      options: {
        importLoaders: 1,
        alias: {
          "../fonts": "font-awesome/fonts"
        }
      }
    }
    

    我在一个示例项目中测试了它,它似乎成功编译 .

    $ ./node_modules/.bin/webpack
    Hash: 05687ac67950e58e8485
    Version: webpack 3.10.0
    Time: 996ms
                              Asset     Size  Chunks                    Chunk Names
      fonts/fontawesome-webfont.eot   166 kB          [emitted]
    fonts/fontawesome-webfont.woff2  77.2 kB          [emitted]
     fonts/fontawesome-webfont.woff    98 kB          [emitted]
      fonts/fontawesome-webfont.ttf   166 kB          [emitted]
      fonts/fontawesome-webfont.svg   444 kB          [emitted]  [big]
                     ./dist/main.js  2.63 kB       0  [emitted]         main
                         styles.css  38.1 kB       0  [emitted]         main
       [0] ./main.js 43 bytes {0} [built]
       [1] ./main.css 41 bytes {0} [built]
       [2] ../node_modules/css-loader?{"importLoaders":1,"alias":{"../fonts":"font-awesome/fonts"}}!../node_modules/resolve-url-loader!../node_modules/postcss-loader/lib?{"ident":"postcss"}!./main.css 43.7 kB [built]
        + 10 hidden modules
    Child extract-text-webpack-plugin ../../../../Joshua Barnett\Projects\blah\node_modules\extract-text-webpack-plugin\dist ../../../../Joshua Barnett\Projects\blah\node_modules\css-loader\index.js??ref--0-2!../../../../Joshua Barnett\Projects\blah\node_modules\resolve-url-loader\index.js!../../../../Joshua Barnett\Projects\blah\node_modules\postcss-loader\lib\index.js??postcss!../../../../Joshua Barnett\Projects\blah\js\main.css:
         5 assets
           [0] ../node_modules/css-loader?{"importLoaders":1,"alias":{"../fonts":"font-awesome/fonts"}}!../node_modules/resolve-url-loader!../node_modules/postcss-loader/lib?{"ident":"postcss"}!./main.css 43.7 kB {0} [built]
            + 8 hidden modules
    

    如果您还使用了使用 ../fonts 相对路径的项目,则可能还需要更具体的别名 .

  • 0

    这个webpack配置解决了我的问题:

    const rules = [{
      test: /\.css$/,
      use: [
        'style-loader',
        {
          loader: 'css-loader',
          options: {
            importLoaders: 1,
            sourceMap: true,
          }
        },
       'resolve-url-loader',
        {
          loader: 'postcss-loader',
          options: {
            sourceMap: true,
            ident: 'postcss',
            plugins: () => [],
          }
        }
      ]
    }, {
      test: /\.(png|woff|woff2|eot|ttf|svg)$/,
      loader: 'url-loader?limit=100000',
    }]
    

相关问题