Jak wstawiać czcionki w CSS za pomocą webpacka?


10

Tło problemu: Używam katex do renderowania matematyki na stronie. Następnie chcę utworzyć wersję PDF części tej strony, dlatego tworzę dokument HTML zawierający część do wyeksportowania, która wstawia cały CSS i przekazuję go do renderera. Mechanizm renderujący nie może uzyskać dostępu do zasobów węzła, dlatego wszystko jest wbudowane. Działa idealnie, z wyjątkiem czcionek.

Próbowałem zarówno modułu ładującego url, jak i modułu ładującego wbudowanego bas64, ale wygenerowane czcionki nie są wstawiane. Sprawdziłem wygenerowany CSS w debuggerze, a stare adresy URL są nadal w nim, nie ma adresów URL danych dla czcionek.

Oto mój obecny plik webpack.config.js:

const path = require('path');
const {CleanWebpackPlugin} = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    mode: 'development',
    entry: {
        "editor": './src/editor.js',
        "editor.worker": 'monaco-editor/esm/vs/editor/editor.worker.js',
        "json.worker": 'monaco-editor/esm/vs/language/json/json.worker',
        "css.worker": 'monaco-editor/esm/vs/language/css/css.worker',
        "html.worker": 'monaco-editor/esm/vs/language/html/html.worker',
        "ts.worker": 'monaco-editor/esm/vs/language/typescript/ts.worker',
    },
    output: {
        globalObject: 'self',
        filename: '[name].bundle.js',
        path: path.resolve(__dirname, 'dist')
    },
    module: {
        rules: [
            {
                test: /\.(woff|woff2|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/,
                use: ['url-loader']
            },
            {
                test: /\.css$/,
                use: ['style-loader', 'css-loader']
            }
        ]
    },
    plugins: [
        new CleanWebpackPlugin(),
        new HtmlWebpackPlugin({
            filename: 'editor_text.html',
            template: 'src/editor_text.html'
        }),
        new HtmlWebpackPlugin({
            filename: 'editor_markdown.html',
            template: 'src/editor_markdown.html',
            inlineSource: '/katex/.*'
        })
    ]
};

Odpowiedzi:


3

Najlepszym sposobem jest użycie postcss-cli i postcss-inline-base64

paczka internetowa:

{
  test: /\.(css|sass|scss)$/,
  use: [
    MiniCssExtractPlugin.loader,
    {
      loader: 'css-loader',
      options: {
        importLoaders: 2,
        sourceMap: true
      },
    },
    {
      loader: 'postcss-loader', // important
      options: {
        sourceMap: true,
        config: {
          path: './config/',
        },
      },
    },
    {
      loader: 'sass-loader',
      options: {
        sourceMap: true,
      },
    },
  ],
}, {
  test: /\.(woff(2)?|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/,
  use: [{
    loader: 'file-loader',
  }]
},

Utwórz szerokość folderu konfiguracji postcss.config.js

module.exports = {
  plugins: {
    'postcss-inline-base64': {
      baseDir: './sources/'
    },
  },
};

baseDir to ścieżka do czcionek. W pliku scss dodaję czcionkę w ten sposób:

@font-face {
  font-family: 'Lato-Light';
  src: url('b64---../fonts/Lato-Light.ttf---') format('truetype');
  font-weight: normal;
  font-style: normal;
}

W wyniku pracy mamy ładnie przekonwertowaną czcionkę na base64 @font-face{font-family:Lato-Light;src:url("data:font/ttf;charset=utf-8;base64,...

AKTUALIZACJA: Przygotowałem mały przykład postcss-inline-base64


Wielkie dzięki. Mój problem polega na tym, że plik katex.css zawierający @font-faceinstrukcje znajduje się w module węzła (katex). Nie odwołuję żadnej z tych czcionek w moich własnych plikach css. Szukam sposobu na zastąpienie adresów URL w locie podczas działania pakietu. Jak rozumiem, musiałbym zmienić @font-faceinstrukcje w katex.css, jeśli chcę skorzystać z twojego rozwiązania.
Axel,

Tak, nie możesz wypróbować innej wtyczki postcss-base64 Nie korzystałem z niej, ale z tego, co przeczytałem w dokumentacji, możesz wybrać rozszerzenie, więc powinno działać. Wtedy nie będziesz musiał modyfikować plików. Sprawdzę, czy znajdę chwilę.
Grzegorz T.

Ok wtyczka, którą zasugerowałem, nie działa tak, jak chciałem, ale tej nie trzeba nic zmieniać w plikach, wszystkie czcionki zostaną automatycznie zmienione na postcss-font-base64 -> przykład
Grzegorz T.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.