javascript - 如何使用 NextJS 使用自托管字体?

标签 javascript reactjs fonts next.js

使用 NextJS 的字体

我已经阅读了有关如何在 NextJS 中使用自托管字体的不同主题。

当我这样做时,我得到了 [ wait ] compiling ...:

@font-face {
    font-family: 'montserrat';
    src: url('./mypath/Montserrat-Medium.woff2') format('woff2'),
        url('./mypath/Montserrat-Medium.woff') format('woff'),
        url('./mypath/Montserrat-Medium.ttf') format('truetype'),
        url('./mypath/Montserrat-Medium.svg#Montserrat-Medium') format('svg');
}

没有错误,或者只是编译......我读过( stackoverflow/57590195 )它说我们应该使用静态路径,如
@font-face {
    font-family: 'font';
    src: url('./static/fonts/Montserrat-Medium.woff2') format('woff2');
}

但该解决方案根本不起作用。它几乎似乎工作正常,因为错误(或令人信服的等待)停止了。
但是,如果您仔细观察,您的字体未加载。

然后我尝试了fontfaceobserver,我很快就明白问题会是一样的。因为您必须使用 font-face 而不能将其与 NextJS 一起使用。

下载下一个字体后,我阅读了文档并查看了 the github exemples

这是我受他们启发的 next.config.js
const withSass = require('@zeit/next-sass');
const withCSS = require("@zeit/next-css");
const withFonts = require('next-fonts');

module.exports = withFonts(
    withCSS(
        withSass({
            enableSvg: true,
            webpack(config, options) {
                config.module.rules.push({
                    test: /\.(png|jpg|gif|svg|eot|ttf|woff|woff2)$/,
                    use: {
                        loader: 'url-loader',
                        options: {
                            limit: 100000
                        }
                    }
                });
                return config;
            }
        })
    )
);

我的字体 public/static/fonts 的路径。

这就是我尝试使用它的方式。
...
function MainIndex() {
    ...
    return (
        <>
        ...
        <style jsx>{`
                @font-face {
                    font-family: 'Montserrat';
                    src: url('./static/fonts/Montserrat-Medium.ttf');
                }
                h1 {
                    font-family: 'Montserrat';
                }
        `}</style>
        </>
    )
}
...

我找到的解决方案
  • https://github.com/bramstein/fontfaceobserver 456 KB
  • https://github.com/rohanray/next-fonts 1.89 MB
  • dangerouslySetInnerHTML 可以工作,但不是最好的
    我猜的解决方案。 (我没试过)
  • ✗ url('./static/fonts/font.woff2')

  • Read more one the github issue

    编辑:

    我试图适应什么 Jesper We did

    我创建了 /public/static/fonts/fonts.css/public/fonts/allMyfont.ttf 然后我导入 _var.scss 以将其与 sass 变量 @import "/public/static/fonts/fonts.css"; 一起使用导入 style.scss my var $font 并将“my/path/style.scss”导入我的 index.js(永远编译)

    在我尝试了一种更接近的方法后,我的字体仍然在 /public/static/fonts/fonts.css 相同的文件夹中。然后在我的 index.js 中。但是那个什么都不做。

    这里是现场CodeSandBox中的代码

    最佳答案

    这是我通常做的:

  • 将字体放在公共(public)/静态的某个地方
  • 在与字体相同的文件夹中,放置一个 CSS 文件,其中声明了字体

  • CSS 文件示例 /public/fonts/style.css :
    @font-face {
        font-family: 'Italian No1';
        src: url('ItalianNo1-Black.eot');
        src: url('ItalianNo1-Black.eot?#iefix') format('embedded-opentype'), url('ItalianNo1-Black.woff2') format('woff2'), url('ItalianNo1-Black.woff') format('woff');
        font-weight: 900;
        font-style: normal;
    }
    
    [更新] 对于 NextJS 的最新版本,导入 CSS 文件的正确位置是 import _app.js 中的声明 (See docs) .

    较旧的答案:
    将此css导入_document.js (docs):
    render() {
        return (
            <Html>
                <Head>
                    <link href="/fonts/style.css" rel="stylesheet"/>
                </Head>
    
                <body>
                    <Main/>
                    <NextScript/>
                </body>
            </Html>
        )
    }
    

    关于javascript - 如何使用 NextJS 使用自托管字体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61909298/

    相关文章:

    javascript - 值,否则抛出异常

    javascript - jsPDF 基本实现

    javascript - React 内联样式不会影响我的自定义组件

    javascript - React 收集表单属性并提交

    javascript - 对齐 jQuery 列表

    javascript - 如何从 PHP 运行 if 语句来运行 JS 函数

    node.js - 异步/等待不等待

    html - 具有不同颜色轮廓的字体,用于网络

    python - python导入excel文件并识别内容有删除线的单元格

    html - Google 字体无法在 iPhone 设备上运行