使用 Rollup 解决 woff 导入

Jef*_*wrs 4 javascript css rollup node.js styled-components

我正在尝试使用 Rollup.js 捆绑一个主题包。主题包括一些全局样式,最相关的@font-face。我正在导入我的字体并打算通过样式组件注入全局注入它们。

当我尝试捆绑包时,Rollup 会阻塞字体文件。我的假设是 Webpack 和 Rollup 可以互换使用,不是这样吗?

做这样的事情的正确方法是什么?

控制台错误

{ SyntaxError: /Users/****/sites/vz-react/packages/Theme/fonts/NeueHaasGroteskDisplayBold.woff: Unexpected character '' (1:4)
> 1 | wOFF:?? 6???OS/2lZ`?  VDMX?w?mt?cmap@\??(cvt ?`?
    |     ^
  2 |
       ?fpgm??
  3 | ?c??gasp
              ? glyf
                    ?I????rheadV?66?!?vhheaV?!$??hmtxW;*+kernZ$????loca'??p?\maxp+?  ?[name+?   ?y*/post4? ??prep5?7??x?c`f?b????????????
  4 | ??????9X?@????a????x??3800?fbf?/?p?y9#????????N3(!R??x??eT???g?f`???u??3f????????????`???H(????w???=?w?O????\??dd?G?Nf2?,d?od%?t?ž??l2;??
...
Run Code Online (Sandbox Code Playgroud)

globalStyles.js

import NeueHassGroteskDisplayBold from '../fonts/NeueHaasGroteskDisplayBold.woff';
import NeueHassGroteskDisplay from '../fonts/NeueHaasGroteskDisplay.woff';
import NeueHassGroteskText from '../fonts/NeueHaasGroteskText.woff';
import NeueHassGroteskTextBold from '../fonts/NeueHaasGroteskTextBold.woff';

const injectGlobalStyles = () => `
  * {
    box-sizing: border-box;
  }

  *:focus {
    outline: #000 dotted 1px;
    outline-offset: 1px;
  }

  body {
    padding: 0;
    margin: 0;
  }

  @font-face {
    font-family: 'NHGDisplay';
    src: url(${NeueHassGroteskDisplayBold}) format("woff");
    font-weight: bold;
    font-style: normal;
  }

  @font-face {
    font-family: 'NHGDisplay';
    src: url(${NeueHassGroteskDisplay}) format("woff");
    font-weight: normal;
    font-style: normal;
  }

  @font-face {
    font-family: 'NHGText';
    src: url(${NeueHassGroteskText}) format("woff");
    font-weight: normal;
    font-style: normal;
  }

  @font-face {
    font-family: 'NHGText';
    src: url(${NeueHassGroteskTextBold}) format("woff");
    font-weight: bold;
    font-style: normal;
  }
`;

export default injectGlobalStyles;
Run Code Online (Sandbox Code Playgroud)

ada*_*oro 8

另一种方法是使用rollup-plugin-url以下命令将字体文件捆绑为 base64 字符串:

// rollup.config.js

import url from 'rollup-plugin-url'

export default {
  // ...
  plugins: [
    // ...
    url({
      // by default, rollup-plugin-url will not handle font files
      include: ['**/*.woff', '**/*.woff2'],
      // setting infinite limit will ensure that the files 
      // are always bundled with the code, not copied to /dist
      limit: Infinity,
    }),
  ],
  // ...
}
Run Code Online (Sandbox Code Playgroud)

然后像往常一样导入它们:

// some-file.js

import { createGlobalStyle } from 'styled-components'
import MyFontWoff from '../fonts/my-font.woff'

const GlobalStyle = createGlobalStyle`
  @font-face {
    font-family: 'MyFont';
    src: url(${MyFontWoff}) format('woff');
    font-weight: normal;
    font-style: normal;
  }
`
Run Code Online (Sandbox Code Playgroud)

  • 请注意,使用此解决方案您可能会内联相当大的文件。由于文件是内联的,因此控制文件的浏览器缓存也更困难。/sf/answers/1437978741/ (2认同)

Jef*_*wrs 6

经过详尽的 Google 搜索后,我找不到一种方法可以让 Rollup 在不崩溃的情况下提取字体文件。

我将导入移至执行导出时调用的要求,这解决了我的问题。

更新文件

const injectGlobalStyles = () => {

  const NeueHassGroteskDisplayBold = require('../fonts/NeueHaasGroteskDisplayBold.woff');
  const NeueHassGroteskDisplay = require('../fonts/NeueHaasGroteskDisplay.woff');
  const NeueHassGroteskText = require('../fonts/NeueHaasGroteskText.woff');
  const NeueHassGroteskTextBold = require('../fonts/NeueHaasGroteskTextBold.woff');

  return `
    * {
      box-sizing: border-box;
    }

    *:focus {
      outline: #000 dotted 1px;
      outline-offset: 1px;
    }

    body {
      padding: 0;
      margin: 0;
    }

    @font-face {
      font-family: 'NHGDisplay';
      src: url(${NeueHassGroteskDisplayBold}) format("woff");
      font-weight: bold;
      font-style: normal;
    }

    @font-face {
      font-family: 'NHGDisplay';
      src: url(${NeueHassGroteskDisplay}) format("woff");
      font-weight: normal;
      font-style: normal;
    }

    @font-face {
      font-family: 'NHGText';
      src: url(${NeueHassGroteskText}) format("woff");
      font-weight: normal;
      font-style: normal;
    }

    @font-face {
      font-family: 'NHGText';
      src: url(${NeueHassGroteskTextBold}) format("woff");
      font-weight: bold;
      font-style: normal;
    }
  `;
};

export default injectGlobalStyles;
Run Code Online (Sandbox Code Playgroud)